使用密钥配置 Apache Airflow 连接 Amazon Secrets Manager - Amazon Managed Workflows for Apache Airflow
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

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

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

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

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

  2. 选择环境。

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

  4. 选择附加策略

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

  6. 选择附加策略

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

{ "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 配置选项。 Amazon 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 Amazon 连接 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. 指定 Amazon 连接类型:

      ... 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 的 Amazon 访问密钥 ID(用户名):

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

      ... 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. 打开Amazon Secrets Manager 控制台

  2. 选择存储新密钥

  3. 选择其他密钥类型

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

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

    "YOUR_VARIABLE_VALUE"

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

    14

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

    "mystring"
  6. 对于加密密钥,请从下拉列表中选择一个 Amazon 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. 打开Amazon 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. 对于加密密钥,请从下拉列表中选择一个 Amazon KMS 密钥选项。

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

    airflow/connections/YOUR_CONNECTION_NAME

    例如:

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

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

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

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

    选择下一步

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

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

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

代码示例

资源

接下来做什么?