AWS Secrets Manager 后端

要启用 Secrets Manager,请在 airflow.cfg[secrets] 部分中指定 SecretsManagerBackend 作为 backend。这些 backend_kwargs 被解析为 JSON,因此 Python 值(如布尔值 False 或 None)将被忽略,并为这些 kwargs 采用 secrets 后端的默认值。

以下是一个示例配置

[secrets]
backend = airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend
backend_kwargs = {
  "connections_prefix": "airflow/connections",
  "connections_lookup_pattern": null,
  "variables_prefix": "airflow/variables",
  "variables_lookup_pattern": null,
  "config_prefix": "airflow/config",
  "config_lookup_pattern": null,
  "profile_name": "default"
}

要进行身份验证,您可以提供 Amazon Webservices 连接额外配置 中列出的参数,或设置 环境变量

[secrets]
backend = airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend
backend_kwargs = {
  "connections_prefix": "airflow/connections",
  "variables_prefix": "airflow/variables",
  "config_prefix": "airflow/config",
  "role_arn": "arn:aws:iam::123456789098:role/role-name"
}

存储和检索连接

有两种方法可以在 AWS Secrets Manager 中存储 Airflow 连接。

将连接存储为 URI

您可以将连接存储为 Airflow 连接 URI

../_images/aws-secrets-manager-uri.png

请注意,如果您将连接存储为 URI,则假定每个字段都经过 URL 编码。例如,如果您想使用值 my password,则在 URI 中,它应该表示为 my%20password

将连接存储为 JSON

您还可以将连接存储为具有相应键值对的 JSON

../_images/aws-secrets-manager-json.png

鼓励使用 Airflow 默认名称作为连接字段,但允许每个字段使用不同的别名

  • 连接类型:conn_typeconn_idconnection_typeengine

  • 登录名:loginuserusernameuser_name

  • 密码:passwordpasskey

  • 主机:hostremote_hostserver

  • 端口:port

  • 额外:extra。请注意,此额外字段应为有效的 JSON。

可以使用配置中的参数 extra_conn_words 向列表中添加更多单词。此参数必须是具有以下可选键的列表字典:user、password、host、schema、conn_type。

例如,如果您已将 connections_prefix 设置为 airflow/connections,则对于连接 ID 为 smtp_default 的连接,您需要将连接存储在 airflow/connections/smtp_default。这可以通过 AWS Web 控制台或 Amazon CLI 完成,如下所示

aws secretsmanager put-secret-value \
    --secret-id airflow/connections/smtp_default \
    --secret-string '{"login": "nice_user", "password": "this_is_the_password", "host": "ec2.8399.com", "port": "999"}'

验证您是否可以获取密钥

❯ aws secretsmanager get-secret-value --secret-id airflow/connections/smtp_default
{
    "ARN": "arn:aws:secretsmanager:us-east-2:314524341751:secret:airflow/connections/smtp_default-7meuul",
    "Name": "airflow/connections/smtp_default",
    "VersionId": "34f90eff-ea21-455a-9c8f-5ee74b21be672",
    "SecretString": "{\n  \"login\":\"nice_user\",\n  \"password\":\"this_is_the_password\"\n,
    \n  \"host\":\"ec2.8399.com\"\n,\n  \"port\":\"999\"\n}\n",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2020-04-08T02:10:35.132000+01:00"
}

如果您不想使用任何 connections_prefix 来检索连接,请在配置中将其设置为空字符串 ""

存储和检索变量

如果您已将 variables_prefix 设置为 airflow/variables,则对于变量键为 hello 的变量,您需要将变量存储在 airflow/variables/hello

可选查找

可以选择性地查找连接、变量或配置,它们可以相互排斥,也可以任意组合。这将阻止向 AWS Secrets Manager 发送针对排除类型的请求。

如果您想在 AWS Secrets Manager 中查找某些内容而不是其他内容,可以通过将要排除的内容的相关 *_prefix 参数设置为 null 来实现。

例如,如果您想将参数 connections_prefix 设置为 "airflow/connections" 并且不查找变量和配置,则您的配置文件应如下所示

[secrets]
backend = airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend
backend_kwargs = {
  "connections_prefix": "airflow/connections",
  "variables_prefix": null,
  "config_prefix": null,
  "profile_name": "default"
}

如果您只想在 AWS Secrets Manager 中查找连接、变量或配置的特定子集,可以通过设置相关的 *_lookup_pattern 参数来实现。此参数采用字符串形式的正则表达式作为值。

例如,如果您只想在 AWS Secrets Manager 中查找以“m”开头的连接,则您的配置文件应如下所示

[secrets]
backend = airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend
backend_kwargs = {
  "connections_prefix": "airflow/connections",
  "connections_lookup_pattern": "^m",
  "profile_name": "default"
}

在 AWS Secrets Manager 中存储 Google Secrets 的示例

要连接到 Google Cloud 连接,所有字段都必须位于 extra 字段中,并且它们的名称遵循模式 extra_google_cloud_platform__value。例如

{'key_path': '/opt/airflow/service_account.json',
'scope': 'https://www.googleapis.com/auth/devstorage.read_only'}

此条目有帮助吗?