获取 Secrets Manager 中的密钥或密钥值
Secrets Manager 是一项便于您安全存储和管理密钥的服务,例如数据库凭证、密码和第三方 API 密钥等。使用 Secrets Manager,您可以集中存储和控制对这些密钥的访问,以便使用对 Secrets Manager 的 API 调用来替换代码中的硬编码凭证(包括密码),以编程方式检索密钥。有关更多信息,请参阅《Amazon Secrets Manager 用户指南》中的什么是 Amazon Secrets Manager?。
要在 CloudFormation 模板中使用 Secrets Manager 中存储的全部密钥或密钥值,请使用 secretsmanager 动态引用。
注意事项
使用 secretsmanager 动态引用时,需要记住几个重要的安全注意事项:
-
secretsmanager动态引用可用于所有资源属性。使用secretsmanager动态引用表示 Secrets Manager 和 CloudFormation 日志均不应保留任何已解析的密钥值。但是,密钥值可能会显示在正在其资源中使用的服务中。检查您的使用情况,以避免泄露密钥数据。 -
在 Secrets Manager 中更新密钥不会自动更新 CloudFormation 中的密钥。为了让 CloudFormation 更新
secretsmanager动态引用,您必须通过更新包含secretsmanager动态引用的资源属性或更新资源的另一个属性来执行堆栈更新,从而更新包含动态引用的资源。例如,假设您在模板中将 AWS::RDS::DBInstance 资源的
MasterPassword属性指定为secretsmanager动态引用,然后基于该模板创建堆栈。您稍后在 Secret Manager 中更新该密钥的值,但不更新模板中的AWS::RDS::DBInstance资源。在这种情况下,即使您执行堆栈更新,MasterPassword属性中的密钥值也不会更新,并保持之前的密钥值。此外,请考虑使用 Secrets Manager 自动轮换受保护服务或数据库的密钥。有关更多信息,请参阅轮换 Amazon Secrets Manager 密钥。
-
自定义资源中目前不支持对安全值的动态引用,例如
secretsmanager。
权限
要指定存储在 Secrets Manager 中的密钥,您必须有权为该密钥调用 GetSecretValue。
引用模式
要在 CloudFormation 模板中引用 Secrets Manager 密钥,请使用以下 secretsmanager 引用模式。
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
secret-id-
密钥的名称或 ARN。
要访问您的 Amazon Web Services 账户中的密钥,只需指定密钥名称即可。要访问其他 Amazon Web Services 账户中的密钥,请指定密钥的完整 ARN。
必需。
secret-string-
SecretString是唯一受支持的值。默认值为SecretString。 json-key-
要检索其值的键值对的键名称。如果您不指定
json-key,CloudFormation 会检索整个密钥文本。此分段不得包含冒号字符 (
:)。 version-stage-
要使用的密钥版本的暂存标签。Secrets Manager 在轮换过程中使用暂存标注来跟踪不同的版本。如果您使用
version-stage,则不要指定version-id。如果您既未指定version-stage,也未指定version-id,则原定设置将为AWSCURRENT版本。此分段不得包含冒号字符 (
:)。 version-id-
要使用的密钥版本的唯一标识符。如果指定
version-id,则不要指定version-stage。如果您既未指定version-stage,也未指定version-id,则原定设置将为AWSCURRENT版本。此分段不得包含冒号字符 (
:)。
示例
从密钥中检索用户名和密码值
以下 AWS::RDS::DBInstance 示例检索在 密钥中存储的用户名和密码值。检索的密钥版本是版本阶段值为 MySecretAWSCURRENT 的版本。
JSON
{ "MyRDSInstance": { "Type": "AWS::RDS::DBInstance", "Properties": { "DBName": "MyRDSInstance", "AllocatedStorage": "20", "DBInstanceClass": "db.t2.micro", "Engine": "mysql", "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}", "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}" } } }
YAML
MyRDSInstance: Type: 'AWS::RDS::DBInstance' Properties: DBName: MyRDSInstance AllocatedStorage: '20' DBInstanceClass: db.t2.micro Engine: mysql MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}' MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
检索整个 SecretString
以下动态引用检索 的 MySecretSecretString。
{{resolve:secretsmanager:MySecret}}
或者:
{{resolve:secretsmanager:MySecret::::}}
从密钥的特定版本中检索值
以下动态引用检索 的 MySecret 版本的 AWSPREVIOUS 值。password
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
从另一个 Amazon Web Services 账户检索密钥
以下动态引用检索另一个 Amazon Web Services 账户中的 的 MySecretSecretString。您必须指定完整的密钥 ARN 才能访问其他 Amazon Web Services 账户中的密钥。
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
以下动态引用检索另一个 Amazon Web Services 账户中的 的 MySecret 值。您必须指定完整的密钥 ARN 才能访问其他 Amazon Web Services 账户中的密钥。password
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}