Yandex.Cloud Lockbox 密钥后端¶
本节介绍如何在 Apache Airflow 中配置使用 Yandex Lockbox 作为密钥后端,以及如何管理密钥。
快速入门¶
在开始之前,请确保已在你的 Apache Airflow 安装中安装了 yandex Provider。
pip install apache-airflow-providers-yandex
启用 Yandex Lockbox 密钥后端¶
要将 Yandex Lockbox 设为密钥后端,请在 airflow.cfg 文件的 [secrets] 部分,将 LockboxSecretBackend 指定为你的 backend。
以下是示例配置
[secrets]
backend = airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend
也可以通过环境变量来设置此项。
export AIRFLOW__SECRETS__BACKEND=airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend
可以使用 airflow config get-value 命令来验证配置选项是否已正确设置。
$ airflow config get-value secrets backend
airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend
后端参数¶
下一步是使用 backend_kwargs 参数配置后端,这些参数允许你提供如下选项:
yc_oauth_token:指定用于连接 Yandex Lockbox 的用户账户 OAuth 令牌。该参数值形如y3_xx123。yc_sa_key_json:指定服务账户的 JSON 密钥。该参数值形如{"id": "...", "service_account_id": "...", "private_key": "..."}。yc_sa_key_json_path:指定服务账户 JSON 密钥文件的路径。该参数值形如/home/airflow/authorized_key.json,文件内容应为{"id": "...", "service_account_id": "...", "private_key": "..."}。yc_connection_id:指定用于连接 Yandex Lockbox 的连接 ID。默认值为yandexcloud_default。folder_id:指定在 Yandex Lockbox 中搜索密钥的文件夹 ID。如果设为None(JSON 中为null),则请求会使用连接中指定的folder_id(如果有)。connections_prefix:指定读取连接时使用的密钥前缀。如果设为None(JSON 中为null),则不会向 Yandex Lockbox 发送读取连接的请求。默认值为airflow/connections。variables_prefix:指定读取变量时使用的密钥前缀。如果设为None(JSON 中为null),则不会向 Yandex Lockbox 发送读取变量的请求。默认值为airflow/variables。config_prefix:指定读取配置时使用的密钥前缀。如果设为None(JSON 中为null),则不会向 Yandex Lockbox 发送读取配置的请求。默认值为airflow/config。sep:指定用于连接secret_prefix与secret_id的分隔符。默认值为/。endpoint:指定 API 端点。如果设为None(JSON 中为null),则请求会使用连接中指定的端点(如果有),否则使用默认端点。
请确保将所有选项以 JSON 字典的形式提供。
例如,若希望将 connections_prefix 设置为 "example-connections-prefix",并将 variables_prefix 设置为 "example-variables-prefix",则配置文件应如下所示:
[secrets]
backend = airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend
backend_kwargs = {"connections_prefix": "example-connections-prefix", "variables_prefix": "example-variables-prefix"}
设置凭证¶
您需要指定凭证或 `yandexcloud` 连接的 ID,以便连接到 Yandex Lockbox。
系统会按以下优先级使用凭证:
OAuth 令牌
文件中的 JSON 格式服务账户密钥
JSON 格式的服务账户密钥
Yandex Cloud 连接
如果未指定任何凭证,系统将使用默认连接 ID:yandexcloud_default。
存储与获取连接¶
要存储一个连接,需要 创建一个密钥,其名称遵循以下格式:{connections_prefix}{sep}{connection_name}。
密钥的 payload 必须包含任意键对应的文本值。
以 URI 形式存储连接¶
保存连接的主要方式是使用 连接 URI 表示法,例如 mysql://myname:mypassword@myhost.com?this_param=some+val&that_param=other+val%2A。
下面是使用 yc CLI 创建密钥的示例。
$ yc lockbox secret create \
--name airflow/connections/mysqldb \
--payload '[{"key": "value", "text_value": "mysql://myname:mypassword@myhost.com?this_param=some+val&that_param=other+val%2A"}]'
done (1s)
name: airflow/connections/mysqldb
以 JSON 形式存储连接¶
另一种存储连接的方式是使用 JSON 格式。
{
"conn_type": "mysql",
"host": "host.com",
"login": "myname",
"password": "mypassword",
"extra": {
"this_param": "some val",
"that_param": "other val*"
}
}
下面是使用 yc CLI 创建密钥的示例。
$ yc lockbox secret create \
--name airflow/connections/my_sql_db_json \
--payload '[{"key": "value", "text_value": "{\"conn_type\": \"mysql\", \"host\": \"host.com\", \"login\": \"myname\", \"password\": \"mypassword\", \"extra\": {\"this_param\": \"some val\", \"that_param\": \"other val*\"}}"}]'
done (1s)
name: airflow/connections/my_sql_db_json
获取连接¶
要检查连接是否已成功从 Lockbox Secret Backend 读取,可运行 airflow connections get。
$ airflow connections get mysqldb -o json
[{"id": null, "conn_id": "mysqldb", "conn_type": "mysql", "description": null, "host": "host.com", "schema": "", "login": "myname", "password": "mypassword", "port": null, "is_encrypted": "False", "is_extra_encrypted": "False", "extra_dejson": {"this_param": "some val", "that_param": "other val*"}, "get_uri": "mysql://myname:mypassword@myhost.com/?this_param=some+val&that_param=other+val%2A"}]
存储与获取变量¶
要存储一个变量,需要 创建一个密钥,其名称遵循以下格式:{variables_prefix}{sep}{variable_name}。payload 必须包含任意键对应的文本值。
以下示例展示了变量值的可能形式:some_secret_data。
下面是使用 yc CLI 创建密钥的示例。
$ yc lockbox secret create \
--name airflow/variables/my_variable \
--payload '[{"key": "value", "text_value": "some_secret_data"}]'
done (1s)
name: airflow/variables/my_variable
要检查变量是否已成功从 Lockbox Secret Backend 读取,可运行 airflow variables get。
$ airflow variables get my_variable
some_secret_data
存储与获取配置¶
Lockbox Secret Backend 同样适用于存放敏感配置。
例如,我们将为 sentry.sentry_dsn 提供一个密钥,并使用 sentry_dsn_value 作为配置值的名称。
要存储一个配置,需要 创建一个密钥,其名称遵循以下格式:{config_prefix}{sep}{config_value_name}。payload 必须包含任意键对应的文本值。
下面是使用 yc CLI 创建密钥的示例。
$ yc lockbox secret create \
--name airflow/config/sentry_dsn_value \
--payload '[{"key": "value", "text_value": "https://public@sentry.example.com/1"}]'
done (1s)
name: airflow/config/sentry_dsn_value
随后,需要在 Apache Airflow 配置中将配置值名称指定为 {key}_secret。
[sentry]
sentry_dsn_secret = sentry_dsn_value
要检查配置值是否已成功从 Lockbox Secret Backend 读取,可运行 airflow config get-value。
$ airflow config get-value sentry sentry_dsn
https://public@sentry.example.com/1
清理密钥¶
可以使用 yc CLI 轻松删除你的密钥。
$ yc lockbox secret delete --name airflow/connections/mysqldb
name: airflow/connections/mysqldb