

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

# 使用密钥配置 Apache Airflow 连接 AWS Secrets Manager
<a name="connections-secrets-manager"></a>

AWS Secrets Manager 是适用于 Apache Airflow 的亚马逊托管工作流程环境中支持的备用 Apache Airflow 后端。本主题介绍如何使用 AWS Secrets Manager 在 Apache Airflow 的亚马逊托管工作流程上安全地存储 Apache Airflow 变量和 Apache Airflow 连接的机密。

**注意**  
您需要为自己创建的密钥付费。有关 Secrets Manager 定价的更多信息，请参阅 [AWS 定价](https://aws.amazon.com/secrets-manager/pricing/)。
AWS 亚马逊 MWAA 还支持 S@@ [ystems Manager 参数存储](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store)作为机密后端。有关更多信息，请参阅 [Amazon 提供程序包文档](https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/secrets-backends/aws-ssm-parameter-store.html)。

**Contents**
+ [步骤 1：向 Amazon MWAA 提供访问 Secrets Manager 密钥的权限](#connections-sm-policy)
+ [步骤 2： 创建 Secrets Manager 后端作为 Apache Airflow 配置选项](#connections-sm-aa-configuration)
+ [第三步：生成 Apache A AWS irflow 连接 URI 字符串](#connections-sm-aa-uri)
+ [步骤 4：在 Secrets Manager 中添加变量](#connections-sm-createsecret-variables)
+ [步骤 5：在 Secrets Manager 中添加连接](#connections-sm-createsecret-connection)
+ [代码示例](#connections-sm-samples)
+ [资源](#connections-sm-blogs)
+ [接下来做什么？](#connections-sm-next-up)

## 步骤 1：向 Amazon MWAA 提供访问 Secrets Manager 密钥的权限
<a name="connections-sm-policy"></a>

您 Amazon MWAA 环境的[执行角色](mwaa-create-role.md)需要对 AWS Secrets Manager中的密钥具有读取权限。以下 IAM 策略允许使用 AWS托管[SecretsManagerReadWrite](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/SecretsManagerReadWrite$jsonEditor)策略进行读写访问。

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

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

1. 选择环境。

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

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

1. 在**筛选策略**文本字段中键入 `SecretsManagerReadWrite`。

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

如果您不想使用 AWS托管权限策略，则可以直接更新环境的执行角色以允许任何级别的访问您的 Secrets Manager 资源。例如，以下策略声明授予您在 Secrets Manager 中的特定密钥中创建的所有密钥 AWS 区域 的读取权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:*"
        },
        {
            "Effect": "Allow",
            "Action": "secretsmanager:ListSecrets",
            "Resource": "*"
        }
    ]
}
```

------

## 步骤 2： 创建 Secrets Manager 后端作为 Apache Airflow 配置选项
<a name="connections-sm-aa-configuration"></a>

以下部分介绍如何在亚马逊 MWAA 控制台上为后端创建 Apache Airflow 配置选项。 AWS Secrets Manager 如果您在 `airflow.cfg` 中使用同名的配置设置，则您在以下步骤中创建的配置将优先并覆盖配置设置。

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

1. 选择环境。

1. 选择**编辑**。

1. 选择**下一步**。

1. 在 **Airflow 配置选项**窗格中选择**添加自定义配置**。添加以下键值对：

   1. **`secrets.backend`**: **`airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend`**

   1. **`secrets.backend_kwargs`**：**`{"connections_prefix" : "airflow/connections", "variables_prefix" : "airflow/variables"}`**这将 Apache Airflow 配置为在 `airflow/connections/*` 和 `airflow/variables/*` 路径中搜索连接字符串和变量。

      您可以使用[查找模式](https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/secrets-backends/aws-secrets-manager.html#optional-lookup)来减少 Amazon MWAA 代表您向 Secrets Manager 调用 API 的次数。如果您未指定查找模式，Apache Airflow 会在已配置的后端中搜索所有连接和变量。通过指定模式，可以收窄 Apache Airflow 搜索的可能路径。这可以降低您在 Amazon MWAA 中使用 Secrets Manager 时的成本。

      要指定查找模式，请指定 `connections_lookup_pattern` 和 `variables_lookup_pattern` 参数。这些参数接受 RegEx 字符串作为输入。例如，要搜索以 `test` 开头的密钥，请输入 `secrets.backend_kwargs` 的以下内容：

      ```
      {
        "connections_prefix": "airflow/connections",
        "connections_lookup_pattern": "^test",
        "variables_prefix" : "airflow/variables",
        "variables_lookup_pattern": "^test"
      }
      ```
**注意**  
要使用 `connections_lookup_pattern` 和 `variables_lookup_pattern`，必须安装 `apache-airflow-providers-amazon` 的 7.3.0 或更高版本。有关将提供程序包更新到新版本的更多信息，请参阅 [约束条件文件](connections-packages.md#connections-packages-constraints)。

1. 选择**保存**。

## 第三步：生成 Apache A AWS irflow 连接 URI 字符串
<a name="connections-sm-aa-uri"></a>

要创建连接字符串，请使用键盘上的“Tab”键缩进[连接](https://airflow.apache.org/docs/stable/howto/connection/index.html)对象中的键值对。我们还建议在 shell 会话中为该 `extra` 对象创建一个变量。下一节将引导您完成使用 Apache Airflow 或 Python 脚本为 Amazon MWAA 环境[生成 Apache Airflow 连接 URI](https://airflow.apache.org/docs/apache-airflow/stable/howto/connection.html#generating-a-connection-uri) 字符串的步骤。

------
#### [ Apache Airflow CLI ]

以下 shell 会话使用本地 Airflow CLI 生成连接字符串。如果您没有安装 CLI，我们建议您使用 Python 脚本。

1. 打开 Python shell 会话：

   ```
   python3
   ```

1. 输入以下命令：

   ```
   >>> import json
   ```

1. 输入以下命令：

   ```
   >>> from airflow.models.connection import Connection
   ```

1. 在 shell 会话中为该 `extra` 对象创建一个变量。将中的*YOUR\$1EXECUTION\$1ROLE\$1ARN*样本值替换为执行角色 ARN 和中的区域*us-east-1*（例如`us-east-1`）。

   ```
   >>> extra=json.dumps({'role_arn': 'YOUR_EXECUTION_ROLE_ARN', 'region_name': 'us-east-1'})
   ```

1. 创建连接对象。用 Apache Airflow 连接的名称替换 `myconn` 中的示例值。

   ```
   >>> myconn = Connection(
   ```

1. 使用键盘上的“Tab”键缩进连接对象中的以下每个键值对。替换中的样本值*red*。

   1. 指定 AWS 连接类型：

      ```
      ... conn_id='aws',
      ```

   1. 指定 Apache Airflow 数据库选项：

      ```
      ... conn_type='mysql',
      ```

   1. 在 Amazon MWAA 上指定 Apache Airflow UI 网址：

      ```
      ... host='288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com/home',
      ```

   1. 指定用于登录 Amazon MWAA 的 AWS 访问密钥 ID（用户名）：

      ```
      ... login='YOUR_AWS_ACCESS_KEY_ID',
      ```

   1. 指定用于登录 Amazon MWAA 的私有访问 AWS 密钥（密码）：

      ```
      ... password='YOUR_AWS_SECRET_ACCESS_KEY',
      ```

   1. 指定 `extra` shell 会话变量：

      ```
      ... extra=extra
      ```

   1. 关闭连接对象。

      ```
      ... )
      ```

1. 打印连接 URI 字符串：

   ```
   >>> myconn.get_uri()
   ```

   请参阅响应中的连接 URI 字符串：

   ```
   'mysql://288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com%2Fhome?role_arn=arn%3Aaws%3Aiam%3A%3A001122332255%3Arole%2Fservice-role%2FAmazonMWAA-MyAirflowEnvironment-iAaaaA&region_name=us-east-1'
   ```

------
#### [ Python script ]

以下 Python 脚本不需要 Apache Airflow CLI。

1. 复制以下代码示例的内容，并在本地另存为 `mwaa_connection.py`。

   ```
   import urllib.parse
   								
   								conn_type = 'YOUR_DB_OPTION'
   								host = 'YOUR_MWAA_AIRFLOW_UI_URL'
   								port = 'YOUR_PORT'
   								login = 'YOUR_AWS_ACCESS_KEY_ID'
   								password = 'YOUR_AWS_SECRET_ACCESS_KEY'
   								role_arn = urllib.parse.quote_plus('YOUR_EXECUTION_ROLE_ARN')
   								region_name = 'us-east-1'
   								
   								conn_string = '{0}://{1}:{2}@{3}:{4}?role_arn={5}&region_name={6}'.format(conn_type, login, password, host, port, role_arn, region_name)
   								print(conn_string)
   ```

1. 将占位符替换为。*red*

1. 运行以下脚本可生成连接字符串。

   ```
   python3 mwaa_connection.py
   ```

------

## 步骤 4：在 Secrets Manager 中添加变量
<a name="connections-sm-createsecret-variables"></a>

下一节介绍如何在 Secrets Manager 中为变量创建密钥。

**要创建密钥，请执行以下操作**

1. 打开 [AWS Secrets Manager 控制台](https://console.aws.amazon.com/secretsmanager/home#/environments)。

1. 选择**存储新密钥**。

1. 选择**其他密钥类型**。

1. **在 “指定要存储在此密钥中的 key/value 配对” 窗格中**，选择 **Plaintex** t。

1. 按以下格式将变量值添加为**纯文本**。

   ```
   "YOUR_VARIABLE_VALUE"
   ```

   例如，要指定一个整数，请执行以下操作：

   ```
   14
   ```

   例如，要指定一个字符串，请执行以下操作：

   ```
   "mystring"
   ```

1. 对于**加密密钥**，请从下拉列表中选择一个 AWS KMS 密钥选项。

1. 按以下格式在**密钥名称**文本字段中输入名称。

   ```
   airflow/variables/YOUR_VARIABLE_NAME
   ```

   例如：

   ```
   airflow/variables/test-variable
   ```

1. 选择**下一步**。

1. 在**配置密钥**页面的**密钥名称和描述**窗格上，执行以下操作。

   1. 在**密钥名称**中，输入密钥名称。

   1. （可选）在**描述**中，输入密钥名称的描述。

   选择**下一步**。

1. 在**配置轮换-可选**上，保留默认选项，然后选择**下一步**。

1. 对于要添加的任何其他变量，在 Secrets Manager 中重复这些步骤。

1. 在**查看** 页上，查看您密钥的详细信息，然后选择**存储**。

## 步骤 5：在 Secrets Manager 中添加连接
<a name="connections-sm-createsecret-connection"></a>

下一节介绍如何在 Secrets Manager 中为连接字符串 URI 创建密钥。

**要创建密钥，请执行以下操作**

1. 打开 [AWS Secrets Manager 控制台](https://console.aws.amazon.com/secretsmanager/home#/environments)。

1. 选择**存储新密钥**。

1. 选择**其他密钥类型**。

1. **在 “指定要存储在此密钥中的 key/value 配对” 窗格中**，选择 **Plaintex** t。

1. 按以下格式将连接 URI 字符串添加为**纯文本**。

   ```
   YOUR_CONNECTION_URI_STRING
   ```

   例如：

   ```
   mysql://288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com%2Fhome?role_arn=arn%3Aaws%3Aiam%3A%3A001122332255%3Arole%2Fservice-role%2FAmazonMWAA-MyAirflowEnvironment-iAaaaA&region_name=us-east-1
   ```
**警告**  
Apache Airflow 会解析连接字符串中的每个值。**不得**使用单引号或双引号，否则它会将连接解析为单个字符串。

1. 对于**加密密钥**，请从下拉列表中选择一个 AWS KMS 密钥选项。

1. 按以下格式在**密钥名称**文本字段中输入名称。

   ```
   airflow/connections/YOUR_CONNECTION_NAME
   ```

   例如：

   ```
   airflow/connections/myconn
   ```

1. 选择**下一步**。

1. 在**配置密钥**页面的**密钥名称和描述**窗格上，执行以下操作。

   1. 在**密钥名称**中，输入密钥名称。

   1. （可选）在**描述**中，输入密钥名称的描述。

   选择**下一步**。

1. 在**配置轮换-可选**上，保留默认选项，然后选择**下一步**。

1. 对于要添加的任何其他变量，在 Secrets Manager 中重复这些步骤。

1. 在**查看** 页上，查看您密钥的详细信息，然后选择**存储**。

## 代码示例
<a name="connections-sm-samples"></a>
+ 要了解在使用以下示例代码的本页上如何使用 Apache Airflow 连接（`myconn`）的密钥，请参阅 [使用 AWS Secrets Manager 中的密钥进行 Apache Airflow 连接](samples-secrets-manager.md)。
+ 要了解在使用以下示例代码的本页上如何使用 Apache Airflow 变量（`test-variable`）的密钥，请参阅 [为 Apache Airflow 变量使用 AWS Secrets Manager 中的密钥](samples-secrets-manager-var.md)。

## 资源
<a name="connections-sm-blogs"></a>
+ 有关使用控制台和配置 Secrets Manager 密钥的更多信息 AWS CLI，请参阅*AWS Secrets Manager 用户指南*中的[创建密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。
+ 在[将 Apache Airflow 连接和变量移动至 AWS Secrets Manager](https://aws.amazon.com/blogs/opensource/move-apache-airflow-connections-variables-aws-secrets-manager/)中，使用 Python 脚本将大量 Apache Airflow 变量和连接迁移到 Secrets Manager。

## 接下来做什么？
<a name="connections-sm-next-up"></a>
+ 要了解如何生成令牌以访问 Apache Airflow UI，请参阅 [访问 Apache Airflow](access-airflow-ui.md)。