实时计算 Flink 版支持在作业中引用阿里云密钥管理服务(KMS)托管的凭据,替代明文用户名/密码(user-pwd)访问数据源,实现敏感凭据加密托管、免明文暴露和凭据免运维。
功能介绍
通过集成 KMS 凭据管理,可在 Flink 作业中引用 KMS 托管的凭据(如数据库账号密码等),无需在作业代码中暴露明文凭据。Flink 运行时通过 RAM 角色获取临时凭证(STS Token),调用 KMS 获取真实凭据值后连接目标数据源。
核心优势:
敏感信息保护:作业中不再暴露明文 user-pwd,凭据加密托管在 KMS 中。
凭据免运维:配合 KMS 凭据轮转能力,凭据更新后 Flink 自动获取最新值,无需修改作业代码。
注意事项
在 KMS 中错误删除凭据、在 RAM 中错误删除或修改 RAM 角色的权限与信任策略,可能导致 Flink 作业因无法获取 KMS 凭据而运行失败。根据《实时计算 Flink 版服务等级协议》,因客户不正确使用资源导致的不可用不纳入 SLA。
使用限制
仅 VVR 11.8 及以上版本引擎的 Postgres CDC Connector 支持使用 KMS 凭据访问云资源。
使用 RAM 角色访问 KMS 有添加引用角色数限制,详情请参见使用 RAM 角色访问云资源。
权限准备
步骤一:创建 KMS 凭据
KMS 提供多种类型凭据,以 RDS 凭据为例:
登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击资源 > 凭据管理。
在自管凭据页签凭据类型区域,单击数据库凭据。
在右侧列表上方,单击创建数据库凭据下的创建单个凭据,完成相关配置后,单击确定。
更多信息,请参见凭据管理快速入门、管理及使用 RDS 凭据。
步骤二:创建并配置 RAM 角色
此角色是 Flink 服务访问 KMS 的身份凭证。Flink 将通过扮演该角色获取临时凭证,以该角色身份调用 KMS 获取凭据值。免 AK 访问 KMS 的详细原理说明,请参见使用 RAM 角色访问云资源的附录。
创建 RAM 角色
登录 RAM 控制台 - 角色页面,单击创建角色。保持默认选项,并单击确定。
填写一个有辨识度的角色名称,例如
FlinkRoleForKMSRead,单击确定。
添加信任策略
角色创建成功后,在角色详情页的信任策略页签下,单击编辑信任策略,在 Principal 中添加 "Service": ["stream.aliyuncs.com"],信任 Flink 扮演该角色。更多信息,请参见修改 RAM 角色的信任策略。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"stream.aliyuncs.com"
]
}
}
],
"Version": "1"
}为 RAM 角色授予 KMS 访问权限
扮演该角色后,Flink 将以角色身份调用 KMS,需提前在角色权限策略中授予 KMS 相关权限。
在角色详情页的权限管理页签下,单击新增授权,添加 AliyunKMSSecretUserAccess(获取 KMS 中凭据的权限)权限策略。若凭据使用了用户指定的密钥(CMK)加密,还需有密钥的 kms:Decrypt 权限,可通过添加 AliyunKMSCryptoUserAccess 权限策略来授权。
若期望细粒度控制到密钥及凭据粒度,可自定义权限策略,授予 GetSecretValue、Decrypt 权限,并将资源限制为指定资源。详情请参见 KMS 自定义权限策略参考、创建自定义权限策略。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:GetSecretValue",
"Resource": "acs:kms:<region>:<account-id>:secret/<secret-name>"
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "acs:kms:<region>:<account-id>:key/<key-id>"
}
]
}步骤三:为 RAM 用户授予权限
创建一个权限策略并授权给 RAM 用户,允许用户将步骤二创建的 RAM 角色传递给 Flink 服务进行扮演。
若操作步骤四的 RAM 用户已关联 AliyunRAMFullAccess 或 AliyunStreamFullAccess 权限策略,则该用户已拥有 PassRole 权限,可跳过此步骤。
创建权限策略
登录 RAM 控制台 - 权限策略页面,单击创建权限策略。切换至脚本编辑,编辑权限策略内容。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ram:ListRoles"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram::<account-id>:role/<role-name>",
"Condition": {
"StringEquals": {
"acs:Service": "stream.aliyuncs.com"
}
}
}
]
}权限 | 说明 |
| 允许用户查看账户下的角色列表,以便在 Flink 控制台界面中选择角色。 |
| 允许用户将指定的角色传递给 Flink 云服务。请将策略中的
可添加 |
单击确定,将权限策略保存,例如命名为 FlinkPassRolePolicy。更多信息,请参见创建自定义权限策略。
为 RAM 用户授权
登录 RAM 控制台 - 用户页面,找到需要授权的 RAM 用户,单击操作列的新增授权。
在新增授权面板中,搜索并选中步骤三创建的权限策略(例如
FlinkPassRolePolicy),单击确认新增授权。更多信息,请参见管理RAM用户的权限。
步骤四:在 Flink 中引用 RAM 角色
将步骤二创建的 RAM 角色引用至 Flink 项目空间,使作业可以使用该角色访问 KMS。
登录实时计算控制台,进入目标工作空间。
在左侧导航栏,选择。
单击 RAM 角色页签。
单击引用 RAM 角色。
在弹窗中选择步骤二创建的 RAM 角色(例如
FlinkRoleForKMSRead),支持按角色名模糊搜索。说明角色列表为当前项目空间所属阿里云主账号下的普通服务角色列表。操作者需与当前项目空间同属一个阿里云主账号,且有
ram:ListRoles权限,才能查看到对应的角色。单击测试校验,系统会自动进行以下两项授权检测:
PassRole 权限检测:当前用户有对所选 RAM 角色执行
ram:PassRole的权限。信任策略检测:所选 RAM 角色信任当前 Flink 项目空间对其进行扮演。
检测通过后,单击确定。
更多信息,请参见使用 RAM 角色访问云资源。
步骤五:在作业中使用 KMS 凭据
完成上述配置后,在作业代码中通过 secret:// 引用格式指定凭据,并配置 KMS 连接参数,Flink 即可在运行时自动获取凭据值访问数据源。
当前仅 VVR 11.8 及以上版本引擎的 Postgres CDC Connector 支持。
Postgres CDC Connector 示例
SQL 作业:以下示例以 Postgres CDC 源表为例,使用 KMS 凭据托管数据库账号密码。KMS 中已创建数据库凭据 my-db-secret,其 SecretData 为 {"AccountName":"alice","AccountPassword":"xxx"}。
CREATE TEMPORARY TABLE postgrescdc_source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = 'secret://kms.my-db-secret.AccountName',
'password' = 'secret://kms.my-db-secret.AccountPassword',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>',
'slot.name' = '<slot name>',
'decoding.plugin.name' = 'pgoutput',
'kms.endpoint' = '<YOUR-KMS-INSTANCE-VPC-ENDPOINT>',
'kms.akless.assume-role.role-name' = 'FlinkRoleForKMSRead'
);Postgres CDC 连接器的参数说明、前提条件与类型映射,请参见Postgres CDC 连接器。
参数说明
凭据引用格式
KMS 凭据引用格式为:secret://<provider>.<secret-name>.<key>
字段 | 说明 |
| 凭据源类型标识,当前仅支持 |
| KMS 中的凭据名称,例如 |
| 凭据值 SecretData JSON 中的字段名,例如 |
示例:secret://kms.my-db-secret.AccountPassword
KMS 参数
参数 | 类型 | 是否必填 | 说明 |
| String | 是 | KMS 网关地址。Endpoint 按地域固定,可通过服务接入点获取。 |
| String | 否 | 访问 KMS 使用的 RAM 角色名称。需提前在访问安全 > RAM 角色中添加引用。 |