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}
。
有效负载必须包含带有任意键的文本值。
以 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 密钥后端正确读取,您可以使用 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}
。有效负载必须包含带有任意键的文本值。
变量值可能如下所示: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 密钥后端正确读取,您可以使用 airflow variables get
$ airflow variables get my_variable
some_secret_data
存储和检索配置¶
Lockbox 密钥后端也适用于存储敏感配置。
例如,我们将为您提供用于 sentry.sentry_dsn
的密钥,并使用 sentry_dsn_value
作为配置值名称。
要存储配置,您需要创建名称格式如下的密钥:{config_prefix}{sep}{config_value_name}
。有效负载必须包含带有任意键的文本值。
以下是使用 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 密钥后端正确读取,您可以使用 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