为什么在 Secrets Manager 中更新密钥不会自动更新 AWS CloudFormation 中的密钥?

上次更新日期:2022 年 4 月 26 日

我在 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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?