获取 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
以下动态引用检索
的 MySecret
SecretString
。
{{resolve:secretsmanager:
MySecret
}}
或者:
{{resolve:secretsmanager:
MySecret
::::}}
从密钥的特定版本中检索值
以下动态引用检索
的 MySecret
版本的 AWSPREVIOUS
值。password
{{resolve:secretsmanager:
MySecret
:SecretString:password
:AWSPREVIOUS
}}
从另一个 AWS 账户检索密钥
以下动态引用检索另一个 AWS 账户中的
的 MySecret
SecretString
。您必须指定完整的密钥 ARN 才能访问其他 AWS 账户中的密钥。
{{resolve:secretsmanager:
arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret
}}
以下动态引用检索另一个 AWS 账户中的
的 MySecret
值。您必须指定完整的密钥 ARN 才能访问其他 AWS 账户中的密钥。password
{{resolve:secretsmanager:
arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret
:SecretString:password
}}