获取 Secrets Manager 中的密钥或密钥值 - AWS CloudFormation

获取 Secrets Manager 中的密钥或密钥值

Secrets Manager 是一项便于您安全存储和管理密钥的服务,例如数据库凭证、密码和第三方 API 密钥等。使用 Secrets Manager,您可以集中存储和控制对这些密钥的访问,以便使用对 Secrets Manager 的 API 调用来替换代码中的硬编码凭证(包括密码),以编程方式检索密钥。有关更多信息,请参阅《AWS Secrets Manager 用户指南》中的什么是 AWS 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 自动轮换受保护服务或数据库的密钥。有关更多信息,请参阅轮换 AWS 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。

要访问您的 AWS 账户中的密钥,只需指定密钥名称即可。要访问其他 AWS 账户中的密钥,请指定密钥的完整 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 示例检索在 MySecret 密钥中存储的用户名和密码值。检索的密钥版本是版本阶段值为 AWSCURRENT 的版本。

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::::}}

从密钥的特定版本中检索值

以下动态引用检索 MySecretAWSPREVIOUS 版本的 password 值。

{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}

从另一个 AWS 账户检索密钥

以下动态引用检索另一个 AWS 账户中的 MySecretSecretString。您必须指定完整的密钥 ARN 才能访问其他 AWS 账户中的密钥。

{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}

以下动态引用检索另一个 AWS 账户中的 MySecretpassword 值。您必须指定完整的密钥 ARN 才能访问其他 AWS 账户中的密钥。

{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}