CloudFormation SecretTargetAttachment возвращает SecretString не является допустимым JSON - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь создать простой стек CloudFormation, но он не работает. Вот мой шаблон CloudFormation.

Resources:
  MyDBSecrets:
    Type: AWS::SecretsManager::Secret
    Properties: 
      Description: 'This is password of mysql database'
      GenerateSecretString:
        PasswordLength: 16
        ExcludePunctuation: true
      Name: MyDBSecrets
  MyDBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyDBInstance
      AllocatedStorage: '20'
      DBInstanceClass: db.t3.micro
      Engine: mysql
      MasterUsername: 'testdb'
      MasterUserPassword: !Join ['', ['{{resolve:secretsmanager:', !Ref MyDBSecrets, ':SecretString}}' ]]
  SecretRDSInstanceAttachment:
    Type: "AWS::SecretsManager::SecretTargetAttachment"
    Properties:
      SecretId: !Ref MyDBSecrets
      TargetId: !Ref MyDBInstance
      TargetType: AWS::RDS::DBInstance

При создании стека я вижу, что мой защищенный ресурс создан, мой экземпляр RDS также создается, но в SecretTargetAttachment я получаю CREATE_FAILED with 'SecretString is not valid JSON' ошибку. Я что-то упустил?

Ответы [ 2 ]

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

Я нашел решение моей проблемы, оно не было простым.Я связался со службой поддержки AWS, и они помогли мне решить ее.Служба поддержки AWS рекомендовала использовать макросы для пользовательской обработки шаблона.

Шаг 1: Macro.yml

    AWSTemplateFormatVersion: 2010-09-09
Resources:
  TransformExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: [lambda.amazonaws.com]
            Action: ['sts:AssumeRole']
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: ['logs:*']
                Resource: 'arn:aws:logs:*:*:*'
              - Effect: Allow
                Action: ['s3:*']
                Resource: '*'
  TransformFunction:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
            import traceback
            def handler(event, context):
                response = {
                    "requestId": event["requestId"],
                    "status": "success"
                }
                try:
                    paramPassword= event["params"]["paramPassword"]
                    Description= event["fragment"]["Description"]
                    Name= event["fragment"]["Name"]
                    print(event)
                    print("starting macro execution")
                    fragment = {}
                    fragment['Name'] = Name
                    fragment['Description'] = Description
                    if paramPassword == "":
                      fragment['GenerateSecretString'] = {}
                      fragment['GenerateSecretString']['PasswordLength'] = 16
                      fragment['GenerateSecretString']['ExcludePunctuation'] = 'true'
                    else:
                      fragment['SecretString'] = {}
                      fragment['SecretString']['Ref'] = "paramPassword"
                    print(fragment)
                    response["fragment"] = fragment
                    print(response)
                except Exception:
                    traceback.print_exc()
                    response["status"] = "failure"
                    macro_response["errorMessage"] = str(e)
                return response
      Handler: index.handler
      Runtime: python3.6
      Role: !GetAtt TransformExecutionRole.Arn
  TransformFunctionPermissions:
    Type: AWS::Lambda::Permission
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !GetAtt TransformFunction.Arn
      Principal: 'cloudformation.amazonaws.com'
  Transform:
    Type: AWS::CloudFormation::Macro
    Properties:
      Name: 'SecretManager'
      Description: To check for secret's default value and conditionally create secret
      FunctionName: !GetAtt TransformFunction.Arn

Шаг 2: template.yml

Parameters:
  paramPassword:
    Type: String
    Default: test
    Description: Enter the default value of SecretString
Resources:
  LambdaIAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 's3:*'
                Resource: '*'
              - Effect: Allow
                Action:
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                  - 'logs:PutLogEvents'
                Resource: 'arn:aws:logs:*:*:*'
Resources:
  TestSecrets:
    Type: AWS::SecretsManager::Secret
    Properties:    
      'Fn::Transform':
            - Name: SecretManager
              Parameters:
                paramPassword: !Ref paramPassword
      Description: 'This is my password'
      Name: 'my-secret-password2'
0 голосов
/ 17 июня 2019

Шаблон ссылок для Секретов диспетчера секретов, сегмент ссылочного ключа состоит из нескольких сегментов, включая секретный идентификатор, секретный ключ значения, этап версии и идентификатор версии.

Использованиеследующий шаблон: {{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}

секретный идентификатор : имя или имя ресурса Amazon (ARN), которое служит уникальным идентификатором секрета. Доступ к секрету в учетной записи AWSВам нужно только указать секретное имя.Чтобы получить доступ к секрету в другой учетной записи AWS, укажите полный ARN секретного. Требуется.

secret-string : В настоящее время единственным поддерживаемым значением является SecretString.По умолчанию это SecretString.

json-key : указывает имя ключа пары ключ-значение, значение которого вы хотите получить.Если вы не укажете json-ключ, CloudFormation извлекает весь секретный текст. Этот сегмент может не включать двоеточие (:).

version-stage : указывает секретную версию, которую выхотите получить с помощью промежуточной метки, прикрепленной к версии. Промежуточные метки используются для отслеживания различных версий в процессе ротации.Если вы используете version-stage, тогда не указывайте version-id.Если вы не укажете ни этап стадии, ни идентификатор отклонения, то по умолчанию используется выбор версии со значением этапа версии AWSCURRENT. Этот сегмент может не содержать двоеточие (:).

version-id : Указывает уникальный идентификатор версии секрета, который вы хотите использовать в операциях со стеком. Если вы укажете version-id, то не указывайте version-stage.Если вы не укажете ни стадию версии, ни идентификатор версии, то по умолчанию используется для извлечения версии со значением стадии версии AWSCURRENT. Этот сегмент может не содержать двоеточия (:).

Для получения дополнительной информациииди сюда .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...