我在 AWS Secrets Manager 中更新了我的密钥,但是动态参考在 AWS CloudFormation 堆栈更新期间没有更新。
简短描述
当您在 Secrets Manager 中更新密钥时,CloudFormation 不会自动检测到密钥的值是否已更改。在堆栈更新期间,除非对动态参考本身进行了更改,否则 CloudFormation 不会检索动态参考的值。
在 Secrets Manager 中更新密钥后,您必须更新 CloudFormation 堆栈,并在动态参考字符串中指定 VersionId。指定 VersionId 是确保 CloudFormation 检索密钥的更新版本的最佳实践。
解决方法
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
以下示例场景演示了如何在 CloudFormation 中更新 Secrets Manager 动态参考。
1. 在 CloudFormation 模板中动态引用 Secrets Manager 密钥。
例如,以下 CloudFormation 模板动态引用一个 secret-id 为 mysecret 且密钥字符串为 {"MyKey":"MyValue"} 的 Secrets Manager 密钥:
Resources:
SG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: '{{resolve:secretsmanager:mysecret:SecretString:MyKey}}'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 8080
ToPort: 8080
CidrIp: 0.0.0.0/0
**注意:**前述动态参考解析为 GroupDescription 属性的 MyValue。
2. 通过 AWS Command Line Interface (AWS CLI) 运行 update-secret 命令,在 Secrets Manager 中更新密钥,然后指定密钥字符串。对于示例场景,密钥字符串为 {"MyKey":"NewValue"}。
**注意:**VersionId 不会显示在 AWS 管理控制台上。如果您通过 AWS 管理控制台更新了密钥,请通过 AWS CLI 运行 get-secret-value 命令来检索 VersionId。
3. 请注意输出中的 VersionId。
示例输出:
$ aws secretsmanager update-secret --secret-id mysecret --secret-string {\"MyKey\":\"NewValue\"}
{
"ARN": "arn:aws:secretsmanager:us-east-1:xxxxxxxxxxxx:secret:mysecret-ABCDeF",
"Name": "mysecret",
"VersionId": "ab01234c-5d67-89ef-01gh-2ijk345l6m78"
}
**注意:**前述输出中的 VersionId "ab01234c-5d67-89ef-01gh-2ijk345l6m78" 不会自动应用于 CloudFormation 堆栈中的动态参考。
4. 更新堆栈并在动态参考字符串中指定 VersionId。例如:
Resources:
SG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: '{{resolve:secretsmanager:mysecret:SecretString:MyKey::ab01234c-5d67-89ef-01gh-2ijk345l6m78}}'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 8080
ToPort: 8080
CidrIp: 0.0.0.0/0
**注意:**在前面的示例模板中,VersionId "ab01234c-5d67-89ef-01gh-2ijk345l6m78" 之前的 :: 是正确的语法。动态参考字符串的这一部分留空,因为不需要指定 version-stage。