获取 Secrets Manager 中的密钥或密钥值
Secrets Manager 是一项便于您安全存储和管理密钥的服务,例如数据库凭证、密码和第三方 API 密钥等。使用 Secrets Manager,您可以集中存储和控制对这些密钥的访问,以便使用对 Secrets Manager 的 API 调用来替换代码中的硬编码凭证(包括密码),以编程方式检索密钥。有关更多信息,请参阅《Amazon Secrets Manager 用户指南》中的什么是 Amazon Secrets Manager?。
要在 CloudFormation 模板中使用 Secrets Manager 中存储的全部密钥或密钥值,请使用 secretsmanager 动态引用。
最佳实践
在 CloudFormation 模板中使用 Secrets Manager 动态引用时,请遵循以下最佳实践:
-
对 CloudFormation 模板使用无版本引用:将凭证存储在 Secrets Manager 中并使用动态引用而不指定
version-stage或version-id参数,以支持正确的密钥轮换工作流程。 -
利用自动轮换:使用 Secrets Manager 的自动轮换功能,结合无版本动态引用进行凭证管理。这可以确保您的凭证得到定期更新,而无需更改模板。有关更多信息,请参阅轮换 Amazon Secrets Manager 密钥。
-
谨慎使用带版本引用:仅为测试或回滚等特定场景指定显式的
version-stage或version-id参数。
注意事项
使用 secretsmanager 动态引用时,需要记住以下重要注意事项:
-
CloudFormation 不会追踪之前的部署中使用了哪个版本的密钥。在实现动态引用之前,请认真规划您的密钥管理策略。尽量使用无版本引用,以利用自动密钥轮换功能。在更改动态引用配置时(例如从无版本动态引用改换为带版本动态引用,反之亦然)时,监控和验证资源更新。
-
仅更新 Secrets Manager 中的密钥值不会自动触发 CloudFormation 检索新值。CloudFormation 仅在创建或更新资源修改包含动态引用的资源时检索密钥值。
例如,假设您的模板包含 AWS::RDS::DBInstance 资源,其中
MasterPassword属性设置为 Secrets Manager 动态引用。使用此模板创建堆栈后,需要在 Secrets Manager 中更新密钥值。但是,MasterPassword属性保留了旧密码值。要应用新密钥值,需修改 CloudFormation 模板中的
AWS::RDS::DBInstance资源并执行堆栈更新。为避免将来执行这种手动过程,可考虑使用 Secrets Manager 自动轮换密钥。
-
自定义资源中目前不支持对安全值的动态引用,例如
secretsmanager。 -
secretsmanager动态引用可用于所有资源属性。使用secretsmanager动态引用表示 Secrets Manager 和 CloudFormation 日志均不应保留任何已解析的密钥值。但是,密钥值可能会显示在正在其资源中使用的服务中。检查您的使用情况,以避免泄露密钥数据。
权限
要指定存储在 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 版本且支持 Secrets Manager 轮换工作流程,而无需更改模板。
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}}