使用密钥配置 Apache Airflow 连接 AWS Secrets Manager - Amazon Managed Workflows for Apache Airflow

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

使用密钥配置 Apache Airflow 连接 AWS Secrets Manager

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

注意
  • 您将需要为您创建的密钥付费。有关 Secrets Manager 定价的更多信息,请参阅 AWS 定价

步骤 1:向 Amazon MWAA 提供访问 Secrets Manager 密钥的权限

您 Amazon MWAA 环境的执行角色需要对 AWS Secrets Manager中的密钥具有读取权限。以下 IAM 策略允许使用 AWS 托管SecretsManagerReadWrite策略进行读写访问。

要将该策略附加到执行角色,请执行以下操作
  1. 在 Amazon MWAA 控制台上打开环境页面

  2. 选择环境。

  3. 权限窗格上选择执行角色。

  4. 选择附加策略

  5. 筛选策略文本字段中键入 SecretsManagerReadWrite

  6. 选择附加策略

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

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

步骤 2: 创建 Secrets Manager 后端作为 Apache Airflow 配置选项

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

  1. 在 Amazon MWAA 控制台上打开环境页面

  2. 选择环境。

  3. 选择编辑

  4. 选择下一步

  5. Airflow 配置选项窗格中选择添加自定义配置。添加以下键值对:

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

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

      您可以使用查找模式来减少 Amazon MWAA 代表您向 Secrets Manager 调用 API 的次数。如果您未指定查找模式,Apache Airflow 会在已配置的后端中搜索所有连接和变量。通过指定模式,可以收窄 Apache Airflow 可能出现的路径。这可以降低您在 Amazon MWAA 中使用 Secrets Manager 时的成本。

      要指定查找模式,请指定 connections_lookup_patternvariables_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_patternvariables_lookup_pattern,必须安装 apache-airflow-providers-amazon 的 7.3.0 或更高版本。有关将提供程序包更新到新版本的更多信息,请参阅 指定更新的提供程序包

  6. 选择保存

第三步:生成 Apache Airflow AWS 连接 URI 字符串

要创建连接字符串,请使用键盘上的 “Tab” 键缩进 Connection 对象中的键值对。我们还建议在 shell 会话中为该 extra 对象创建一个变量。下一节将引导您完成使用 Apache Airflow 或 Python 脚本为 Amazon MWAA 环境生成 Apache Airflow 连接 URI 字符串的步骤。

Apache Airflow CLI

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

  1. 打开 Python shell 会话:

    python3
  2. 输入以下 命令:

    >>> import json
  3. 输入以下 命令:

    >>> from airflow.models.connection import Connection
  4. 在 shell 会话中为该 extra 对象创建一个变量。将 YOUR_EXECUTION_ROLE_ARN 中的示例值替换为执行角色 ARN 和 YOUR_REGION 中的区域(例如 us-east-1)。

    >>> extra=json.dumps({'role_arn': 'YOUR_EXECUTION_ROLE_ARN', 'region_name': 'YOUR_REGION'})
  5. 创建连接对象。用 Apache Airflow 连接的名称替换 myconn 中的示例值。

    >>> myconn = Connection(
  6. 使用键盘上的“Tab”键缩进连接对象中的以下每个键值对。替换红色的示例值。

    1. 指定 AWS 连接类型:

      ... conn_id='aws',
    2. 指定 Apache Airflow 数据库选项:

      ... conn_type='mysql',
    3. 在 Amazon MWAA 上指定 Apache Airflow UI 网址:

      ... host='288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com/home',
    4. 指定登录亚马逊 MWAA 的 AWS 访问密钥 ID(用户名):

      ... login='YOUR_AWS_ACCESS_KEY_ID',
    5. 指定用于登录 Amazon MWAA 的私有访问 AWS 密钥(密码):

      ... password='YOUR_AWS_SECRET_ACCESS_KEY',
    6. 指定 extra shell 会话变量:

      ... extra=extra
    7. 关闭连接对象。

      ... )
  7. 打印连接 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 = 'YOUR_REGION' 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)
  2. 替换红色占位符。

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

    python3 mwaa_connection.py

步骤 4:在 Secrets Manager 中添加变量

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

要创建密钥,请执行以下操作
  1. 打开AWS Secrets Manager 控制台

  2. 选择存储新密钥

  3. 选择其他密钥类型

  4. 指定要存储在此密钥中的键值对窗格上,选择纯文本

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

    "YOUR_VARIABLE_VALUE"

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

    14

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

    "mystring"
  6. 对于加密密钥,请从下拉列表中选择一个 AWS KMS 密钥选项。

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

    airflow/variables/YOUR_VARIABLE_NAME

    例如:

    airflow/variables/test-variable
  8. 选择下一步

  9. 配置密钥页面的密钥名称和描述窗格上,执行以下操作。

    1. 密钥名称中,输入密钥名称。

    2. (可选)在描述中,输入密钥名称的描述。

    选择下一步

  10. 配置轮换-可选上,保留默认选项,然后选择下一步

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

  12. 查看 页上,查看您密钥的详细信息,然后选择存储

步骤 5:在 Secrets Manager 中添加连接

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

要创建密钥,请执行以下操作
  1. 打开AWS Secrets Manager 控制台

  2. 选择存储新密钥

  3. 选择其他密钥类型

  4. 指定要存储在此密钥中的键值对窗格上,选择纯文本

  5. 按以下格式将连接 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 会解析连接字符串中的每个值。不得使用单引号或双引号,否则它会将连接解析为单个字符串。

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

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

    airflow/connections/YOUR_CONNECTION_NAME

    例如:

    airflow/connections/myconn
  8. 选择下一步

  9. 配置密钥页面的密钥名称和描述窗格上,执行以下操作。

    1. 密钥名称中,输入密钥名称。

    2. (可选)在描述中,输入密钥名称的描述。

    选择下一步

  10. 配置轮换-可选上,保留默认选项,然后选择下一步

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

  12. 查看 页上,查看您密钥的详细信息,然后选择存储

代码示例

资源

接下来做什么?