Encadeando funções do IAM no Amazon Redshift - Amazon Redshift

Encadeando funções do IAM no Amazon Redshift

Ao anexar uma função ao cluster, o cluster pode assumir essa função para acessar o Amazon S3, o Amazon Athena, o AWS Glue, e o AWS Lambda em seu nome. Se uma função anexada ao cluster não tiver acesso aos recursos necessários, você poderá encadear outra função, possivelmente pertencente a outra conta. O cluster assumirá a função encadeada temporariamente para acessar os dados. Você também pode conceder acesso entre contas com o encadeamento de funções. Cada função em cadeia assume a próxima função na cadeia, até que o cluster assuma a função no final da cadeia. O número máximo de funções do IAM que você pode associar está sujeito a uma cota. Para obter mais informações, consulte a cota "Funções do IAM de cluster para o Amazon Redshift acessar outros serviços da AWS" no Cotas para objetos do Amazon Redshift.

Por exemplo, suponha que a Empresa A deseja acessar dados em um bucket do Amazon S3 que pertence à Empresa B. A Empresa A cria uma função de serviço da AWS para o Amazon Redshift nomeada RoleA e o anexa ao seu cluster. A empresa B cria uma função chamada RoleB que é autorizada a acessar os dados no bucket da empresa B. Para acessar os dados no bucket da empresa B, a empresa A executa um comando COPY usando um parâmetro iam_role que encadeia RoleA e RoleB. Durante a operação COPY, RoleA assume temporariamente RoleB para acessar o bucket do Amazon S3.

Para encadear funções, você estabelece uma relação de confiança entre as funções. Uma função que assume uma outra função (por exemplo, RoleA) precisa ter uma política de permissões que conceda a ela a permissão para assumir a função da próxima função encadeada (por exemplo, RoleB). Por sua vez, a função que passa a permissão (RoleB) precisa ter uma política de confiança que permita que ela passe suas permissões para a função encadeada anterior (RoleA). Para obter mais informações, consulte Usar funções de IAM no Manual do usuário do IAM.

A primeira função na cadeia deve ser uma função anexada ao cluster. A primeira função, e cada função subsequente que assume a próxima função na cadeia, deve ter uma política que inclua uma declaração específica. Essa declaração tem o efeito de Allow na ação sts:AssumeRole e no nome de recurso da Amazon (ARN) da próxima função em um elemento Resource. Em nosso exemplo, RoleA tem a seguinte política de permissão que permite assumir RoleB, propriedade da conta da AWS 210987654321.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1487639602000", "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::210987654321:role/RoleB" } ] }

Uma função que passa para outra função deve estabelecer uma relação de confiança com a função que assume a função ou com a conta da AWS que possui a função. No exemplo, RoleB tem a seguinte política de confiança para estabelecer uma relação de confiança com a função RoleA.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::role/RoleA" } } ] }

A seguinte política de confiança estabelece uma relação de confiança com o proprietário da RoleA, conta da AWS 123456789012.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::123456789012:root" } } ] }
nota

Para restringir a autorização de encadeamento de funções a usuários específicos, defina uma condição. Para ter mais informações, consulte Restringir acesso a funções do IAM.

Ao executar um comando UNLOAD, COPY, CREATE EXTERNAL FUNCTION ou CREATE EXTERNAL SCHEMA, você encadeia funções incluindo uma lista separada por vírgulas de ARNs de função no parâmetroiam_role. O exemplo a seguir mostra a sintaxe do encadeamento de funções no parâmetro iam_role.

unload ('select * from venue limit 10') to 's3://acmedata/redshift/venue_pipe_' IAM_ROLE 'arn:aws:iam::<aws-account-id-1>:role/<role-name-1>[,arn:aws:iam::<aws-account-id-2>:role/<role-name-2>][,...]';
nota

A cadeia de funções inteira é colocada entre aspas simples e não deve conter espaços.

Nos exemplos a seguir, RoleA é anexada ao cluster que pertence à conta da AWS 123456789012. RoleB, que pertence à conta 210987654321, tem permissão para acessar o bucket denominado s3://companyb/redshift/. O exemplo a seguir encadeia RoleA e RoleB para descarregar dados (comando UNLOAD) no bucket s3://companyb/redshift/.

unload ('select * from venue limit 10') to 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';

O exemplo a seguir usa um comando COPY para carregar os dados que foram descarregados no exemplo anterior.

copy venue from 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';

No exemplo a seguir, o comando CREATE EXTERNAL SCHEMA usa funções encadeadas para assumir a função RoleB.

create external schema spectrumexample from data catalog database 'exampledb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';

No exemplo a seguir, CREATE EXTERNAL FUNCTION usa funções encadeadas para assumir a função RoleB.

create external function lambda_example(varchar) returns varchar volatile lambda 'exampleLambdaFunction' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';