

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Como usar o Amazon MWAA com o Amazon EKS
<a name="mwaa-eks-example"></a>

O exemplo a seguir demonstra como usar o Amazon Managed Workflows for Apache Airflow com o Amazon EKS.

**Topics**
+ [Versão](#mwaa-eks-example-version)
+ [Pré-requisitos](#eksctl-prereqs)
+ [Criar uma chave pública para o Amazon EC2](#eksctl-create-key)
+ [Criar um cluster](#create-cluster-eksctl)
+ [Crie um namespace `mwaa`](#eksctl-namespace)
+ [Criar um perfil para o namespace `mwaa`](#eksctl-role)
+ [Crie e anexe um perfil do IAM para o cluster do Amazon EKS](#eksctl-iam-role)
+ [Crie o arquivo requirements.txt](#eksctl-requirements)
+ [Crie um mapeamento de identidade para o Amazon EKS](#eksctl-identity-map)
+ [Criar a `kubeconfig`](#eksctl-kube-config)
+ [Criar um DAG](#eksctl-create-dag)
+ [Adicione o DAG e `kube_config.yaml` ao bucket do Amazon S3](#eksctl-dag-bucket)
+ [Habilite e acione o exemplo](#eksctl-trigger-pod)

## Versão
<a name="mwaa-eks-example-version"></a>

É possível usar o exemplo de código nesta página com o **Apache Airflow v2** no [Python 3.10](https://peps.python.org/pep-0619/) e o **Apache Airflow v3** no [Python 3.11](https://peps.python.org/pep-0664/).

## Pré-requisitos
<a name="eksctl-prereqs"></a>

Para usar o exemplo deste tópico, você precisará de:
+ Um [ambiente Amazon MWAA](get-started.md).
+ eksctl. Para saber mais, consulte [Instalar eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html#install-eksctl).
+ kubectl. Para saber mais, consulte [Instalar e configurar o kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/). Em alguns casos, ele é instalado com o eksctl.
+ Um par de chaves do EC2 na região em que criar seu ambiente Amazon MWAA. Para saber mais, consulte [Criação ou importação de um par de chaves](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#prepare-key-pair).

**nota**  
Ao usar um comando `eksctl`, é possível incluir um `--profile` para especificar um perfil diferente do padrão.

## Criar uma chave pública para o Amazon EC2
<a name="eksctl-create-key"></a>

Use o comando a seguir para criar uma chave pública de seu par de chaves privadas.

```
ssh-keygen -y -f myprivatekey.pem > mypublickey.pub
```

Para saber mais, consulte [Recuperar a chave pública para seu par de chaves](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#retrieving-the-public-key).

## Criar um cluster
<a name="create-cluster-eksctl"></a>

Use o seguinte comando para criar o cluster. Se quiser um nome personalizado para o cluster ou criá-lo em uma região diferente, substitua o nome e os valores da região. Você deve criar o cluster na mesma região em que criou o ambiente do Amazon MWAA. Substitua os valores das sub-redes para que correspondam às sub-redes na sua rede Amazon VPC que você usa para o Amazon MWAA. Substitua o valor de `ssh-public-key` para corresponder à chave que você usa. É possível usar uma chave existente do Amazon EC2 que esteja na mesma região ou criar uma nova chave na mesma região em que você criar seu ambiente Amazon MWAA.

```
eksctl create cluster \
--name mwaa-eks \
--region us-west-2 \
--version 1.18 \
--nodegroup-name linux-nodes \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 \
--with-oidc \
--ssh-access \
--ssh-public-key MyPublicKey \
--managed \
--vpc-public-subnets "subnet-11111111111111111, subnet-2222222222222222222" \
--vpc-private-subnets "subnet-33333333333333333, subnet-44444444444444444"
```

Leva algum tempo para concluir a criação do cluster. Depois de concluído, é possível verificar se o cluster foi criado com sucesso e se o provedor IAM OIDC está configurado usando o seguinte comando:

```
eksctl utils associate-iam-oidc-provider \
--region us-west-2 \
--cluster mwaa-eks \
--approve
```

## Crie um namespace `mwaa`
<a name="eksctl-namespace"></a>

Depois de confirmar que o cluster foi criado com sucesso, use o comando a seguir para criar um namespace para os pods.

```
kubectl create namespace mwaa
```

## Criar um perfil para o namespace `mwaa`
<a name="eksctl-role"></a>

Depois de criar o namespace, crie um perfil e uma associação de perfil para um usuário do Amazon MWAA no EKS que possa executar pods em um namespace do MWAA. Se você usou um nome diferente para o namespace, substitua mwaa em `-n mwaa` pelo nome usado.

```
cat << EOF | kubectl apply -f - -n mwaa
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: mwaa-role
rules:
  - apiGroups:
  - ""
  - "apps"
  - "batch"
  - "extensions"
resources:      
  - "jobs"
  - "pods"
  - "pods/attach"
			- "pods/exec"
  - "pods/log"
  - "pods/portforward"
  - "secrets"
  - "services"
verbs:
  - "create"
  - "delete"
  - "describe"
  - "get"
  - "list"
  - "patch"
  - "update"
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: mwaa-role-binding
  subjects:
    - kind: User
  name: mwaa-service
  roleRef:
    kind: Role
  name: mwaa-role
  apiGroup: rbac.authorization.k8s.io
EOF
```

Confirme se o novo perfil pode acessar o cluster do Amazon EKS ao executar o comando a seguir. Certifique-se de usar o nome correto se você não usou*mwaa*:

```
kubectl get pods -n mwaa --as mwaa-service
```

Você recebe uma mensagem de retorno dizendo:

```
No resources found in mwaa namespace.
```

## Crie e anexe um perfil do IAM para o cluster do Amazon EKS
<a name="eksctl-iam-role"></a>

Você deve criar um perfil do IAM e depois vinculá-lo ao cluster Amazon EKS (k8s) para que ele possa ser usado para autenticação por meio do IAM. O perfil é usado somente para fazer login no cluster e não tem nenhuma permissão para o console ou as chamadas de API.

Crie um novo perfil para o ambiente do Amazon MWAA usando as etapas em [Perfil de execução do Amazon MWAA](mwaa-create-role.md). No entanto, em vez de criar e anexar as políticas descritas neste tópico, anexe a seguinte política:

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "airflow:PublishMetrics",
            "Resource": "arn:aws:airflow:us-east-1:111122223333:environment/${MWAA_ENV_NAME}"
        },
        {
            "Effect": "Deny",
            "Action": "s3:ListAllMyBuckets",
            "Resource": [
                "arn:aws:s3:::{MWAA_S3_BUCKET}",
                "arn:aws:s3:::{MWAA_S3_BUCKET}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject*",
                "s3:GetBucket*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::{MWAA_S3_BUCKET}",
                "arn:aws:s3:::{MWAA_S3_BUCKET}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "logs:GetLogEvents",
                "logs:GetLogRecord",
                "logs:GetLogGroupFields",
                "logs:GetQueryResults",
                "logs:DescribeLogGroups"
            ],
            "Resource": [
            "arn:aws:logs:us-east-1:111122223333:log-group:airflow-${MWAA_ENV_NAME}-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "cloudwatch:PutMetricData",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ChangeMessageVisibility",
                "sqs:DeleteMessage",
                "sqs:GetQueueAttributes",
                "sqs:GetQueueUrl",
                "sqs:ReceiveMessage",
                "sqs:SendMessage"
            ],
            "Resource": "arn:aws:sqs:us-east-1:*:airflow-celery-*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey*",
                "kms:Encrypt"
            ],
            "NotResource": "arn:aws:kms:*:111122223333:key/*",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": [
                    "sqs.us-east-1.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "eks:DescribeCluster"
            ],
            "Resource": "arn:aws:eks:us-east-1:111122223333:cluster/${EKS_CLUSTER_NAME}"
        }
    ]
}
```

------

Depois de criar o perfil, edite seu ambiente do Amazon MWAA para usar o perfil que você criou como o perfil de execução para o ambiente. Para alterar o perfil, edite o ambiente a ser usado. Você seleciona a função de execução em **Permissões**.

**Problemas conhecidos:**
+ Há um problema conhecido com a função de subcaminhos que não conseguem se autenticar ARNs com o Amazon EKS. A solução alternativa para isso é criar o perfil de serviço manualmente, em vez de usar o criado pelo próprio Amazon MWAA. Para saber mais, consulte [Funções com caminhos não funcionam quando o caminho é incluído em seu ARN no aws-auth configmap](https://github.com/kubernetes-sigs/aws-iam-authenticator/issues/268)
+ Se a lista de serviços do Amazon MWAA não estiver disponível no IAM, você precisará escolher uma política de serviço alternativa, como o Amazon EC2, e depois atualizar a política de confiança do perfil de acordo com o seguinte:

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": [
            "airflow-env.amazonaws.com",
            "airflow.amazonaws.com"
          ]
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }
  ```

------

  Para saber mais, consulte [Como usar políticas de confiança com perfis do IAM](https://aws.amazon.com/blogs/security/how-to-use-trust-policies-with-iam-roles/).

## Crie o arquivo requirements.txt
<a name="eksctl-requirements"></a>

Para usar o código de amostra nesta seção, certifique-se de ter adicionado uma das seguintes opções de banco de dados ao seu `requirements.txt`. Consulte [Como instalar dependências do Python](working-dags-dependencies.md) para saber mais.

```
kubernetes
apache-airflow[cncf.kubernetes]==3.0.0
```

## Crie um mapeamento de identidade para o Amazon EKS
<a name="eksctl-identity-map"></a>

Use o ARN para o perfil que você criou no comando a seguir para criar um mapeamento de identidade para o Amazon EKS. Altere a região *us-east-1* para a região em que você criou o ambiente. Substitua o ARN da função e, por fim, *mwaa-execution-role* substitua pela função de execução do seu ambiente.

```
eksctl create iamidentitymapping \
--region us-east-1 \
--cluster mwaa-eks \
--arn arn:aws:iam::123456789012:role/mwaa-execution-role \
--username mwaa-service
```

## Criar a `kubeconfig`
<a name="eksctl-kube-config"></a>

Use o comando a seguir para criar `kubeconfig`:

```
aws eks update-kubeconfig \
--region us-west-2 \
--kubeconfig ./kube_config.yaml \
--name mwaa-eks \
--alias aws
```

Se você usou um perfil específico ao executar `update-kubeconfig`, precisará remover a seção `env:` adicionada ao arquivo kube\$1config.yaml para que ela funcione corretamente com o Amazon MWAA. Para fazer isso, exclua do arquivo o seguinte e então salve-o:

```
env:
 - name: AWS_PROFILE
 value: profile_name
```

## Criar um DAG
<a name="eksctl-create-dag"></a>

Use o exemplo de código a seguir para criar um arquivo Python, como `mwaa_pod_example.py` para o DAG.

```
"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"""
from airflow import DAG
from datetime import datetime
from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import KubernetesPodOperator

default_args = {
   'owner': 'aws',
   'depends_on_past': False,
   'start_date': datetime(2019, 2, 20),
   'provide_context': True
}

dag = DAG(
   'kubernetes_pod_example', default_args=default_args, schedule_interval=None)

#use a kube_config stored in s3 dags folder for now
kube_config_path = '/usr/local/airflow/dags/kube_config.yaml'

podRun = KubernetesPodOperator(
                       namespace="mwaa",
                       image="ubuntu:18.04",
                       cmds=["bash"],
                       arguments=["-c", "ls"],
                       labels={"foo": "bar"},
                       name="mwaa-pod-test",
                       task_id="pod-task",
                       get_logs=True,
                       dag=dag,
                       is_delete_operator_pod=False,
                       config_file=kube_config_path,
                       in_cluster=False,
                       cluster_context='aws'
                       )
```

## Adicione o DAG e `kube_config.yaml` ao bucket do Amazon S3
<a name="eksctl-dag-bucket"></a>

Coloque o DAG criado e o arquivo `kube_config.yaml` no bucket do Amazon S3 para o ambiente Amazon MWAA. É possível colocar arquivos em seu bucket usando o console do Amazon S3 ou a AWS Command Line Interface.

## Habilite e acione o exemplo
<a name="eksctl-trigger-pod"></a>

No Apache Airflow, habilite o exemplo e, em seguida, acione-o.

Depois de ser executado e concluído com sucesso, use o comando a seguir para verificar o pod:

```
kubectl get pods -n mwaa
```

Você terá um resultado semelhante ao seguinte:

```
NAME READY STATUS RESTARTS AGE
mwaa-pod-test-aa11bb22cc3344445555666677778888 0/1 Completed 0 2m23s
```

Em seguida, é possível verificar a saída do pod com o comando a seguir. Substitua o valor do nome pelo valor retornado do comando anterior:

```
kubectl logs -n mwaa mwaa-pod-test-aa11bb22cc3344445555666677778888
```