

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

# Amazon MWAA 执行角色
<a name="mwaa-create-role"></a>

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

**Contents**
+ [执行角色概述](#mwaa-create-role-how)
  + [默认情况下附加的权限](#mwaa-create-role-how-create-role)
  + [如何添加使用其他 AWS 服务的权限](#mwaa-create-role-how-adding)
  + [如何关联新的执行角色](#mwaa-create-role-how-associating)
+ [创建新角色](#mwaa-create-role-mwaa-onconsole)
+ [访问和更新执行角色策略](#mwaa-create-role-update)
  + [附加 JSON 策略以使用其他 AWS 服务](#mwaa-create-role-attach-json-policy)
+ [使用账户级公有访问阻止授予对 Amazon S3 存储桶的访问权限](#mwaa-create-role-s3-publicaccessblock)
+ [使用 Apache Airflow 连接](#mwaa-create-role-airflow-connections)
+ [执行角色的 JSON 策略示例](#mwaa-create-role-json)
  + [由客户托管的密钥的示例策略](#mwaa-create-role-cmk)
  + [AWS自有密钥的策略示例](#mwaa-create-role-aocmk)
+ [接下来做什么？](#mwaa-create-role-next-up)

## 执行角色概述
<a name="mwaa-create-role-how"></a>

Amazon MWAA 使用您的环境使用的其他 AWS 服务的权限来自执行角色。Amazon MWAA 执行角色需要获得环境使用的以下 AWS 服务的权限：
+ 亚马逊 CloudWatch (CloudWatch) — 发送 Apache Airflow 指标和日志。
+ Amazon Simple Storage Service（Amazon S3）— 用于解析环境的 DAG 代码和支持文件（例如，`requirements.txt`）。
+ Amazon Simple Queue Service（Amazon SQS）— 将环境的 Amazon Airflow 任务在 Amazon MWAA 所拥有的 Amazon SQS 队列中排队。
+ AWS Key Management Service (AWS KMS) — 用于环境的数据加密（使用[AWS自有密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)或[客户管理的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)）。
**注意**  
如果您选择让 Amazon MWAA 使用 AWS 拥有的 KMS 密钥来加密您的数据，则必须在附加到您的 Amazon MWAA 执行角色的策略中定义权限，该策略允许通过 Amazon SQS 访问存储在您账户之外的任意 KMS 密钥。环境的执行角色需要满足以下两个条件才能访问任意 KMS 密钥：  
第三方账户中的 KMS 密钥需要通过其资源策略允许跨账户访问。
DAG 代码需要访问在第三方账户中以 `airflow-celery-` 开头的 Amazon SQS 队列，该队列使用相同的 KMS 密钥进行加密。
为了降低与跨账户访问资源相关的风险，我们建议您查看您的代码，确保您的 DAGs工作流程不会访问您账户之外的任意 Amazon SQS 队列。此外，您可以使用存储在您自己账户中的由客户托管的 KMS 密钥来管理 Amazon MWAA 上的加密。这将环境的执行角色限制为只能访问您账户中的 KMS 密钥。  
请记住，在选择加密选项后，您无法更改现有环境的选择。

执行角色还需要获得以下 IAM 操作的权限：
+ `airflow:PublishMetrics` — 允许 Amazon MWAA 监控环境的运行状况。

### 默认情况下附加的权限
<a name="mwaa-create-role-how-create-role"></a>

您可以使用 Amazon MWAA 控制台上的默认选项来创建执行角色和 [AWS自有的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)，然后使用本页上的步骤将权限策略添加到执行角色。
+ 当您在控制台上选择**创建新角色**选项时，Amazon MWAA 会将环境所需的最低权限附加到执行角色。
+ 在某些情况下，Amazon MWAA 会附加最高权限。例如，我们建议您在创建环境时在 Amazon MWAA 控制台上选择创建执行角色的选项。Amazon MWAA 通过在执行角色中使用正则表达式模式自动为所有 CloudWatch 日志组添加权限策略。`"arn:aws:logs:{{us-east-1}}:{{111122223333}}:log-group:{{airflow-your-environment-name-*}}"`

### 如何添加使用其他 AWS 服务的权限
<a name="mwaa-create-role-how-adding"></a>

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

您可以通过两种方式为执行角色添加权限：
+ 通过内联修改执行角色的 JSON 策略。您可以使用本页上的 [JSON 策略文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html)在 IAM 控制台上添加或替换执行角色的 JSON 策略。
+ 为 AWS 服务创建 JSON 策略并将其附加到您的执行角色。您可以使用此页面上的步骤在 IAM 控制台上将 AWS 服务的新的 JSON 策略文档与您的执行角色关联起来。

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

### 如何关联新的执行角色
<a name="mwaa-create-role-how-associating"></a>

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

## 创建新角色
<a name="mwaa-create-role-mwaa-onconsole"></a>

默认情况下，Amazon MWAA 会代表您创建用于数据加密的 [AWS自有密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)和执行角色。创建环境时，您可以在 Amazon MWAA 控制台上选择默认选项。下图显示了为环境创建执行角色的默认选项。

![这是一张带有创建新角色的默认选项的镜像。](http://docs.aws.amazon.com/zh_cn/mwaa/latest/userguide/images/mwaa-console-permissions.png)


**重要**  
创建新的执行角色时，请勿重复使用已删除的执行角色的名称。唯一的名称可以帮助防止冲突并确保正确的资源管理。

## 访问和更新执行角色策略
<a name="mwaa-create-role-update"></a>

您可以在 Amazon MWAA 控制台上访问环境的执行角色，并在 IAM 控制台上更新该角色的 JSON 策略。

**要更新执行角色策略，请执行以下操作**

1. 在 Amazon MWAA 控制台上打开[环境页面](https://console.aws.amazon.com/mwaa/home#/environments)。

1. 选择环境。

1. 在**权限**窗格上选择执行角色以在 IAM 中打开权限页面。

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

1. 选择**编辑策略**。

1. 选择 **JSON** 选项卡。

1. 更新 JSON 策略。

1. 选择**查看策略**。

1. 选择**保存更改**。

### 附加 JSON 策略以使用其他 AWS 服务
<a name="mwaa-create-role-attach-json-policy"></a>

您可以为 AWS 服务创建 JSON 策略并将其附加到您的执行角色。例如，您可以附加以下 JSON 策略，以授予对 AWS Secrets Manager中所有资源的只读访问权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "secretsmanager:GetResourcePolicy",
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret",
            "secretsmanager:ListSecretVersionIds"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}
```

------

**要将该策略附加到执行角色，请执行以下操作**

1. 在 Amazon MWAA 控制台上打开[环境页面](https://console.aws.amazon.com/mwaa/home#/environments)。

1. 选择环境。

1. 在**权限**窗格上选择执行角色。

1. 选择**附加策略**。

1. 选择**创建策略**。

1. 选择 **JSON**。

1. 粘贴 JSON 策略。

1. 选择**下一步：标签**，然后选择**下一步：审核**。

1. 输入策略的描述性名称（例如 `SecretsManagerReadPolicy`）和策略的描述。

1. 选择**创建策略**。

## 使用账户级公有访问阻止授予对 Amazon S3 存储桶的访问权限
<a name="mwaa-create-role-s3-publicaccessblock"></a>

您可能需要使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutPublicAccessBlock.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutPublicAccessBlock.html) Amazon S3 操作来阻止访问您账户中的所有存储桶。当您阻止访问您账户中的所有存储桶时，环境执行角色必须在权限策略中包含该 `s3:GetAccountPublicAccessBlock` 操作。

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

------
#### [ JSON ]

****  

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

------

关于限制对 Amazon S3 存储桶的访问权限的更多信息，请参阅 *《Amazon Simple Storage Service 用户指南》*中的[阻止对 Amazon S3 存储的公有访问](https://docs.aws.amazon.com/)。

## 使用 Apache Airflow 连接
<a name="mwaa-create-role-airflow-connections"></a>

您还可以创建 Apache Airflow 连接，并在 Apache Airflow 连接对象中指定执行角色及其 ARN。要了解更多信息，请参阅 [管理与 Apache Airflow 的连接](manage-connections.md)。

## 执行角色的 JSON 策略示例
<a name="mwaa-create-role-json"></a>

您可以使用本节中的两个示例权限策略替换用于现有执行角色的权限策略，或者创建新的执行角色并用于环境。这些策略包含 Apache Airflow 日志组的[资源 ARN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html) 占位符、[Amazon S3 存储桶](mwaa-s3-bucket.md)和 [Amazon MWAA 环境](create-environment.md)。

我们建议复制示例策略，替换示例 ARNs 或占位符，然后使用 JSON 策略创建或更新执行角色。

### 由客户托管的密钥的示例策略
<a name="mwaa-create-role-cmk"></a>

以下示例显示了可用于[由客户托管的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)的执行角色策略。

------
#### [ JSON ]

****  

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

------

接下来，您需要允许 Amazon MWAA 担任此角色以代表您执行操作。为此，可以[使用 IAM 控制台](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)将 `"airflow.amazonaws.com"` 和 `"airflow-env.amazonaws.com"` 服务主体添加到该执行角色的可信实体列表中，或者使用 AWS CLI通过 IAM [create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html) 命令将这些服务主体放入该执行角色的代入角色策略文档中。请参阅以下代入角色策略文档示例：

------
#### [ JSON ]

****  

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

------

然后将以下 JSON 策略附加到[由客户托管的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)中。此策略使用[https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context)条件键前缀来允许访问日志中的 Apache Airflow 日志组。 CloudWatch 

```
{
  "Sid": "Allow logs access",
  "Effect": "Allow",
  "Principal": {
    "Service": "logs.{{us-east-1}}.amazonaws.com"
  },
  "Action": [
    "kms:Encrypt*",
    "kms:Decrypt*",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:Describe*"
  ],
  "Resource": "*",
  "Condition": {
    "ArnLike": {
      {{"kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:{{us-east-1}}:{{111122223333}}:*"}}
    }
  }
}
```

### AWS自有密钥的策略示例
<a name="mwaa-create-role-aocmk"></a>

以下示例显示了您可用于[AWS自有密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)的执行角色策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "airflow:PublishMetrics",
            "Resource": "arn:aws:airflow:{{us-east-1}}:{{111122223333}}:environment/{your-environment-name}"
        },
        { 
            "Effect": "Deny",
            "Action": "s3:ListAllMyBuckets",
            "Resource": [
								{{"arn:aws:s3:::amzn-s3-demo-bucket"}},
								{{"arn:aws:s3:::amzn-s3-demo-bucket/*"}}
            ]
        },
        { 
            "Effect": "Allow",
            "Action": [ 
                "s3:GetObject*",
                "s3:GetBucket*",
                "s3:List*"
            ],
            "Resource": [
								{{"arn:aws:s3:::amzn-s3-demo-bucket"}},
								{{"arn:aws:s3:::amzn-s3-demo-bucket/*"}}
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "logs:GetLogEvents",
                "logs:GetLogRecord",
                "logs:GetLogGroupFields",
                "logs:GetQueryResults"
            ],
            "Resource": [
            "arn:aws:logs:{{us-east-1}}:{{111122223333}}: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:{{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"
                    ]
                }
            }
        }
    ]
}
```

------

## 接下来做什么？
<a name="mwaa-create-role-next-up"></a>
+ 要了解您和 Apache Airflow 用户访问环境所需的权限，请参阅 [访问 Amazon MWAA 环境](access-policies.md)。
+ 了解 [使用由客户托管的密钥进行加密](custom-keys-certs.md)。
+ 浏览更多[客户管理型策略示例](https://docs.aws.amazon.com/kms/latest/developerguide/customer-managed-policies.html)。