Amazon MWAA 실행 역할 - Amazon Managed Workflows for Apache Airflow

Amazon MWAA 실행 역할

실행 역할은 사용자 대신 다른 AWS 서비스의 리소스를 호출할 수 있는 권한을 Amazon Managed Workflows for Apache Airflow에 부여하는 권한 정책이 포함된 AWS Identity and Access Management(IAM) 역할입니다. 여기에는 Amazon S3 버킷, AWS 소유 키, 및 CloudWatch Log와 같은 리소스가 포함될 수 있습니다. Amazon MWAA 환경에는 환경당 하나의 실행 역할이 필요합니다. 이 페이지에서는 Amazon MWAA가 사용자 환경에서 사용하는 다른 AWS 리소스에 액세스할 수 있도록 사용자 환경의 실행 역할을 사용하고 구성하는 방법을 설명합니다.

실행 역할 개요

Amazon MWAA에서 사용자 환경이 사용하는 다른 AWS 서비스를 사용할 수 있는 권한은 실행 역할에서 얻습니다. Amazon MWAA 실행 역할에는 환경에서 사용되는 다음 AWS 서비스에 대한 권한이 필요합니다.

  • Amazon CloudWatch(CloudWatch) - Apache Airflow 지표 및 로그를 전송합니다.

  • Amazon Simple Storage Service(S3) - 환경의 DAG 코드 및 지원 파일(예: requirements.txt)을 파싱합니다.

  • Amazon Simple Queue Service(Amazon SQS) - 환경의 Apache Airflow 작업을 Amazon MWAA에서 소유하고 있는 Amazon SQS 대기열에 저장합니다.

  • AWS Key Management Service(AWS KMS) - 환경의 데이터 암호화용(AWS 소유 키 또는 고객 관리형 키 사용).

    참고

    Amazon MWAA에서 AWS 소유 KMS 키를 사용하여 데이터를 암호화하도록 선택한 경우, Amazon MWAA 실행 역할에 연결된 정책에서 Amazon SQS를 통해 계정 외부에 저장된 임의의 KMS 키에 대한 액세스 권한을 부여하는 권한을 정의해야 합니다. 환경의 실행 역할이 임의의 KMS 키에 액세스하게 하려면 다음 두 가지 조건이 필요합니다.

    • 타사 계정의 KMS 키는 자체의 리소스 정책을 통해 이러한 크로스 계정 액세스를 허용해야 합니다.

    • DAG 코드는 타사 계정에서 airflow-celery-로 시작해야 하며 암호화에 동일한 KMS 키를 사용하는 Amazon SQS 대기열에 액세스해야 합니다.

    리소스에 대한 크로스 계정 액세스와 관련된 위험을 줄이려면, DAG에 배치된 코드를 검토하여 사용자의 워크플로가 사용자 계정 외부 임의의 Amazon SQS 대기열에 액세스하지 않도록 하는 것이 좋습니다. 또한, 사용자 계정에 저장된 고객 관리형 KMS 키를 사용하여 Amazon MWAA에서 암호화를 관리할 수 있습니다. 이로 인해 사용자 환경의 실행 역할이 사용자 계정의 KMS 키에만 액세스하는 것으로 제한됩니다.

    암호화 옵션을 선택한 후에는 기존 환경에 대한 선택사항을 변경할 수 없다는 점에 유의하십시오.

실행 역할에는 다음과 같은 IAM 작업에 대한 권한도 필요합니다.

  • airflow:PublishMetrics— Amazon MWAA에서 환경의 상태를 모니터링할 수 있도록 합니다.

권한은 기본적으로 연결됩니다.

Amazon MWAA 콘솔의 기본 옵션을 사용하여 실행 역할과 AWS 소유 키를 생성한 다음 이 페이지의 단계를 이용하여 사용자의 실행 역할에 권한 정책을 추가할 수 있습니다.

  • 콘솔에서 새 역할 생성 옵션을 선택하면 Amazon MWAA에서 환경에 필요한 최소 권한을 사용자의 실행 역할에 부여합니다.

  • 경우에 따라, Amazon MWAA에서 최대 권한을 부여하기도 합니다. 예를 들면, 환경을 만들 때는 Amazon MWAA 콘솔에서 실행 역할을 생성하는 옵션을 선택하는 것이 좋습니다. Amazon MWAA는 실행 역할의 정규식(regex) 패턴을 "arn:aws:logs:your-region:your-account-id:log-group:airflow-your-environment-name-*"로 사용하여 모든 CloudWatch Log 그룹에 대해 권한 정책을 자동으로 추가합니다.

다른 AWS 서비스 사용을 위한 권한을 추가하는 방법

Amazon MWAA는 환경이 만들어진 후에는 기존 실행 역할에 권한 정책을 추가하거나 편집할 수 없습니다. 사용자는 환경에 필요한 추가 권한 정책으로 실행 역할을 업데이트해야 합니다. 예를 들면, DAG에서 AWS Glue에 대한 액세스가 필요할 경우, Amazon MWAA는 사용자의 환경에 이러한 권한이 필요한지 자동으로 감지하거나 실행 역할에 권한을 추가할 수 없습니다.

다음 두 가지 방법으로 실행 역할에 권한을 추가할 수 있습니다.

  • 실행 역할에 필요한 JSON 정책을 인라인으로 수정하는 방법 이 페이지의 샘플 JSON 정책 문서를 사용하여 IAM 콘솔에서 실행 역할의 JSON 정책을 추가하거나 바꿀 수 있습니다.

  • AWS서비스에 대한 JSON 정책을 생성하여 실행 역할에 연결하는 방법 이 페이지의 단계를 사용하여 AWS 서비스의 새로운 JSON 정책 문서를 IAM 콘솔의 실행 역할에 연결할 수 있습니다.

실행 역할이 이미 환경에 연결되어 있다고 가정하면, Amazon MWAA는 추가된 권한 정책을 즉시 사용할 수 있습니다. 즉, 실행 역할에서 필요한 권한을 제거하면 DAG가 실패할 수 있음을 의미하는 것이기도 합니다.

새 실행 역할을 연결하는 방법

언제든지 사용자 환경의 실행 역할을 변경할 수 있습니다. 새 실행 역할이 아직 사용자의 환경에 연결되지 않은 경우, 이 페이지의 단계를 사용하여 새 실행 역할 정책을 만들고 해당 역할을 환경에 연결합니다.

새 역할 생성

기본 설정으로, Amazon MWAA는 사용자를 대신하여 데이터 암호화를 위한 AWS 소유 키 및 실행 역할을 생성합니다. 환경을 생성할 때는 Amazon MWAA 콘솔에서 기본 옵션을 선택할 수 있습니다. 다음 이미지는 환경에 대한 실행 역할을 생성하기 위한 기본 옵션을 보여줍니다.

새 역할을 생성할 수 있는 기본 옵션이 있는 이미지입니다.

실행 역할 정책 보기 및 업데이트

Amazon MWAA 콘솔에서 사용자 환경의 실행 역할을 확인하고, IAM 콘솔에서 그 역할에 대한 JSON 정책을 업데이트할 수 있습니다.

실행 역할 정책 업데이트
  1. Amazon MWAA 콘솔에서 환경 페이지를 엽니다.

  2. 환경을 선택합니다.

  3. IAM에서 권한 페이지를 열려면 권한 창에서 실행 역할을 선택합니다.

  4. 실행 역할 이름을 선택하여 권한 정책을 엽니다.

  5. 정책 편집을 선택합니다.

  6. JSON 탭을 선택합니다.

  7. JSON 정책을 업데이트합니다.

  8. 정책 검토를 선택합니다.

  9. 변경 사항 저장을 선택합니다.

다른 AWS 서비스를 사용하려면 JSON 정책을 첨부합니다.

AWS 서비스에 대한 JSON 정책을 생성하여 사용자의 실행 역할에 추가할 수 있습니다. 예를 들면, 다음 JSON 정책을 연결하여 AWS Secrets Manager에 있는 모든 리소스에 읽기 전용 액세스 권한을 부여할 수 있습니다.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource":[ "*" ] } ] }
실행 역할에 대한 정책 연결
  1. Amazon MWAA 콘솔에서 환경 페이지를 엽니다.

  2. 환경을 선택합니다.

  3. 권한 창에서 실행 역할을 선택합니다.

  4. 정책 연결을 선택합니다.

  5. 정책 생성을 선택합니다.

  6. JSON을 선택합니다.

  7. JSON 정책을 붙여넣습니다.

  8. 다음: 태그를 선택한 후 다음: 검토를 선택합니다.

  9. 정책의 이름(예: SecretsManagerReadPolicy)과 설명을 입력합니다.

  10. 정책 생성을 선택합니다.

Amazon S3 버킷에 대한 액세스 권한을 계정 수준의 퍼블릭 액세스 차단으로 부여합니다.

PutPublicAccessBlockAmazon S3 작업을 사용하여 계정의 모든 버킷에 대한 액세스를 차단하는 것이 좋을 수 있습니다. 계정의 모든 버킷에 대한 액세스를 차단할 때는 사용자의 환경 실행 역할은 권한 정책에 s3:GetAccountPublicAccessBlock 작업이 포함되게 해야 합니다.

다음 예는 계정의 모든 Amazon S3 버킷에 대한 액세스를 차단할 때 사용자의 실행 역할에 연결해야 하는 정책을 보여줍니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetAccountPublicAccessBlock", "Resource": "*" } ] }

Amazon S3 버킷에 대한 액세스를 제한하는 방법에 대한 자세한 내용은 Amazon Simple Storage Service 사용 설명서Amazon S3 Storage에 대한 퍼블릭 액세스 차단을 참조하십시오.

Apache Airflow 연결 사용

또한 Apache Airflow 연결을 만들고 Apache Airflow 연결 객체에 실행 역할과 해당 ARN을 지정할 수 있습니다. 자세한 내용은 Apache Airflow에 대한 연결 관리 섹션을 참조하십시오.

실행 역할에 대한 샘플 JSON 정책

이 섹션의 샘플 권한 정책은 기존 실행 역할에 사용된 권한 정책을 대체하거나 새 실행 역할을 생성하여 사용자 환경에 사용할 수 있는 두 가지 정책을 보여줍니다. 이러한 정책에는 Apache Airflow 로그 그룹, Amazon S3 버킷Amazon MWAA 환경에 대한 리소스 ARN 자리 표시자가 포함되어 있습니다.

예제 정책을 복사하여 샘플 ARN 또는 자리 표시자를 교체한 다음, JSON 정책을 사용하여 실행 역할을 생성하거나 업데이트하는 것이 좋습니다. 예를 들면, {your-region}us-east-1로 바꾸는 경우가 있습니다.

고객 관리형 키에 대한 샘플 정책

다음 예는 고객 관리형 키에 사용할 수 있는 실행 역할 정책을 보여줍니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:ListAllMyBuckets", "Resource": [ "arn:aws:s3:::{your-s3-bucket-name}", "arn:aws:s3:::{your-s3-bucket-name}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:GetBucket*", "s3:List*" ], "Resource": [ "arn:aws:s3:::{your-s3-bucket-name}", "arn:aws:s3:::{your-s3-bucket-name}/*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents", "logs:GetLogEvents", "logs:GetLogRecord", "logs:GetLogGroupFields", "logs:GetQueryResults" ], "Resource": [ "arn:aws:logs:{your-region}:{your-account-id}:log-group:airflow-{your-environment-name}-*" ] }, { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "s3:GetAccountPublicAccessBlock" ], "Resource": [ "*" ] }, { "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:{your-region}:*:airflow-celery-*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt" ], "Resource": "arn:aws:kms:{your-region}:{your-account-id}:key/{your-kms-cmk-id}", "Condition": { "StringLike": { "kms:ViaService": [ "sqs.{your-region}.amazonaws.com", "s3.{your-region}.amazonaws.com" ] } } } ] }

다음으로, Amazon MWAA에서 이 역할을 맡도록 허용하여 사용자를 대신해서 작업을 수행할 수 있게 해야 합니다. 이를 위해서는 IAM 콘솔을 사용하여 이 실행 역할의 신뢰할 수 있는 객체 목록에 "airflow.amazonaws.com""airflow-env.amazonaws.com" 서비스 주체를 추가하거나, AWS CLI를 사용하여 IAM Create-Role 명령을 통해 이 실행 역할에 대한 역할 수임 정책 문서에 이러한 서비스 주체를 배치하면 됩니다. 역할 가정 정책 문서의 예는 다음과 같습니다.

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

이어서, 다음 JSON 정책을 고객 관리형 키에 연결합니다. 이 정책은 kms:EncryptionContext 조건 키 접두사를 사용하여 CloudWatch Log의 Apache Airflow 로그 그룹에 대한 액세스를 허용합니다.

{ "Sid": "Allow logs access", "Effect": "Allow", "Principal": { "Service": "logs.{your-region}.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:{your-region}:{your-account-id}:*" } } }

AWS 소유 키에 대한 샘플 정책

다음 예시는 AWS 소유 키에 사용할 수 있는 실행 역할 정책을 보여줍니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "airflow:PublishMetrics", "Resource": "arn:aws:airflow:{your-region}:{your-account-id}:environment/{your-environment-name}" }, { "Effect": "Deny", "Action": "s3:ListAllMyBuckets", "Resource": [ "arn:aws:s3:::{your-s3-bucket-name}", "arn:aws:s3:::{your-s3-bucket-name}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:GetBucket*", "s3:List*" ], "Resource": [ "arn:aws:s3:::{your-s3-bucket-name}", "arn:aws:s3:::{your-s3-bucket-name}/*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents", "logs:GetLogEvents", "logs:GetLogRecord", "logs:GetLogGroupFields", "logs:GetQueryResults" ], "Resource": [ "arn:aws:logs:{your-region}:{your-account-id}:log-group:airflow-{your-environment-name}-*" ] }, { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "s3:GetAccountPublicAccessBlock" ], "Resource": [ "*" ] }, { "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:{your-region}:*:airflow-celery-*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt" ], "NotResource": "arn:aws:kms:*:{your-account-id}:key/*", "Condition": { "StringLike": { "kms:ViaService": [ "sqs.{your-region}.amazonaws.com" ] } } } ] }

다음 단계