View a markdown version of this page

Utilizzo di Amazon MWAA con Amazon EKS - Amazon Managed Workflows for Apache Airflow

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di Amazon MWAA con Amazon EKS

L'esempio seguente dimostra come utilizzare Amazon Managed Workflows for Apache Airflow con Amazon EKS.

Versione

Puoi utilizzare l'esempio di codice in questa pagina con Apache Airflow v2 in Python 3.10 e Apache Airflow v3 in Python 3.11. https://peps.python.org/pep-0664/

Prerequisiti

Per utilizzare l'esempio in questo argomento, è necessario quanto segue:

Nota

Quando si utilizza un eksctl comando, è possibile includere un --profile per specificare un profilo diverso da quello predefinito.

Crea una chiave pubblica per Amazon EC2

Usa il seguente comando per creare una chiave pubblica dalla tua coppia di chiavi private.

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

Per ulteriori informazioni, consulta Recupero della chiave pubblica per la coppia di chiavi.

Creazione del cluster

Usa il comando seguente per creare il cluster. Se desideri un nome personalizzato per il cluster o crearlo in una regione diversa, sostituisci il nome e i valori della regione. Devi creare il cluster nella stessa regione in cui crei l'ambiente Amazon MWAA. Sostituisci i valori delle sottoreti in modo che corrispondano alle sottoreti della tua rete Amazon VPC che usi per Amazon MWAA. Sostituisci il valore in modo che corrisponda alla ssh-public-key chiave che usi. Puoi utilizzare una chiave esistente di Amazon EC2 che si trova nella stessa regione o crearne una nuova nella stessa regione in cui hai creato il tuo ambiente 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"

Il completamento della creazione del cluster richiede del tempo. Una volta completato, puoi verificare che il cluster sia stato creato correttamente e che il provider IAM OIDC sia configurato utilizzando il seguente comando:

eksctl utils associate-iam-oidc-provider \ --region us-west-2 \ --cluster mwaa-eks \ --approve
modalità di autenticazione del cluster EKS

Amazon EKS supporta tre modalità di autenticazione del cluster: APIAPI_AND_CONFIG_MAP, eCONFIG_MAP. La modalità determina in che modo si concede l'accesso al ruolo di esecuzione di Amazon MWAA al cluster:

Per verificare la modalità corrente del cluster:

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

Se crei il cluster con il eksctl comando mostrato qui, controlla la modalità in seguito. Se la modalità è attivaAPI, segui i passaggi di immissione dell'accesso anziché i ConfigMap passaggi.

Crea un namespace mwaa

Dopo aver verificato che il cluster è stato creato correttamente, utilizzate il comando seguente per creare uno spazio dei nomi per i pod.

kubectl create namespace mwaa

Crea un ruolo per il namespace mwaa

Dopo aver creato lo spazio dei nomi, crea un ruolo e un'associazione di ruoli per un utente Amazon MWAA su EKS in grado di eseguire pod in uno spazio dei nomi MWAA. Se hai usato un nome diverso per lo spazio dei nomi, sostituisci mwaa in con il nome che hai usato. -n mwaa

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

Verifica che il nuovo ruolo possa accedere al cluster Amazon EKS eseguendo il seguente comando. Assicurati di utilizzare il nome corretto se non hai usatomwaa:

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

Riceverai un messaggio che dice:

No resources found in mwaa namespace.

Crea e collega un ruolo IAM per il cluster Amazon EKS

È necessario creare un ruolo IAM e quindi associarlo al cluster Amazon EKS (k8s) in modo che possa essere utilizzato per l'autenticazione tramite IAM. Il ruolo viene utilizzato solo per accedere al cluster e non dispone di autorizzazioni per la console o le chiamate API.

Autenticazione e autorizzazioni

Questo ruolo si autentica solo nel cluster. In ConfigMap modalità, le autorizzazioni effettive all'interno del cluster provengono dal ruolo e. Kubernetes RoleBinding In modalità API, le autorizzazioni provengono dall'ambito di accesso della voce di accesso. Assicurati di utilizzare lo stesso nome di Kubernetes gruppo RoleBinding sia nel metodo di accesso che scegli.

Crea un nuovo ruolo per l'ambiente Amazon MWAA utilizzando i passaggi indicati. Ruolo di esecuzione di Amazon MWAA Tuttavia, invece di creare e allegare le politiche descritte in quell'argomento, allega la seguente politica:

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

Dopo aver creato il ruolo, modifica l'ambiente Amazon MWAA per utilizzare il ruolo creato come ruolo di esecuzione per l'ambiente. Per cambiare il ruolo, modifica l'ambiente da utilizzare. Seleziona il ruolo di esecuzione in Autorizzazioni.

Problemi noti:

  • È noto che gli ARN di ruolo con percorsi secondari non sono in grado di autenticarsi con Amazon EKS. La soluzione alternativa è creare il ruolo del servizio manualmente anziché utilizzare quello creato da Amazon MWAA stesso. Per saperne di più, consulta la sezione Ruoli con percorsi non funzionano quando il percorso è incluso nel relativo ARN nella configmap di aws-auth

  • Se l'elenco dei servizi Amazon MWAA non è disponibile in IAM, devi scegliere una policy di servizio alternativa, come Amazon EC2, e quindi aggiornare la policy di fiducia del ruolo in modo che corrisponda a quanto segue:

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

    Per ulteriori informazioni, consulta Come utilizzare le politiche di fiducia con i ruoli IAM.

Crea il file requirements.txt

Per utilizzare il codice di esempio in questa sezione, assicurati di aver aggiunto una delle seguenti opzioni di database al tuorequirements.txt. Per saperne di più, fai riferimento aInstallazione delle dipendenze Python.

kubernetes apache-airflow-providers-cncf-kubernetes

Concedi al ruolo di esecuzione di Amazon MWAA l'accesso al cluster

Il modo in cui concedi l'accesso al ruolo di esecuzione di Amazon MWAA al cluster dipende dalla modalità di autenticazione del cluster (consulta la nota in). Creazione del cluster Segui il percorso che corrisponde al tuo cluster.

Opzione A—Modalità API: crea una voce di accesso EKS

Se il tuo cluster utilizza la modalità di API_AND_CONFIG_MAP autenticazione API or, crea una voce di accesso per il ruolo di esecuzione di Amazon MWAA. Sostituisci Regione AWS l'ARN del nome del cluster e del ruolo con i tuoi valori.

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

Il mwaa-service gruppo deve corrispondere al subjects gruppo a cui fa riferimento il gruppo in RoleBinding cui hai creato. Crea un ruolo per il namespace mwaa Questo associa il ruolo di esecuzione alle mwaa-role autorizzazioni nel namespace. mwaa

Per confermare di aver creato la voce di accesso:

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

Opzione B— ConfigMap modalità: crea una mappatura delle identità

Se il tuo cluster utilizza la modalità di API_AND_CONFIG_MAP autenticazione CONFIG_MAP or, crea una mappatura delle identità. Questo scrive una voce nel cluster. aws-auth ConfigMap Questo passaggio non ha effetto sui cluster che utilizzano la modalità di API autenticazione.

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

Il --group mwaa-service valore deve corrispondere all'oggetto del gruppo in RoleBinding cui hai creato. Crea un ruolo per il namespace mwaa Ciò lega il ruolo di esecuzione alle mwaa-role autorizzazioni nel mwaa namespace, in linea con la voce di accesso nell'opzione A.

Crea il kubeconfig

Usa il seguente comando per creare: kubeconfig

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

Se hai utilizzato un profilo specifico durante l'esecuzione, update-kubeconfig devi rimuovere la env: sezione aggiunta al file kube_config.yaml in modo che funzioni correttamente con Amazon MWAA. Per farlo, elimina quanto segue dal file e salvalo:

env: - name: AWS_PROFILE value: profile_name

Crea un DAG

Utilizzate il seguente esempio di codice per creare un file Python, ad esempio mwaa_pod_example.py per il 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' )

Aggiungi il DAG e kube_config.yaml al bucket Amazon S3

Inserisci il DAG che hai creato e il kube_config.yaml file nel bucket Amazon S3 per l'ambiente Amazon MWAA. Puoi inserire i file nel tuo bucket utilizzando la console Amazon S3 o il. AWS Command Line Interface

Abilita e attiva l'esempio

In Apache Airflow, abilita l'esempio e poi attivalo.

Una volta eseguito e completato correttamente, utilizzate il comando seguente per verificare il pod:

kubectl get pods -n mwaa

Si ottiene un risultato simile al seguente:

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

È quindi possibile verificare l'output del pod con il seguente comando. Sostituisci il valore del nome con il valore restituito dal comando precedente:

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