データベースを作成するスタックなど、いくつかのネストされたスタックを呼び出す Cloudformation スクリプトがあります。最初にシークレット マネージャーでシークレットを作成し、それをデータベース インスタンスでユーザー名とパスワードに使用します。今のところ、自動シークレット ローテーションを有効にしたくありません。
私の問題は、スタックを更新するたびに、データベースに伝播されない新しいシークレットが生成されることです。その後、更新された ECS サービスがデータベースに接続しようとすると、間違ったパスワードが使用されるため、安定することができず、すべてをロールバックする必要があります。
設定していないのにパスワードがローテーションされるのはなぜですか? これを回避する方法はありますか?できない場合、少なくとも変更をデータベースに伝達するために AWS::SecretsManager::SecretTargetAttachment を追加する必要がありますか?
DBSecret:
Type: "AWS::SecretsManager::Secret"
Properties:
Name: !Join ['', [!Ref ProductName, '-', !Ref EnvironmentName, '-', !Ref DBName, '-db-secret']]
Description: Secret to be used for the database
KmsKeyId: !Ref KmsKeyId
GenerateSecretString:
SecretStringTemplate: !Join ['', ['{"username": "', !Ref DBUser , '"}']]
GenerateStringKey: "password"
PasswordLength: 30
ExcludeCharacters: '"@/\'
Tags:
- Key: Name
Value: !Join ['', [!Ref ProductName, '-', !Ref EnvironmentName, '-', !Ref DBName, '-db-secret']]
PostgresDb:
Type: AWS::RDS::DBInstance
Properties:
AllocatedStorage: !Ref DBAllocatedStorage
AutoMinorVersionUpgrade: 'true'
VPCSecurityGroups:
- Ref: SecurityGroup
DBName: !Ref DBName
DBInstanceClass: !Ref DBInstanceClass
DBSubnetGroupName: !Ref DBSubnetGroup
Engine: postgres
EngineVersion: !Ref DBVersion
MasterUsername: !Join ['', ['{{resolve:secretsmanager:', !Ref DBSecret , ':SecretString:username}}']]
MasterUserPassword: !Join ['', ['{{resolve:secretsmanager:', !Ref DBSecret , ':SecretString:password}}']]
MultiAZ: !Ref DBMultiAZ
StorageType: gp2
BackupRetentionPeriod: 7
StorageEncrypted: !Ref DBEncrypted
# Only add the KMS key if the db is going to be encrypted
KmsKeyId: !If [IsEncrypted, !Ref KmsKeyId, !Ref "AWS::NoValue"]
MonitoringInterval: !If [HasEnhancedMonitoring, !Ref DBEnhancedMonitoringInterval, "0"]
MonitoringRoleArn: !If [HasEnhancedMonitoring, !Ref DBMonitoringRoleARN, !Ref "AWS::NoValue"]
Port: 5432
Tags:
- Key: Name
Value: !Ref DBIdentifier