기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon EKS에서 Amazon MWAA 사용
다음 샘플은 Amazon EKS와 함께 Amazon Managed Workflows for Apache Airflow를 사용하는 방법을 보여줍니다.
주제
버전
-
이 페이지의 샘플 코드는 Python 3.7
의 Apache Airflow v1과 함께 사용할 수 있습니다.
-
이 페이지의 코드 예제는 Python 3.10
의 Apache Airflow v2에서 사용할 수 있습니다.
사전 조건
이 항목의 예제를 사용하려면 다음이 필요합니다.
-
eksctl. 자세한 내용은 eksctl 설치를 참조하십시오.
-
kubectl. 자세한 내용은 kubectl 설치 및 설정
을 참조하십시오. 경우에 따라 eksctl과 함께 설치되기도 합니다. -
Amazon MWAA 환경을 생성하는 리전의 EC2 키 페어입니다. 자세히 알아보려면 키 페어 생성 또는 가져오기를 참조하십시오.
참고
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.18 \ --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
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 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 호출에 대한 권한은 없습니다.
Amazon MWAA 실행 역할의 단계를 사용하여 Amazon MWAA 환경을 위한 새 역할을 생성합니다. 하지만 해당 항목에 설명된 정책을 생성하고 첨부하는 대신 다음 정책을 첨부하십시오.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "airflow:PublishMetrics", "Resource": "arn:aws:airflow:${MWAA_REGION}:${ACCOUNT_NUMBER}: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:${MWAA_REGION}:${ACCOUNT_NUMBER}: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:${MWAA_REGION}:*:airflow-celery-*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt" ], "NotResource": "arn:aws:kms:*:${ACCOUNT_NUMBER}:key/*", "Condition": { "StringLike": { "kms:ViaService": [ "sqs.${MWAA_REGION}.amazonaws.com" ] } } }, { "Effect": "Allow", "Action": [ "eks:DescribeCluster" ], "Resource": "arn:aws:eks:${MWAA_REGION}:${ACCOUNT_NUMBER}:cluster/${EKS_CLUSTER_NAME}" } ] }
역할을 생성한 후 Amazon MWAA 환경을 편집하여 생성한 역할을 환경의 실행 역할로 사용합니다. 역할을 변경하려면 사용할 환경을 편집합니다. 권한에서 실행 역할을 선택합니다.
알려진 문제:
-
Amazon EKS로 인증할 수 없는 하위 경로가 있는 역할 ARN에 알려진 문제가 있습니다. 이에 대한 해결 방법은 Amazon MWAA에서 자체적으로 생성한 서비스 역할을 사용하는 대신 서비스 역할을 수동으로 생성하는 것입니다. 자세히 알아보려면 aws-auth configmap의 ARN에 경로가 포함된 경우 경로가 있는 역할이 작동하지 않음
을 참조하십시오. -
IAM에서 Amazon MWAA 서비스 목록을 사용할 수 없는 경우 Amazon EC2와 같은 대체 서비스 정책을 선택한 다음, 역할의 신뢰 정책을 다음과 일치하도록 업데이트해야 합니다.
{ "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 종속성 설치 섹션을 참조하십시오.
Amazon EKS에 대한 자격 증명 매핑 생성
다음 명령에서 생성한 역할의 ARN을 사용하여 Amazon EKS에 대한 자격 증명 매핑을 생성합니다. 리전 your-region
을 사용자가 환경을 생성한 리전으로 바꿉니다. 역할의 ARN을 바꾸고, 마지막으로 mwaa-execution-role
을 사용자 환경의 실행 역할로 바꿉니다.
eksctl create iamidentitymapping \ --region
your-region
\ --cluster mwaa-eks \ --arn arn:aws:iam::111222333444
:role/mwaa-execution-role
\ --username mwaa-service
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 파일을 만듭니다.
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