Amazon MWAA 执行角色 - Amazon Managed Workflows for Apache Airflow

Amazon MWAA 执行角色

执行角色是一个 AWS Identity and Access Management (IAM) 角色,其权限策略授予 Amazon MWAA 代表您调用其他 AWS 服务资源的权限。这可能包括诸如 Amazon S3 存储桶、AWS 自有密钥和 CloudWatch Logs 之类的资源。Amazon MWAA 环境需要每个环境配备一个执行角色。本页介绍如何使用和配置环境的执行角色,以允许 Amazon MWAA 访问环境所用的其他 AWS 资源。

执行角色概述

Amazon MWAA 使用环境所用的其他 AWS 服务的权限是通过执行角色获得的。Amazon MWAA 执行角色需要获得环境所用的以下 AWS 服务的权限:

  • Amazon CloudWatch(CloudWatch)— 用于发送 Apache Airflow 指标和日志。

  • Amazon Simple Storage Service(Amazon S3)— 用于解析环境的 DAG 代码和支持文件(例如,requirements.txt)。

  • Amazon Simple Queueue Service(Amazon SQS)— 将环境的 Amazon 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- 开头的 Amazon SQS 队列,该队列使用相同的 KMS 密钥进行加密。

    为了降低与跨账户访问资源相关的风险,我们建议您查看 DAG 中的代码,确保工作流程不会访问账户之外的任意 Amazon SQS 队列。此外,您可以使用存储在您自己账户中的由客户托管的 KMS 密钥来管理 Amazon MWAA 上的加密。这将环境的执行角色限制为只能访问您账户中的 KMS 密钥。

    请记住,在选择加密选项后,您无法更改现有环境的选择。

执行角色还需要获得以下 IAM 操作的权限:

  • airflow:PublishMetrics — 允许 Amazon MWAA 监控环境的运行状况。

默认情况下附加的权限

您可以使用 Amazon MWAA 控制台上的默认选项来创建执行角色和 AWS 自有的密钥,然后使用本页上的步骤将权限策略添加到执行角色。

  • 当您在控制台上选择创建新角色选项时,Amazon MWAA 会将环境所需的最低权限附加到执行角色。

  • 在某些情况下,Amazon MWAA 会附加最高权限。例如,我们建议您在创建环境时在 Amazon MWAA 控制台上选择创建执行角色的选项。Amazon MWAA 通过在执行角色中使用正则表达式模式作为 "arn:aws:logs:your-region:your-account-id:log-group:airflow-your-environment-name-*" 自动为所有 CloudWatch Logs 组添加权限策略

如何添加使用其他 AWS 服务的权限

创建环境后,Amazon MWAA 无法向现有执行角色添加或编辑权限策略。您必须使用环境所需的其他权限策略来更新执行角色。例如,如果 DAG 需要访问权限 AWS Glue,则 Amazon MWAA 无法自动检测到环境需要这些权限,也无法将这些权限添加到执行角色中。

您可以通过两种方式为执行角色添加权限:

  • 通过内联修改执行角色的 JSON 策略。您可以使用本页上的 JSON 策略文档在 IAM 控制台上添加或替换执行角色的 JSON 策略。

  • 为 AWS 服务创建 JSON 策略并将其附加到执行角色。您可以使用本页上的步骤在 IAM 控制台上将 AWS 服务的新的 JSON 策略文档关联到执行角色。

假设执行角色已关联到环境,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. 选择 Save changes(保存更改)

附加 JSON 策略以使用其他 AWS 服务

您可以为 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 存储桶的访问权限

您可能需要使用 PutPublicAccessBlock Amazon S3 操作来阻止访问您账户中的所有存储桶。当您阻止访问您账户中的所有存储桶时,环境执行角色必须在权限策略中包含该 s3:GetAccountPublicAccessBlock 操作。

以下示例演示了在阻止访问您账户中的所有 Amazon S3 存储桶时必须附加到执行角色的策略。

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

关于限制对 Amazon S3 存储桶的访问权限的更多信息,请参阅 《Amazon Simple Storage Service 用户指南》中的阻止对 Amazon S3 存储的公有访问

使用 Apache Airflow 连接

您还可以创建 Apache Airflow 连接,并在 Apache Airflow 连接对象中指定执行角色及其 ARN。要了解更多信息,请参阅 管理与 Apache Airflow 的连接

执行角色的 JSON 策略示例

本节中的示例权限策略显示了两个策略,您可以使用它们来替换用于现有执行角色的权限策略,或者用于创建新的执行角色并用于环境。这些策略包含 Apache Airflow 日志组的资源 ARN 占位符、Amazon S3 存储桶Amazon MWAA 环境

我们建议复制示例策略,替换示例 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 Logs 中的 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" ] } } } ] }

接下来做什么?