View a markdown version of this page

Uso de imágenes de Amazon ECR con Amazon EKS - Amazon Managed Workflows para Apache Airflow

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

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

Versión

Puede usar el código de ejemplo que aparece en esta página con Apache Airflow v2 en Python 3.10 y Apache Airflow v3 en Python 3.11.

Requisitos previos

Para usar el ejemplo de este tema, necesitará lo siguiente:

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

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.

Cree el clúster

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.30 \ --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
Modo de autenticación de clúster EKS

Amazon EKS admite tres modos de autenticación de clústeres: APIAPI_AND_CONFIG_MAP, yCONFIG_MAP. El modo determina cómo se concede al rol de ejecución de Amazon MWAA el acceso al clúster:

Para comprobar el modo actual de tu clúster:

aws eks describe-cluster --name mwaa-eks --region us-west-2 \ --query "cluster.accessConfig.authenticationMode"

Si creas el clúster con el eksctl comando que se muestra aquí, comprueba el modo después. Si el modo esAPI, siga los pasos de entrada de acceso en lugar de los ConfigMap pasos.

Crea un espacio de nombres mwaa

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

Cree un rol para el espacio de nombres mwaa

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 - kind: Group 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

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.

Autenticación y permisos

Este rol solo autentica en el clúster. En el ConfigMap modo, los permisos reales en el clúster provienen del Kubernetes rol y. RoleBinding En el modo API, los permisos provienen del ámbito de acceso de la entrada de acceso. Asegúrese de usar el mismo nombre de Kubernetes grupo tanto en el método de acceso que elija como en el RoleBinding método de acceso que elija.

Cree un nuevo rol para el entorno de Amazon MWAA siguiendo los pasos que se indican en Rol de ejecución de Amazon MWAA. 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 los ARN de los roles por el que las subrutas no pueden autenticarse 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

  • 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.

Creación del archivo requirements.txt

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 para obtener más información.

kubernetes apache-airflow-providers-cncf-kubernetes

Otorgue al rol de ejecución de Amazon MWAA acceso al clúster

La forma de conceder al rol de ejecución de Amazon MWAA el acceso al clúster depende del modo de autenticación del clúster (consulte la nota en). Cree el clúster Siga la ruta que coincida con su clúster.

Opción A: modo API: cree una entrada de acceso a EKS

Si su clúster usa el modo de API_AND_CONFIG_MAP autenticación API o, cree una entrada de acceso para el rol de ejecución de Amazon MWAA. Sustituya el Región de AWS nombre del clúster y el ARN del rol por sus valores.

aws eks create-access-entry \ --region us-west-2 \ --cluster-name mwaa-eks \ --principal-arn arn:aws:iam::123456789012:role/mwaa-execution-role \ --kubernetes-groups mwaa-service \ --username mwaa-service

El mwaa-service grupo debe coincidir con el subjects grupo al que hace referencia el grupo RoleBinding que creaste enCree un rol para el espacio de nombres mwaa . Esto vincula la función de ejecución a los mwaa-role permisos del espacio de mwaa nombres.

Para confirmar que ha creado la entrada de acceso:

aws eks list-access-entries --region us-west-2 --cluster-name mwaa-eks

Opción B: ConfigMap modo: crear un mapeo de identidad

Si su clúster usa el modo de API_AND_CONFIG_MAP autenticación CONFIG_MAP o, cree un mapeo de identidades. Esto escribe una entrada en el clúster aws-auth ConfigMap. Este paso no afecta a los clústeres que utilizan el modo de API autenticación.

eksctl create iamidentitymapping \ --region us-west-2 \ --cluster mwaa-eks \ --arn arn:aws:iam::123456789012:role/mwaa-execution-role \ --username mwaa-service \ --group mwaa-service

El --group mwaa-service valor debe coincidir con el asunto del grupo en el RoleBinding que lo creóCree un rol para el espacio de nombres mwaa . Esto vincula la función de ejecución a los mwaa-role permisos del espacio de mwaa nombres, de forma coherente con la entrada de acceso de la opción A.

Crea el kubeconfig

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_config.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

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' )

Agregue el DAG y kube_config.yaml al bucket de Amazon S3

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

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