

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de imágenes de Amazon ECR con Amazon EKS
<a name="mwaa-eks-example"></a>

En el siguiente ejemplo se muestra cómo usar Amazon Managed Workflows para Apache Airflow con Amazon EKS.

**Topics**
+ [Versión](#mwaa-eks-example-version)
+ [Requisitos previos](#eksctl-prereqs)
+ [Creación de una clave pública para Amazon EC2](#eksctl-create-key)
+ [Cree el clúster](#create-cluster-eksctl)
+ [Creación de un espacio de nombres de `mwaa`](#eksctl-namespace)
+ [Creación de un rol para el espacio de nombres de `mwaa`](#eksctl-role)
+ [Creación del rol de IAM del clúster de Amazon EKS](#eksctl-iam-role)
+ [Creación del archivo requirements.txt](#eksctl-requirements)
+ [Creación de un mapeo de identidad para Amazon EKS](#eksctl-identity-map)
+ [Creación del `kubeconfig`](#eksctl-kube-config)
+ [Creación de un DAG](#eksctl-create-dag)
+ [Adición del DAG y `kube_config.yaml` al bucket de Amazon S3](#eksctl-dag-bucket)
+ [Habilitación y activación del ejemplo](#eksctl-trigger-pod)

## Versión
<a name="mwaa-eks-example-version"></a>

Puede usar el código de ejemplo que aparece en esta página con **Apache Airflow v2** en [Python 3.10](https://peps.python.org/pep-0619/) y **Apache Airflow v3** en [Python 3.11](https://peps.python.org/pep-0664/).

## Requisitos previos
<a name="eksctl-prereqs"></a>

Para usar el ejemplo de este tema, necesitará lo siguiente:
+ Un [entorno de Amazon MWAA](get-started.md).
+ eksctl. Para obtener más información, consulte cómo [instalar eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html#install-eksctl).
+ kubectl. Para obtener más información, consulte cómo [instalar y configurar kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/). En algunos casos, se instala con eksctl.
+ Un par de claves de EC2 en la región donde se crea su entorno de Amazon MWAA. Para obtener más información, consulte cómo [crear o importar un par de claves](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#prepare-key-pair).

**nota**  
Cuando utilice un comando `eksctl`, puede incluir un `--profile` para especificar un perfil distinto del predeterminado.

## Creación de una clave pública para Amazon EC2
<a name="eksctl-create-key"></a>

Utilice el siguiente comando para crear una clave pública a partir de su clave privada.

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

Para obtener más información, consulte cómo [recuperar la clave pública de su par de claves](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#retrieving-the-public-key).

## Cree el clúster
<a name="create-cluster-eksctl"></a>

Utilice el siguiente comando para crear el clúster. Si desea usar un nombre personalizado para el clúster o crearlo en una región diferente, sustituya los valores del nombre y la región. Debe crear el clúster en la misma región en la que haya creado el entorno de Amazon MWAA. Sustituya los valores de las subredes para que coincidan con las subredes de la red de Amazon VPC que utilice para Amazon MWAA. Sustituya el valor por `ssh-public-key` para que coincida con la clave que utilice. Puede utilizar una clave existente de Amazon EC2 que se encuentre en la misma región o crear una nueva en la misma región donde creó su entorno de 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"
```

La creación del clúster tarde un tiempo en completarse. Una vez que termine el proceso, puede comprobar que el clúster se haya creado correctamente y que tiene el proveedor OIDC de IAM configurado mediante el siguiente comando:

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

## Creación de un espacio de nombres de `mwaa`
<a name="eksctl-namespace"></a>

Tras confirmar que el clúster se ha creado correctamente, utilice el siguiente comando para crear un espacio de nombres para los pods.

```
kubectl create namespace mwaa
```

## Creación de un rol para el espacio de nombres de `mwaa`
<a name="eksctl-role"></a>

Tras crear el espacio de nombres, cree un rol y un enlace de rol para un usuario de Amazon MWAA en EKS que pueda ejecutar pods en un espacio de nombres de MWAA. Si utilizó un nombre diferente para el espacio de nombres, reemplace mwaa en `-n mwaa` por el nombre que usó.

```
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 que el nuevo rol puede acceder al clúster de Amazon EKS ejecutando el siguiente comando. Asegúrese de usar el nombre correcto si no usó*mwaa*:

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

Deberá aparecer un mensaje que indique lo siguiente:

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

## Creación del rol de IAM del clúster de Amazon EKS
<a name="eksctl-iam-role"></a>

Debe crear un rol de IAM y, a continuación, vincularlo al clúster de Amazon EKS (k8s) para que se pueda usar para la autenticación a través de IAM. El rol solo se usa para iniciar sesión en el clúster y no tiene ningún permiso en lo que respecta a la consola o las llamadas a la API.

Cree un nuevo rol para el entorno de Amazon MWAA siguiendo los pasos que se indican en [Rol de ejecución de Amazon MWAA](mwaa-create-role.md). Sin embargo, en lugar de crear y adjuntar las políticas descritas en ese tema, adjunte la siguiente 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}"
        }
    ]
}
```

------

Una vez que haya creado el rol, edite el entorno de Amazon MWAA para usar el rol que haya creado como rol de ejecución para el entorno. Para cambiar el rol, edite el entorno que se vaya a utilizar. Seleccione el rol de ejecución en **Permisos**.

**Problemas conocidos:**
+ Existe un problema conocido relacionado con la función de que las subrutas no se pueden autenticar ARNs con Amazon EKS. La solución consiste en crear el rol de servicio de forma manual, en lugar de utilizar el que creó Amazon MWAA. Para obtener más información, consulte los [roles con rutas que no funcionan cuando la ruta está incluida en su ARN en el mapa de configuración de aws-auth](https://github.com/kubernetes-sigs/aws-iam-authenticator/issues/268)
+ Si la lista de servicios de Amazon MWAA no está disponible en IAM, debe elegir una política de servicio alternativa, como Amazon EC2, y, a continuación, actualizar la política de confianza del rol para que coincida con lo siguiente:

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

****  

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

------

  Para obtener más información, consulte [cómo usar las políticas de confianza con roles de IAM](https://aws.amazon.com/blogs/security/how-to-use-trust-policies-with-iam-roles/).

## Creación del archivo requirements.txt
<a name="eksctl-requirements"></a>

Para usar el código de ejemplo de esta sección, compruebe que ha añadido una de las siguientes opciones de base de datos a sus `requirements.txt`. Consulte [Instalación de dependencias de Python](working-dags-dependencies.md) para obtener más información.

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

## Creación de un mapeo de identidad para Amazon EKS
<a name="eksctl-identity-map"></a>

Utilice el ARN del rol que creó en el siguiente comando para crear un mapeo de identidad para Amazon EKS. Cambie la región por *us-east-1* la región en la que creó el entorno. Sustituya el ARN de la función y, por último, *mwaa-execution-role* sustitúyala por la función de ejecución de su entorno.

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

## Creación del `kubeconfig`
<a name="eksctl-kube-config"></a>

Utilice el siguiente comando para crear el rol `kubeconfig`:

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

Si utilizó un perfil específico al ejecutar `update-kubeconfig`, tendrá que eliminar la sección `env:` añadida al archivo kube\$1config.yaml para que funcione correctamente con Amazon MWAA. Para ello, elimine lo siguiente del archivo y guárdelo:

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

## Creación de un DAG
<a name="eksctl-create-dag"></a>

Utilice el siguiente ejemplo de código para crear un archivo de Python, por ejemplo, `mwaa_pod_example.py` para el 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'
                       )
```

## Adición del DAG y `kube_config.yaml` al bucket de Amazon S3
<a name="eksctl-dag-bucket"></a>

Coloque el DAG que creó y el archivo `kube_config.yaml` en el bucket de Amazon S3 para el entorno de Amazon MWAA. Puede colocar los archivos en el bucket a través de la consola de Amazon S3 o el AWS Command Line Interface.

## Habilitación y activación del ejemplo
<a name="eksctl-trigger-pod"></a>

En Apache Airflow, habilite el ejemplo y actívelo.

Cuando se ejecute y se complete correctamente, utilice el siguiente comando para verificar el pod:

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

Obtendrá un resultado similar al siguiente:

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

A continuación, puede verificar la salida del pod con el siguiente comando. Reemplace el nombre del valor por el valor devuelto por el comando anterior:

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