

 O Amazon Redshift não permitirá mais a criação de UDFs do Python a partir do Patch 198. As UDFs do Python existentes continuarão a funcionar normalmente até 30 de junho de 2026. Para ter mais informações, consulte a [publicação de blog ](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

# Encadeando funções do IAM no Amazon Redshift
<a name="authorizing-redshift-service-chaining-roles"></a>

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](amazon-redshift-limits.md#amazon-redshift-limits-quota). 

**nota**  
Você deve especificar os perfis do IAM para que a cadeia funcione corretamente.

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](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) 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`. 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Stmt1487639602000",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::111122223333: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`.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333: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`.

------
#### [ JSON ]

****  

```
{
  "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 obter mais informações, consulte [Restringir acesso a funções do IAM](authorizing-redshift-service-database-users.md).

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âmetro`iam_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';
```