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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊MWAA执行角色

执行角色是一个 AWS Identity and Access Management (IAM) 角色,其权限策略授予亚马逊托管工作流程 Apache Airflow 的权限,允许其代表您调用其他 AWS 服务的资源。这可能包括诸如您的 Amazon S3 存储桶、AWS 自有密钥和 CloudWatch 日志之类的资源。Amazon MWAA 环境需要每个环境一个执行角色。本主题介绍如何使用和配置环境的执行角色,以允许 Amazon MWAA 访问您的环境使用的其他 AWS 资源。

执行角色概述

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

  • 亚马逊 CloudWatch (CloudWatch) — 发送 Apache Airflow 指标和日志。

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

  • 亚马逊简单队列服务 (AmazonSQS) — 在亚马逊拥有的亚马逊队列中对环境的 Apache Airflow 任务进行SQS排队。MWAA

  • AWS Key Management Service (AWS KMS) — 用于环境的数据加密(使用AWS 自有密钥客户管理的密钥)。

    注意

    如果您选择MWAA让亚马逊使用 AWS 自有KMS密钥来加密您的数据,则必须在附加到您的亚马逊MWAA执行角色的策略中定义权限,该策略允许通过亚马逊访问存储在您账户之外的任意KMS密钥SQS。您的环境的执行角色需要满足以下两个条件才能访问任意KMS密钥:

    • 第三方账户中的KMS密钥需要通过其资源策略允许跨账户访问。

    • 您的DAG代码需要访问以第三方账户开头的 Amazon SQS 队列,并使用相同的KMS密钥进行加密。airflow-celery-

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

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

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

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

默认情况下附加的权限

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

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

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

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

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

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

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

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

假设执行角色已与您的环境相关联,Amazon MWAA 可以立即开始使用添加的权限策略。这也意味着,如果您从执行角色中删除任何必需的权限,则DAGs可能会失败。

如何关联新的执行角色

您可以随时更改环境的执行角色。如果新的执行角色尚未与环境关联,请使用本页上的步骤创建新的执行角色策略,并将该角色与环境相关联。

创建新角色

默认情况下,Amazon MWAA 会代表您创建用于数据加密的AWS 自有密钥和执行角色。创建环境时,您可以在 Amazon MWAA 控制台上选择默认选项。下图显示了为环境创建执行角色的默认选项。

这是一张带有创建新角色的默认选项的镜像。

查看和更新执行角色策略

您可以在 Amazon MWAA 控制台上查看您的环境的执行角色,并在控制台上更新该角色的JSONIAM策略。

要更新执行角色策略,请执行以下操作
  1. 在 Amazon MWAA 控制台上打开 “环境” 页面

  2. 选择环境。

  3. 在 “权限” 窗格上选择执行角色以打开权限页面IAM。

  4. 选择执行角色名称以打开权限策略。

  5. 选择编辑策略

  6. 选择JSON选项卡。

  7. 更新您的JSON政策。

  8. 选择查看策略

  9. 选择 Save changes(保存更改)

附加使用其他 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 存储桶的访问权限

您可能需要使用 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 存储桶和亚马逊环境。MWAA

我们建议复制示例策略,替换示例ARNs或占位符,然后使用该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-env.amazonaws.com"服务主体添加到"airflow.amazonaws.com"该执行角色的可信实体列表中来完成,或者使用使用的 IAM create- role 命令将这些服务主体放入该执行角色的代入角色策略文档中。 AWS CLI可以在以下找到代入角色策略文档的示例:

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

然后将以下JSON策略附加到您的客户托管密钥。此策略使用kms:EncryptionContext条件键前缀来允许访问日志中的 CloudWatch 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" ] } } } ] }

接下来做什么?