Creé una pila de formación en la nube con un clúster de corrimiento al rojo y un usuario maestro: testuser
"RedshiftCluster" : { "IamRoles" : [ { "Fn::GetAtt": [ "IAMInstanceRole", "Arn" ] } ] ... other configurationsUtiliza el siguiente rol de IAM (IAMInstanceRole) que se encuentra en estado sincronizado y el clúster de redshift está en funcionamiento:
"IAMInstanceRole": { "Properties": { "RoleName": "test-iam-role", "AssumeRolePolicyDocument": { "Statement": [ { "Action": [ "sts:AssumeRole" ], "Effect": "Allow", "Principal": { "Service": [ "ec2.amazonaws.com", "redshift.amazonaws.com", "s3.amazonaws.com" ] } } ] }, "Path": "/", "Policies": [ { "PolicyName": "root", "PolicyDocument": { "Version" : "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] } } ] }Estoy tratando de cargar el archivo csv de s3 a redshift usando el comando de copia e iam_role como credencial. El iam_role tiene el arn de IAMInstanceRole (declarado arriba). Cada vez que ejecuto el siguiente comando:
copy test_table from 's3://test-bucket/test.csv' CREDENTIALS 'aws_iam_role=arn:aws:iam::<account-id>:role/test-iam-role' MAXERROR 100000 removequotes TRIMBLANKS emptyasnull blanksasnull delimiter '|';me sale el error:
ERROR: User arn:aws:redshift:us-west-2:189675173661:dbuser:automated-data-sanity-redshiftcluster-fbp9fgls6lri/sanityuser is not authorized to assume IAM Role arn:aws:iam::189675173661:role/sanity-test-iam-instance-role DETAIL: ----------------------------------------------- error: User arn:aws:redshift:us-west-2:<account-id>:dbuser:test-redshiftcluster-fbp9fgls6lri/testuser is not authorized to assume IAM Role arn:aws:iam::<account-id>:role/test-iam-role code: 8001 context: IAM Role=arn:aws:iam::<account-id>:role/test-iam-role query: 1139 location: xen_aws_credentials_mgr.cpp:236 process: padbmaster [pid=29280] -----------------------------------------------Por favor sugiera alguna resolución.
Me encontré con el mismo problema, pero después de una buena hora de resolución de problemas, me di cuenta de que no había podido agregar el rol de Redshift al clúster mientras lo creaba. Si selecciona el clúster de Redshift, elija el menú desplegable en 'Acciones' y seleccione 'Administrar roles de IAM' desde allí, podrá adjuntar el rol de Redshift que haya creado para este clúster.
Eso resolvió el problema para mí, de todos modos. Espero que esto ayude.
¡Resolví este problema! De forma predeterminada, los roles de IAM que están disponibles para un clúster de Amazon Redshift están disponibles para todos los usuarios de ese clúster. Puede optar por restringir las funciones de IAM a usuarios específicos de la base de datos de Amazon Redshift en clústeres o regiones específicos.
Para permitir que solo usuarios específicos de la base de datos utilicen un rol de IAM, realice los siguientes pasos.
Para identificar usuarios de bases de datos específicos con acceso a un rol de IAM
Identifique el Nombre de recurso de Amazon (ARN) para los usuarios de la base de datos en su clúster de Amazon Redshift. El ARN para un usuario de la base de datos tiene el formato: arn:aws:redshift:region:account-id:dbuser:cluster-name/user-name.
Abra la consola de IAM en url="https://console.aws.amazon.com/.
En el panel de navegación, elija Roles.
Elija el rol de IAM que desea restringir a usuarios específicos de la base de datos de Amazon Redshift.
Elija la pestaña Relaciones de confianza y luego elija Editar relación de confianza. Un nuevo rol de IAM que permite a Amazon Redshift acceder a otros servicios de AWS en su nombre tiene una relación de confianza de la siguiente manera:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Por ejemplo, la siguiente relación de confianza especifica que solo los usuarios de la base de datos user1 y user2 en el clúster my-cluster en la región us-west-2 tienen permiso para usar este rol de IAM.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": [ "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user1", "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user2" ] } } }] }7.Elija Actualizar política de confianza.
Aquí hay una plantilla que funciona bien:
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "RedshiftRole": { "Type": "AWS::IAM::Role", "Properties": { "RoleName": "Redshift-Role", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }, "Path": "/", "Policies": [ { "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] } } ] } }, "RedshiftSG": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupName": "Redshift Security Group", "GroupDescription": "Enable access to redshift", "VpcId": "vpc-11223344", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 5439, "ToPort": 5439, "CidrIp": "0.0.0.0/0" } ], "Tags": [ { "Key": "Name", "Value": "Redshift Security Group" } ] } }, "RedshiftCluster": { "Type": "AWS::Redshift::Cluster", "Properties": { "ClusterType": "single-node", "NodeType": "dc2.large", "MasterUsername": "master", "MasterUserPassword": "YourPassword", "IamRoles": [ { "Fn::GetAtt": [ "RedshiftRole", "Arn" ] } ], "VpcSecurityGroupIds": [ { "Ref": "RedshiftSG" } ], "PubliclyAccessible": true, "Port": 5439, "DBName": "foo" } } } } Asegúrese de insertar su propio VpcId en el grupo de seguridad.
El Rol puede ser asumido por Redshift y otorga acceso a s3:* (que debe reducir su alcance).