我想创建一个SecretsManager机密,并同时生成两个值。这可能吗,我该怎么办?
例如,如果我希望最终的秘密在JSON中看起来像这样,那么CloudFormation yaml是什么样的?
{
"password": "<Generated Value>",
"serviceId": "fd07f2ab-96bd-4c5c-a4a9-9b8c43b666d7",
"login": "<Different Generated Value>"
}
如果这是CF模板的一部分,该CF模板生成了秘密字符串的密码部分,那么我还将如何生成动态的“登录”字段?
#This is a Secret resource with a randomly generated password in its SecretString JSON.
MySecretA:
Type: 'AWS::SecretsManager::Secret'
Properties:
Name: MySecretForAppA
Description: "This secret has a dynamically generated secret password and login."
GenerateSecretString:
SecretStringTemplate: '{"service-id": "<some guid>"}'
GenerateStringKey: "password"
PasswordLength: 30
ExcludeCharacters: '"@/\'
答案 0 :(得分:2)
看来AWS::SecretsManager::Secret
资源仅生成一个秘密。
我找不到通过!Ref
来引用秘密的实际内容的方法,这将允许生成两个秘密,然后将其引用并组合到另一个资源中。唯一可用的!Ref
值是机密的ARN。
因此,我看不到在一个资源中创建两个秘密的方法。
答案 1 :(得分:1)
AWS :: SecretsManager :: Secret资源不支持在单个机密中生成多个随机密钥。今天实现此目标的一种方法是利用自定义CloudFormation资源(请参见https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)。您可以编写一个自定义资源lambda来生成两个随机字符串,并使用新值对机密执行PutSecretValue。
另一个可能的选择是让CloudFormation生成两个秘密(一个用于用户名,一个用于密码)。我不建议您使用这种方法,因为每次需要密钥时,都需要进行两次检索,这会使您的AWS Secrets Manager成本翻倍。
答案 2 :(得分:0)
您可以创建两个秘密,并且只能使用一个。
例如,您可以为密码创建一个:
MySecretPassword:
Type: 'AWS::SecretsManager::Secret'
Properties:
Name: MySecretPasswordForAppA
Description: "This secret has a dynamically generated secret password."
GenerateSecretString:
SecretStringTemplate: '{"serviceId": "<some guid>"}'
GenerateStringKey: "password"
PasswordLength: 30
ExcludeCharacters: '"@/\'
然后另一个创建 login
值,并使用由 MySecretPassword
保护的生成值:
MySecret:
Type: 'AWS::SecretsManager::Secret'
Properties:
Name: MySecretForAppA
Description: "This secret has a dynamically generated secret password and login."
GenerateSecretString:
SecretStringTemplate:
!Join:
- ''
- '{ "password": "'
- !Join:
- ':'
- '{{resolve'
- 'secretsmanager'
- !Ref: MySecretPassword
- 'SecretString'
- 'password}}'
- '", "service-id": "'
- !Join:
- ':'
- '{{resolve'
- 'secretsmanager'
- !Ref: MySecretPassword
- 'SecretString'
- 'serviceId}}'
- '" }'
GenerateStringKey: "login"
PasswordLength: 30
ExcludeCharacters: '"@/\'