AWS Secrets Manager 后端

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

以下是示例配置

[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 Web Services 连接 Extra 配置 中列出的参数,或者设置 环境变量

[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_type, conn_id, connection_type, engine

  • 登录: login, user, username, user_name

  • 密码: password, pass, key

  • 主机: host, remote_host, server

  • 端口: port

  • Extra: extra。请注意,此 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 参数来实现。此参数接受一个 Regex (正则表达式) 字符串作为值。

例如,如果您只想在 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": {"key_path": "/opt/airflow/service_account.json",
"scope": "https://www.googleapis.com/auth/devstorage.read_only"}}

如果您使用密钥字典。

{"extra": {"keyfile_dict": "<copy & paste the service account json here>",
"scope": "https://www.googleapis.com/auth/devstorage.read_only"}}

无论哪种方式,您都可以在 UI 上直接编辑 Key/value

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

此条目有用吗?