View a markdown version of this page

Amazon EKS에서 Amazon MWAA 사용 - Amazon Managed Workflows for Apache Airflow

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon EKS에서 Amazon MWAA 사용

다음 샘플은 Amazon EKS와 함께 Amazon Managed Workflows for Apache Airflow를 사용하는 방법을 보여줍니다.

버전

이 페이지의 코드 예제는 Python 3.10Apache Airflow v2Python 3.11Apache Airflow v3에서 사용할 수 있습니다.

사전 조건

이 항목의 예제를 사용하려면 다음이 필요합니다.

참고

eksctl 명령을 사용할 때 --profile를 포함하여 기본값 이외의 프로필을 지정할 수 있습니다.

Amazon EC2용 퍼블릭 키 생성

다음 명령을 사용하여 프라이빗 키 페어에서 퍼블릭 키를 생성합니다.

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

자세한 내용은 키 페어에 대한 퍼블릭 키 검색을 참조하세요.

클러스터 생성

다음 명령을 사용하여 클러스터를 생성합니다. 클러스터에 사용자 지정 이름을 지정하거나 다른 리전에 생성하려면 이름 및 리전 값을 바꿉니다. Amazon MWAA 환경을 생성하는 동일한 리전에서 클러스터를 생성해야 합니다. Amazon MWAA에 사용하는 Amazon VPC 네트워크의 서브넷과 일치하도록 서브넷 값을 바꿉니다. ssh-public-key의 값을 사용하는 키와 일치하도록 바꿉니다. 동일한 리전에 있는 Amazon EC2의 기존 키를 사용하거나 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"

클러스터 생성을 완료하는 데 시간이 걸립니다. 완료되면 다음 명령을 사용하여 클러스터가 성공적으로 생성되었고 IAM OIDC 공급자가 구성되어 있는지 확인할 수 있습니다.

eksctl utils associate-iam-oidc-provider \ --region us-west-2 \ --cluster mwaa-eks \ --approve
EKS 클러스터 인증 모드

Amazon EKS는 API, 및 API_AND_CONFIG_MAP의 세 가지 클러스터 인증 모드를 지원합니다CONFIG_MAP. 모드는 Amazon MWAA 실행 역할에 클러스터에 대한 액세스 권한을 부여하는 방법을 결정합니다.

클러스터의 현재 모드를 확인하려면:

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

여기에 표시된 eksctl 명령을 사용하여 클러스터를 생성하는 경우 나중에 모드를 확인합니다. 모드가 인 경우 APIConfigMap 단계 대신 액세스 항목 단계를 따릅니다.

mwaa 네임스페이스 생성

클러스터가 성공적으로 생성되었는지 확인한 후 다음 명령을 사용하여 포드에 대한 네임스페이스를 생성합니다.

kubectl create namespace mwaa

mwaa 네임스페이스에 대한 역할 생성

네임스페이스를 생성한 후, MWAA 네임스페이스에서 포드를 실행할 수 있는 EKS의 Amazon MWAA 사용자에 대한 역할 및 역할 바인딩을 생성합니다. 네임스페이스에 다른 이름을 사용한 경우 -n mwaa의 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

다음 명령을 실행하여 새 역할이 Amazon EKS 클러스터에 액세스할 수 있는지 확인합니다. mwaa를 사용하지 않았다면 반드시 올바른 이름을 사용하세요.

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

다음과 같은 메시지가 표시됩니다.

No resources found in mwaa namespace.

Amazon EKS 클러스터에 대한 IAM 역할 생성 및 연결

IAM 역할을 생성한 다음 Amazon EKS(k8s) 클러스터에 바인딩해야 IAM을 통한 인증에 사용할 수 있습니다. 역할은 클러스터에 로그인하는 데만 사용되며 콘솔 또는 API 호출에 대한 권한은 없습니다.

인증 및 권한

이 역할은 클러스터에만 인증합니다. ConfigMap 모드에서 실제 클러스터 내 권한은 Kubernetes 역할 및 RoleBinding에서 가져옵니다. API 모드에서 권한은 액세스 항목의 액세스 범위에서 가져옵니다. RoleBinding과 선택한 액세스 방법 모두에서 동일한 Kubernetes 그룹 이름을 사용해야 합니다.

Amazon MWAA 실행 역할의 단계를 사용하여 Amazon MWAA 환경을 위한 새 역할을 생성합니다. 하지만 해당 항목에 설명된 정책을 생성하고 첨부하는 대신 다음 정책을 첨부하세요.

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

역할을 생성한 후 Amazon MWAA 환경을 편집하여 생성한 역할을 환경의 실행 역할로 사용합니다. 역할을 변경하려면 사용할 환경을 편집합니다. 권한에서 실행 역할을 선택합니다.

알려진 문제:

  • Amazon EKS로 인증할 수 없는 하위 경로가 있는 역할 ARN에 알려진 문제가 있습니다. 이에 대한 해결 방법은 Amazon MWAA에서 자체적으로 생성한 서비스 역할을 사용하는 대신 서비스 역할을 수동으로 생성하는 것입니다. 자세한 내용은 aws-auth configmap의 ARN에 경로가 포함된 경우 경로가 있는 역할이 작동하지 않음을 참조하세요.

  • IAM에서 Amazon MWAA 서비스 목록을 사용할 수 없는 경우 Amazon EC2와 같은 대체 서비스 정책을 선택한 다음, 역할의 신뢰 정책을 다음과 일치하도록 업데이트해야 합니다.

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

    자세한 내용은 IAM 역할에 신뢰 정책을 사용하는 방법을 참조하세요.

requirements.txt 파일 생성

이 섹션의 샘플 코드를 사용하려면 다음 데이터베이스 옵션 중 하나를 requirements.txt에 추가했는지 확인합니다. 자세한 내용은 Python 종속성 설치 섹션을 참조하세요.

kubernetes apache-airflow-providers-cncf-kubernetes

Amazon MWAA 실행 역할에 클러스터에 대한 액세스 권한 부여

Amazon MWAA 실행 역할에 클러스터에 대한 액세스 권한을 부여하는 방법은 클러스터의 인증 모드에 따라 다릅니다(의 참고 사항 참조클러스터 생성). 클러스터와 일치하는 경로를 따릅니다.

옵션 A - API 모드: EKS 액세스 항목 생성

클러스터가 API 또는 API_AND_CONFIG_MAP 인증 모드를 사용하는 경우 Amazon MWAA 실행 역할에 대한 액세스 항목을 생성합니다. AWS 리전, 클러스터 이름 및 역할 ARN을 값으로 바꿉니다.

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-service 그룹은에서 생성한 RoleBinding에서 참조하는 subjects 그룹과 일치해야 합니다mwaa 네임스페이스에 대한 역할 생성. 이렇게 하면 실행 역할이 mwaa 네임스페이스의 mwaa-role 권한에 바인딩됩니다.

액세스 항목을 생성했는지 확인하려면:

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

옵션 B -ConfigMap 모드: 자격 증명 매핑 생성

클러스터가 CONFIG_MAP 또는 API_AND_CONFIG_MAP 인증 모드를 사용하는 경우 자격 증명 매핑을 생성합니다. 그러면 클러스터의 aws-auth ConfigMap에 항목이 기록됩니다. 이 단계는 API 인증 모드를 사용하는 클러스터에는 영향을 주지 않습니다.

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-service 값은에서 생성한 RoleBinding의 그룹 제목과 일치해야 합니다mwaa 네임스페이스에 대한 역할 생성. 이렇게 하면 실행 역할이 mwaa 옵션 A의 액세스 항목에 따라 네임스페이스의 mwaa-role 권한에 바인딩됩니다.

kubeconfig 생성

다음 명령을 실행해 kubeconfig을 생성합니다.

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

update-kubeconfig 실행 시 특정 프로필을 사용한 경우 kube_config.yaml 파일에 추가된 env: 섹션을 제거해야 Amazon MWAA에서 제대로 작동할 수 있습니다. 이렇게 하려면 파일에서 다음을 삭제한 다음 저장합니다.

env: - name: AWS_PROFILE value: profile_name

DAG 생성

다음 코드 예제를 사용하여 DAG에 대한 mwaa_pod_example.py와 같은 Python 파일을 만듭니다.

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

Amazon S3 버킷에 DAG 및 kube_config.yaml 추가

생성한 DAG와 kube_config.yaml 파일을 Amazon MWAA 환경용 Amazon S3 버킷에 넣습니다. Amazon S3 콘솔 또는 AWS Command Line Interface를 사용하여 파일을 버킷에 넣을 수 있습니다.

예제 활성화 및 트리거

Apache Airflow에서 예제를 활성화한 다음 트리거합니다.

성공적으로 실행되고 완료되면 다음 명령을 사용하여 포드를 확인합니다.

kubectl get pods -n mwaa

출력은 다음과 비슷합니다.

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

이후 다음 명령을 사용하여 포드의 출력을 확인할 수 있습니다. 이름 값을 이전 명령에서 반환된 값으로 바꿉니다.

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