View a markdown version of this page

Menggunakan Amazon MWAA dengan Amazon EKS - Amazon Managed Workflows for Apache Airflow

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan Amazon MWAA dengan Amazon EKS

Contoh berikut menunjukkan cara menggunakan Alur Kerja Terkelola Amazon untuk Apache Airflow dengan Amazon EKS.

Versi

Anda dapat menggunakan contoh kode di halaman ini dengan Apache Airflow v2 di Python 3.10 dan Apache Airflow v3 di Python 3. 11.

Prasyarat

Untuk menggunakan contoh dalam topik ini, Anda memerlukan yang berikut ini:

catatan

Saat Anda menggunakan eksctl perintah, Anda dapat menyertakan --profile a untuk menentukan profil selain default.

Buat kunci publik untuk Amazon EC2

Gunakan perintah berikut untuk membuat kunci publik dari pasangan kunci pribadi Anda.

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

Untuk mempelajari selengkapnya, lihat Mengambil kunci publik untuk pasangan kunci Anda.

Buat cluster

Gunakan perintah berikut untuk membuat cluster. Jika Anda ingin nama khusus untuk cluster atau membuatnya di Wilayah yang berbeda, ganti nama dan nilai Wilayah. Anda harus membuat cluster di Wilayah yang sama tempat Anda membuat lingkungan Amazon MWAA. Ganti nilai untuk subnet agar sesuai dengan subnet di jaringan Amazon VPC Anda yang Anda gunakan untuk Amazon MWAA. Ganti nilai agar ssh-public-key sesuai dengan kunci yang Anda gunakan. Anda dapat menggunakan kunci yang ada dari Amazon EC2 yang berada di Wilayah yang sama, atau membuat kunci baru di Wilayah yang sama tempat Anda membuat lingkungan Amazon MWAA Anda.

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"

Butuh beberapa waktu untuk menyelesaikan pembuatan cluster. Setelah selesai, Anda dapat memverifikasi bahwa cluster berhasil dibuat dan memiliki IAM OIDC Provider dikonfigurasi dengan menggunakan perintah berikut:

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

Amazon EKS mendukung tiga mode otentikasi cluster:API,API_AND_CONFIG_MAP, danCONFIG_MAP. Mode menentukan bagaimana Anda memberikan akses peran eksekusi Amazon MWAA ke cluster:

Untuk memeriksa mode cluster Anda saat ini:

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

Jika Anda membuat cluster dengan eksctl perintah yang ditunjukkan di sini, periksa mode sesudahnya. Jika modenyaAPI, ikuti langkah-langkah entri akses alih-alih lang ConfigMap kah-langkahnya.

Buat namespace mwaa

Setelah mengonfirmasi bahwa cluster berhasil dibuat, gunakan perintah berikut untuk membuat namespace untuk pod.

kubectl create namespace mwaa

Buat peran untuk namespace mwaa

Setelah Anda membuat namespace, buat peran dan pengikatan peran untuk pengguna Amazon MWAA di EKS yang dapat menjalankan pod di namespace MWAA. Jika Anda menggunakan nama yang berbeda untuk namespace, ganti mwaa -n mwaa dengan nama yang Anda gunakan.

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

Konfirmasikan bahwa peran baru dapat mengakses cluster Amazon EKS dengan menjalankan perintah berikut. Pastikan untuk menggunakan nama yang benar jika Anda tidak menggunakanmwaa:

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

Anda mendapatkan pesan yang dikembalikan yang mengatakan:

No resources found in mwaa namespace.

Membuat dan melampirkan peran IAM untuk cluster Amazon EKS

Anda harus membuat peran IAM dan kemudian mengikatnya ke cluster Amazon EKS (k8s) sehingga dapat digunakan untuk otentikasi melalui IAM. Peran hanya digunakan untuk masuk ke cluster, dan tidak memiliki izin apa pun untuk panggilan konsol atau API.

Otentikasi dan izin

Peran ini hanya mengotentikasi ke cluster. Dalam ConfigMap mode, izin dalam cluster yang sebenarnya berasal dari Kubernetes Peran dan RoleBinding. Dalam mode API, izin berasal dari cakupan akses entri akses. Pastikan Anda menggunakan nama Kubernetes grup yang sama di kedua RoleBinding dan metode akses mana pun yang Anda pilih.

Buat peran baru untuk lingkungan Amazon MWAA menggunakan langkah-langkah di dalamPeran eksekusi Amazon MWAA. Namun, alih-alih membuat dan melampirkan kebijakan yang dijelaskan dalam topik tersebut, lampirkan kebijakan berikut:

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

Setelah Anda membuat peran, edit lingkungan Amazon MWAA Anda untuk menggunakan peran yang Anda buat sebagai peran eksekusi untuk lingkungan. Untuk mengubah peran, edit lingkungan yang akan digunakan. Anda memilih peran eksekusi di bawah Izin.

Masalah yang diketahui:

  • Ada masalah yang diketahui dengan ARN peran dengan subpath yang tidak dapat diautentikasi dengan Amazon EKS. Solusi untuk ini adalah membuat peran layanan secara manual daripada menggunakan yang dibuat oleh Amazon MWAA itu sendiri. Untuk mempelajari lebih lanjut, lihat Per an dengan jalur tidak berfungsi ketika jalur disertakan dalam ARN mereka di configmap aws-auth

  • Jika daftar layanan Amazon MWAA tidak tersedia di IAM, Anda harus memilih kebijakan layanan alternatif, seperti Amazon EC2, dan kemudian memperbarui kebijakan kepercayaan peran agar sesuai dengan yang berikut ini:

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

    Untuk mempelajari selengkapnya, lihat Cara menggunakan kebijakan kepercayaan dengan peran IAM.

Buat file requirements.txt

Untuk menggunakan kode sampel di bagian ini, pastikan Anda telah menambahkan salah satu opsi database berikut kerequirements.txt. Untuk mempelajari lebih lanjut, lihatMenginstal dependensi Python.

kubernetes apache-airflow-providers-cncf-kubernetes

Berikan akses peran eksekusi Amazon MWAA ke cluster

Cara Anda memberikan akses peran eksekusi Amazon MWAA ke cluster bergantung pada mode otentikasi cluster (lihat catatan diBuat cluster). Ikuti jalur yang cocok dengan cluster Anda.

Opsi A-mode API: buat entri akses EKS

Jika cluster Anda menggunakan mode API_AND_CONFIG_MAP otentikasi API or, buat entri akses untuk peran eksekusi Amazon MWAA. Ganti nama cluster Wilayah AWS, dan peran ARN dengan nilai-nilai Anda.

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

mwaa-serviceGrup harus cocok dengan subjects grup yang dirujuk oleh yang RoleBinding Anda buatBuat peran untuk namespace mwaa. Ini mengikat peran eksekusi ke mwaa-role izin di mwaa namespace.

Untuk mengonfirmasi bahwa Anda membuat entri akses:

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

Opsi B— ConfigMap mode: buat pemetaan identitas

Jika cluster Anda menggunakan mode API_AND_CONFIG_MAP otentikasi CONFIG_MAP atau, buat pemetaan identitas. Ini menulis entri ke cluster aws-auth ConfigMap. Langkah ini tidak berpengaruh pada cluster menggunakan mode API otentikasi.

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

--group mwaa-serviceNilai harus sesuai dengan subjek Grup di tempat yang RoleBinding Anda buatBuat peran untuk namespace mwaa. Ini mengikat peran eksekusi ke mwaa-role izin di mwaa namespace, konsisten dengan entri akses di Opsi A.

Buat kubeconfig

Gunakan perintah berikut untuk membuatkubeconfig:

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

Jika Anda menggunakan profil tertentu saat menjalankan, update-kubeconfig Anda perlu menghapus env: bagian yang ditambahkan ke file kube_config.yaml sehingga berfungsi dengan benar dengan Amazon MWAA. Untuk melakukannya, hapus yang berikut dari file dan kemudian simpan:

env: - name: AWS_PROFILE value: profile_name

Buat DAG

Gunakan contoh kode berikut untuk membuat file Python, seperti mwaa_pod_example.py untuk 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' )

Tambahkan DAG dan kube_config.yam l ke bucket Amazon S3

Masukkan DAG yang Anda buat dan kube_config.yaml file ke dalam bucket Amazon S3 untuk lingkungan Amazon MWAA. Anda dapat memasukkan file ke dalam bucket Anda menggunakan konsol Amazon S3 atau AWS Command Line Interface.

Aktifkan dan memicu contoh

Di Apache Airflow, aktifkan contoh dan kemudian picu.

Setelah berjalan dan selesai dengan sukses, gunakan perintah berikut untuk memverifikasi pod:

kubectl get pods -n mwaa

Anda mendapatkan output yang mirip dengan berikut ini:

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

Anda kemudian dapat memverifikasi output dari pod dengan perintah berikut. Ganti nilai nama dengan nilai yang dikembalikan dari perintah sebelumnya:

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