我在 AAWS 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 範本會動態參考 Secrets Manager 密碼 (secret-id mysecret 和 secret-string {"MyKey":"MyValue"}):
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。