У меня есть следующий скрипт 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
, который я хочу для моего кластера (пример: демо), откуда поступает дополнительное поле? Пожалуйста, обратитесь к снимку ниже: - 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 прикреплены к моему исходному кластеру). Я не могу понять эту проблему.
Было бы здорово, если бы кто-то мог помочь мне понять это поведение.