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 を指定する必要がないため空白のままです。