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
Conditions préalables
Pour utiliser l'exemple de cette rubrique, vous aurez besoin des éléments suivants :
-
Un environnement Amazon MWAA.
-
ectl. Pour en savoir plus, reportez-vous à la section Installer eksctl.
-
kubectl. Pour en savoir plus, consultez la section Installation et configuration de kubectl
. Dans certains cas, il est installé avec eksctl. -
Une paire de clés EC2 dans la région où vous créez votre environnement Amazon MWAA. Pour en savoir plus, consultez la section Création ou importation d'une paire de clés.
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 \ --regionus-west-2\ --version 1.30 \ --nodegroup-name linux-nodes \ --nodes 3 \ --nodes-min 1 \ --nodes-max 4 \ --with-oidc \ --ssh-access \ --ssh-public-keyMyPublicKey\ --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 \ --regionus-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 :
-
API(par défaut pour les clusters créés avec des outils récents) : accordez l'accès en créant une entrée d'accès Amazon EKS. Suivez les étapes de la section Option A — Mode API : créer une entrée d'accès EKS. -
CONFIG_MAPouAPI_AND_CONFIG_MAP— accordez l'accès via leaws-authConfigMap. Suivez les étapes de la section Option B : ConfigMap mode : créer un mappage d'identité.
Pour vérifier le mode actuel de votre cluster :
aws eks describe-cluster --name mwaa-eks --regionus-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 par le nom que vous avez utilisé.mwaa
cat << EOF | kubectl apply -f - -nmwaakind: 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 -nmwaa--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 :
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 :
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 \ --regionus-west-2\ --cluster-namemwaa-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 --regionus-west-2--cluster-namemwaa-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 \ --regionus-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 \ --regionus-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 mwaamwaa-pod-test-aa11bb22cc3344445555666677778888