AWS - Redshift CloudFormation - Восстановление SnapShot - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий скрипт Cloudformation Script:

#RedshiftSpectrum Role
  RedshiftSpectrumRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: Redshift Role
      Description: 'Role for Redshift Spectrum'
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - redshift.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: RedshiftSpectrumAccess
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: Statement1
                Effect: Allow
                Action:
                  - 's3:Get*'
                  - 's3:List*'
                  - 'athena:*'
                  - 'glue:*'
                  - 'kms:List*'
                Resource: '*'

#Create a Redshift Cluster
  RedshiftCluster: 
    Type: "AWS::Redshift::Cluster"
    Properties:
      SnapshotIdentifier: !If [ SnapshotIdentifierCheck, !Ref 'AWS::NoValue', !Ref RedshiftSnapshotIdentifier ] 
      DBName: !Join ['', ['{{resolve:secretsmanager:', !Ref RedshiftSecretManager, ':SecretString:dbName}}' ]]
      MasterUsername: !Join ['', ['{{resolve:secretsmanager:', !Ref RedshiftSecretManager, ':SecretString:username}}' ]]
      MasterUserPassword: !Join ['', ['{{resolve:secretsmanager:', !Ref RedshiftSecretManager, ':SecretString:password}}' ]]
      NodeType: !Ref 'RedshiftNodeType'
      ClusterType: !If [ SingleNode, single-node, multi-node ]  
      NumberOfNodes: !If [ SingleNode, !Ref 'AWS::NoValue', !Ref RedshiftNodeCount ] 
      ClusterIdentifier: !Ref 'RedshiftClusterIdentifier' 
      ClusterSubnetGroupName: !Ref RedshiftClusterSubnetGroup
      IamRoles: 
        - !GetAtt RedshiftSpectrumRole.Arn
      PubliclyAccessible: 'false'
      VpcSecurityGroupIds: 
        - !Ref RedshiftVPCSecurityGroup

#AWS Secret Manager to store Redshift Credentials - Username and Password      
  RedshiftSecretManager:
    Type: AWS::SecretsManager::Secret
    Properties:
      Description: 'Secret Manager for Redshift Cluster'
      Name: 'Redshift-Credentials'
      GenerateSecretString:
        SecretStringTemplate: !Join
            - ''
            - - '{'
              - '"username":' 
              - '"'
              - !Ref RedshiftUserName
              - '"'
              - ","
              - '"dbName":' 
              - '"'
              - !Ref RedshiftDBName
              - '"'
              - ","
              - '"copyCommandRole":' 
              - '"'
              - !Sub arn:aws:iam::${AWS::AccountId}:role/redshift-s3-role
              - '"'
              - '}'
        GenerateStringKey: 'password'
        PasswordLength: 9
        ExcludeCharacters: '"@/\'



  SecretRedshiftInstanceAttachment:
    Type: AWS::SecretsManager::SecretTargetAttachment
    Properties:
      SecretId: !Ref RedshiftSecretManager
      TargetId: !Ref RedshiftCluster
      TargetType: AWS::Redshift::Cluster

Сценарий выполняет следующую задачу:

  • Создание кластера Redshift из снимка (см. SnapshotIdentifier: ! Если [SnapshotIdentifierCheck,! Ref 'AWS :: NoValue',! Ref RedshiftSnapshotIdentifier])

  • Создать Secret Manager и Vault и сохранить учетные данные для этого

Сомнения и проблемы:

  • Secret Manager имеет дополнительное поле dbname, которое содержит dbname снимка (пример: mydb), тогда как я дал dbName, который указывает на новый dbName, который я хочу для моего кластера (пример: демо), откуда поступает дополнительное поле? Пожалуйста, обратитесь к снимку ниже: enter image description here
  • Secret Manager заполняет другие данные правильно, такие как имя пользователя и пароль, но когда я пытаюсь соединиться с новыми учетными данными, это выдает мне ошибку password authentication failed for user , но когда я пытаюсь использовать учетные данные (называемые старыми учетными данными) исходного кластера, который использовался для создания моментального снимка, я получаю доступ к кластеру. Означает ли это, что вы не можете изменить имя пользователя и пароль для кластера из CloudFormation при восстановлении из моментального снимка?
  • Когда я получаю доступ к кластеру со старыми учетными данными, но новыми dbName (демонстрация) это дает мне ошибку database does not exist Означает ли это, что вы не можете изменить базу данных для кластера из CloudFormation при восстановлении из моментального снимка?
  • Я также создал роль для Redshift, которая содержит необходимые разрешения для Athena, Glue и S3 и подключен к моему новому кластеру, когда я пытаюсь подключиться к кластеру со всеми старыми данными. Имя БД, имя пользователя и пароль, я могу подключиться успешно, но когда я пытаюсь выполнить запрос как select * from schemaname.tablename, это дает мне ошибку Invalid operation: User arn:aws:redshift:ap-south-1:xxxxxxx:dbuser:demo/myuser is not authorized to assume IAM Role arn:aws:iam::xxxxxx:role/role_1 IAM Role=arn:aws:iam::xxxx:role/role_2 эти две роли (role_1 и role_2 прикреплены к моему исходному кластеру). Я не могу понять эту проблему.

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