Secrets Manager でシークレットを更新しても AWS CloudFormation のシークレットが自動的に更新されないのはなぜですか。

最終更新日: 2022 年 4 月 26 日

AWS Secrets Manager でシークレットを更新しましたが、AWS CloudFormation スタックの更新中に動的参照は更新されませんでした。

簡単な説明

Secrets Manager でシークレットを更新しても、CloudFormation はシークレットの値が変更されたことを自動的に検出しません。スタックの更新中は、CloudFormation は動的参照自体に変更が加えられない限り、動的参照の値を取得しません。

Secrets Manager でシークレットを更新した後、CloudFormation スタックを更新し、動的参照文字列で VersionId を指定する必要があります。CloudFormation がシークレットの更新バージョンを確実に取得するために、VersionId を指定することをお勧めします。

解決方法

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

以下のシナリオの例では、CloudFormation で Secrets Manager の動的参照を更新する方法を示しています。

1.    CloudFormation テンプレートで Secrets Manager のシークレットを動的に参照します。

例えば、次の CloudFormation テンプレートは、secret-id が mysecret で、secret-string が {\"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 でシークレットを更新し、secret-string を指定します。シナリオの例では、secret-string は {\"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 を指定する必要がないため空白のままです。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?