使用 CloudFormation 读取机密
Reading a secret using CloudFormation
我正在尝试在 CloudFormation 中创建一个 AWS 堆栈,在 JSON.
中有一个秘密
我不想在参数中显示机密值,也不想让我的实例(fargate 或 ec2)访问机密管理器。我希望 CloudFormation 从机密管理器检索值并在运行时将其注入模板。
这是我做的:
创建密文
使用 Designer 创建模板
读取机密并创建资源。在这种情况下,我正在创建一个桶,该桶将秘密作为标签。我知道这不安全,但该存储桶仅用作概念验证。
验证存储桶是否包含带有秘密的标签
这是我的模板:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "create a single S3 bucket",
"Resources": {
"SampleBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "asantostestbucket",
"Tags" : [
{
"Key" : "keyname",
"Value" : "{{resolve:secretsmanager:dev/learning:SecretString:hello}}"
}
]
}
}
}
}
这是给我的错误 One or more tags are not valid
。
我如何向 CloudFormation 指示我希望它读取机密,而不是尝试将标签读取为文本?换句话说,用值替换“{{resolve:secretsmanager:dev/learning:SecretString:hello}}”,而不是将其作为文本读取。
为了重现这种情况,我做了以下操作:
- 在 Secrets Manager 中,创建了一个新的 secret
- "Other type of secrets"
- 键:
hello
- 值:
surprise
- 密文名称:
dev/learning
- 使用 AWS CLI 测试了密钥
这是输出:
aws secretsmanager get-secret-value --secret-id dev/learning
{
"ARN": "arn:aws:secretsmanager:ap-southeast-2:123456789012:secret:dev/learning-kCxSK3",
"Name": "dev/learning",
"VersionId": "...",
"SecretString": "{\"hello\":\"surprise\"}",
"VersionStages": [
"AWSCURRENT"
],
"CreatedDate": 1560925072.106
}
- 启动了您在上面提供的 CloudFormation 模板(但使用不同的存储桶名称)
结果:收到消息One or more tags are not valid
所以,我得到了和你一样的结果。
然后我尝试使用秘密创建不同类型的资源:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"SecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "{{resolve:secretsmanager:dev/learning:SecretString:hello}}"
}
}
}
}
这成功了:
aws ec2 describe-security-groups --group-id sg-03cfd71f4539a4b7e
{
"SecurityGroups": [
{
"Description": "surprise",
...
因此,{{resolve}}
似乎表现正确,但出于某种原因,S3 标签不喜欢它。
底线:可以,但不可取。
顺便说一下,您可以尝试使用 cloudkast,而不是使用设计器(使用起来有点麻烦),这是一个在线 cloudformation 模板生成器。
我正在尝试在 CloudFormation 中创建一个 AWS 堆栈,在 JSON.
中有一个秘密我不想在参数中显示机密值,也不想让我的实例(fargate 或 ec2)访问机密管理器。我希望 CloudFormation 从机密管理器检索值并在运行时将其注入模板。
这是我做的:
创建密文
使用 Designer 创建模板
读取机密并创建资源。在这种情况下,我正在创建一个桶,该桶将秘密作为标签。我知道这不安全,但该存储桶仅用作概念验证。
验证存储桶是否包含带有秘密的标签
这是我的模板:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "create a single S3 bucket",
"Resources": {
"SampleBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "asantostestbucket",
"Tags" : [
{
"Key" : "keyname",
"Value" : "{{resolve:secretsmanager:dev/learning:SecretString:hello}}"
}
]
}
}
}
}
这是给我的错误 One or more tags are not valid
。
我如何向 CloudFormation 指示我希望它读取机密,而不是尝试将标签读取为文本?换句话说,用值替换“{{resolve:secretsmanager:dev/learning:SecretString:hello}}”,而不是将其作为文本读取。
为了重现这种情况,我做了以下操作:
- 在 Secrets Manager 中,创建了一个新的 secret
- "Other type of secrets"
- 键:
hello
- 值:
surprise
- 密文名称:
dev/learning
- 使用 AWS CLI 测试了密钥
这是输出:
aws secretsmanager get-secret-value --secret-id dev/learning
{
"ARN": "arn:aws:secretsmanager:ap-southeast-2:123456789012:secret:dev/learning-kCxSK3",
"Name": "dev/learning",
"VersionId": "...",
"SecretString": "{\"hello\":\"surprise\"}",
"VersionStages": [
"AWSCURRENT"
],
"CreatedDate": 1560925072.106
}
- 启动了您在上面提供的 CloudFormation 模板(但使用不同的存储桶名称)
结果:收到消息One or more tags are not valid
所以,我得到了和你一样的结果。
然后我尝试使用秘密创建不同类型的资源:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"SecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "{{resolve:secretsmanager:dev/learning:SecretString:hello}}"
}
}
}
}
这成功了:
aws ec2 describe-security-groups --group-id sg-03cfd71f4539a4b7e
{
"SecurityGroups": [
{
"Description": "surprise",
...
因此,{{resolve}}
似乎表现正确,但出于某种原因,S3 标签不喜欢它。
底线:可以,但不可取。
顺便说一下,您可以尝试使用 cloudkast,而不是使用设计器(使用起来有点麻烦),这是一个在线 cloudformation 模板生成器。