View a markdown version of this page

Utilisation d'Amazon MWAA avec Amazon EKS - Amazon Managed Workflows for Apache Airflow

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation d'Amazon MWAA avec Amazon EKS

L'exemple suivant montre comment utiliser Amazon Managed Workflows pour Apache Airflow avec Amazon EKS.

Version

Vous pouvez utiliser l'exemple de code de cette page avec Apache Airflow v2 en Python 3.10 et Apache Airflow v3 en Python 3.11.

Conditions préalables

Pour utiliser l'exemple de cette rubrique, vous aurez besoin des éléments suivants :

Note

Lorsque vous utilisez une eksctl commande, vous pouvez inclure un --profile pour spécifier un profil autre que celui par défaut.

Création d'une clé publique pour Amazon EC2

Utilisez la commande suivante pour créer une clé publique à partir de votre paire de clés privées.

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

Pour en savoir plus, consultez la section Récupération de la clé publique de votre paire de clés.

Créer le cluster

Utilisez la commande suivante pour créer le cluster. Si vous souhaitez attribuer un nom personnalisé au cluster ou le créer dans une autre région, remplacez le nom et les valeurs de région. Vous devez créer le cluster dans la même région que celle où vous avez créé l'environnement Amazon MWAA. Remplacez les valeurs des sous-réseaux afin qu'elles correspondent aux sous-réseaux de votre réseau Amazon VPC que vous utilisez pour Amazon MWAA. Remplacez la valeur par pour ssh-public-key qu'elle corresponde à la clé que vous utilisez. Vous pouvez utiliser une clé existante d'Amazon EC2 qui se trouve dans la même région, ou créer une nouvelle clé dans la même région que celle où vous avez créé votre environnement 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 création du cluster prend un certain temps. Une fois terminé, vous pouvez vérifier que le cluster a été créé avec succès et que le fournisseur IAM OIDC est configuré à l'aide de la commande suivante :

eksctl utils associate-iam-oidc-provider \ --region us-west-2 \ --cluster mwaa-eks \ --approve
Mode d'authentification du cluster EKS

Amazon EKS prend en charge trois modes d'authentification de cluster : APIAPI_AND_CONFIG_MAP, etCONFIG_MAP. Le mode détermine la manière dont vous accordez au rôle d'exécution Amazon MWAA l'accès au cluster :

Pour vérifier le mode actuel de votre cluster :

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

Si vous créez le cluster à l'aide de la eksctl commande présentée ici, vérifiez le mode par la suite. Si c'est le casAPI, suivez les étapes de saisie d'accès au lieu de ConfigMap les suivre.

Création d'un espace de noms mwaa

Après avoir vérifié que le cluster a bien été créé, utilisez la commande suivante pour créer un espace de noms pour les pods.

kubectl create namespace mwaa

Création d'un rôle pour l'espace de noms mwaa

Après avoir créé l'espace de noms, créez un rôle et une liaison de rôle pour un utilisateur Amazon MWAA sur EKS qui peut exécuter des pods dans un espace de noms MWAA. Si vous avez utilisé un autre nom pour l'espace de noms, remplacez mwaa -n mwaa par le nom que vous avez utilisé.

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

Vérifiez que le nouveau rôle peut accéder au cluster Amazon EKS en exécutant la commande suivante. Assurez-vous d'utiliser le nom correct si vous n'avez pas utilisé mwaa :

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

Vous recevez un message qui dit :

No resources found in mwaa namespace.

Créez et attachez un rôle IAM pour le cluster Amazon EKS

Vous devez créer un rôle IAM, puis le lier au cluster Amazon EKS (k8s) afin qu'il puisse être utilisé pour l'authentification via IAM. Le rôle est utilisé uniquement pour se connecter au cluster et ne dispose d'aucune autorisation pour les appels de console ou d'API.

Authentification et autorisations

Ce rôle permet uniquement de s'authentifier auprès du cluster. En ConfigMap mode, les autorisations réelles dans le cluster proviennent du Kubernetes rôle et RoleBinding. En mode API, les autorisations proviennent de la portée d'accès de l'entrée d'accès. Assurez-vous d'utiliser le même nom de Kubernetes groupe dans la méthode d'accès que vous choisissez RoleBinding et quelle que soit la méthode d'accès que vous choisissez.

Créez un nouveau rôle pour l'environnement Amazon MWAA en suivant les étapes décrites dansRôle d'exécution Amazon MWAA. Toutefois, au lieu de créer et de joindre les politiques décrites dans cette rubrique, joignez la stratégie suivante :

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}" } ] }

Après avoir créé un rôle, modifiez votre environnement Amazon MWAA pour utiliser le rôle que vous avez créé comme rôle d'exécution pour l'environnement. Pour modifier le rôle, modifiez l'environnement à utiliser. Vous sélectionnez le rôle d'exécution sous Autorisations.

Problèmes connus :

  • Il existe un problème connu lié aux ARN de rôle dont les sous-chemins ne peuvent pas s'authentifier auprès d'Amazon EKS. La solution consiste à créer le rôle de service manuellement plutôt que d'utiliser celui créé par Amazon MWAA lui-même. Pour en savoir plus, reportez-vous à la section Les rôles dotés de chemins ne fonctionnent pas lorsque le chemin est inclus dans leur ARN dans la carte de configuration aws-auth

  • Si la liste des services Amazon MWAA n'est pas disponible dans IAM, vous devez choisir une autre politique de service, telle qu'Amazon EC2, puis mettre à jour la politique de confiance du rôle pour qu'elle corresponde à la suivante :

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

    Pour en savoir plus, consultez Comment utiliser les politiques de confiance avec les rôles IAM.

Créez le fichier requirements.txt

Pour utiliser l'exemple de code de cette section, assurez-vous d'avoir ajouté l'une des options de base de données suivantes à votrerequirements.txt. Pour en savoir plus, consultezInstallation des dépendances Python.

kubernetes apache-airflow-providers-cncf-kubernetes

Accorder au rôle d'exécution Amazon MWAA l'accès au cluster

La manière dont vous accordez au rôle d'exécution Amazon MWAA l'accès au cluster dépend du mode d'authentification du cluster (voir la note dansCréer le cluster). Suivez le chemin correspondant à votre cluster.

Option A — Mode API : créer une entrée d'accès EKS

Si votre cluster utilise le mode API_AND_CONFIG_MAP d'authentification API ou, créez une entrée d'accès pour le rôle d'exécution Amazon MWAA. Remplacez Région AWS le nom du cluster et l'ARN du rôle par vos valeurs.

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

Le mwaa-service groupe doit correspondre au subjects groupe référencé par le groupe RoleBinding que vous avez créé dansCréation d'un rôle pour l'espace de noms mwaa. Cela lie le rôle d'exécution aux mwaa-role autorisations de l'espace de mwaa noms.

Pour confirmer que vous avez créé l'entrée d'accès :

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

Option B : ConfigMap mode : créer un mappage d'identité

Si votre cluster utilise le mode API_AND_CONFIG_MAP d'authentification CONFIG_MAP ou, créez un mappage d'identité. Cela écrit une entrée dans le cluster aws-auth ConfigMap. Cette étape n'a aucun effet sur les clusters utilisant le mode API d'authentification.

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

La --group mwaa-service valeur doit correspondre à l'objet du groupe dans le RoleBinding que vous avez créé dansCréation d'un rôle pour l'espace de noms mwaa. Cela lie le rôle d'exécution aux mwaa-role autorisations de l'mwaaespace de noms, conformément à l'entrée d'accès de l'option A.

Créez le kubeconfig

Utilisez la commande suivante pour créer kubeconfig :

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

Si vous avez utilisé un profil spécifique lors de l'exécution, update-kubeconfig vous devez supprimer la env: section ajoutée au fichier kube_config.yaml afin qu'elle fonctionne correctement avec Amazon MWAA. Pour ce faire, supprimez les éléments suivants du fichier, puis enregistrez-le :

env: - name: AWS_PROFILE value: profile_name

Création d'un DAG

Utilisez l'exemple de code suivant pour créer un fichier Python, par exemple mwaa_pod_example.py pour le 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' )

Ajoutez le DAG et kube_config.yaml au compartiment Amazon S3

Placez le DAG que vous avez créé et le kube_config.yaml fichier dans le compartiment Amazon S3 pour l'environnement Amazon MWAA. Vous pouvez placer des fichiers dans votre compartiment à l'aide de la console Amazon S3 ou du AWS Command Line Interface.

Activez et déclenchez l'exemple

Dans Apache Airflow, activez l'exemple, puis déclenchez-le.

Une fois qu'il s'est exécuté et s'est terminé avec succès, utilisez la commande suivante pour vérifier le pod :

kubectl get pods -n mwaa

Vous obtenez une sortie similaire à la suivante :

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

Vous pouvez ensuite vérifier la sortie du pod à l'aide de la commande suivante. Remplacez la valeur du nom par la valeur renvoyée par la commande précédente :

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