Секрет AWS вращается при обновлении стека в Cloudformation - PullRequest
0 голосов
/ 12 июня 2019

У меня есть скрипт 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

1 Ответ

0 голосов
/ 12 июня 2019

Вам необходимо разделить базу данных и конфигурацию базы данных в отдельном стеке. Вы не будете часто обновлять инфраструктуру базы данных и пароль базы данных, в то время как ваш код будет постоянно изменяться. Ваши службы ECS могут ссылаться на ваш пароль из другого стека, используя Fn :: ImportValue. Проверьте документы здесь:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

...