Realtime Compute for Apache Flink では、Alibaba Cloud Key Management Service (KMS) にホストされている認証情報をジョブから参照し、プレーンテキストのユーザー名とパスワード (user-pwd) を置き換えることができます。これにより、認証情報の暗号化ホスティング、プレーンテキストの露出回避、メンテナンス不要な認証情報管理が可能になります。
概要
KMS 認証情報管理統合により、Flink ジョブのコード内で認証情報をプレーンテキストで露出させることなく、KMS にホストされている認証情報 (データベースのユーザー名とパスワードなど) を参照できます。実行時に、Flink は RAM ロールを引き受けて一時的な STS トークンを取得し、KMS を呼び出して実際の認証情報の値を取得した後、対象のデータソースに接続します。
主なメリット:
-
機密情報の保護:ジョブ内でプレーンテキストの user-pwd は露出しません。認証情報は KMS に暗号化された状態でホストされます。
-
メンテナンス不要の認証情報:KMS で認証情報をローテーションさせると、更新後に Flink は最新の認証情報の値を自動的に取得します。ジョブコードを変更する必要はありません。
注意事項
KMS で認証情報を誤って削除した場合、または RAM で RAM ロールの権限や信頼ポリシーを誤って削除または変更した場合、Flink ジョブが KMS 認証情報を取得できずに失敗する可能性があります。Realtime Compute for Apache Flink のサービスレベルアグリーメント (SLA) によれば、お客様によるリソースの誤用が原因で利用不能となった場合、SLA の対象外となります。
制限事項
-
KMS 認証情報を使用してクラウドリソースにアクセスできるのは、Postgres CDC コネクタ (VVR 11.8 以降) と Kafka コネクタ (VVR 11.9 以降) のみです。
-
KMS へのアクセスで参照される RAM ロールの数には制限があります。詳細については、「RAM ロールを使用してクラウドリソースにアクセスする」をご参照ください。
権限の準備
-
ステップ 1 (KMS 認証情報管理の作成):操作者には KMS 認証情報管理の権限が必要です。
-
ステップ 2 とステップ 3: オペレーターには、
AliyunRAMFullAccessポリシー、または別途 RAM ロール管理および権限管理の権限が付与されている必要があります。詳細については、「カスタムポリシーの作成」をご参照ください。 -
ステップ 4 とステップ 5 (Flink でのロールの参照とジョブの開発): オペレーターには、Flink 名前空間に対する編集者以上の権限、または RAM ロールの参照、ファイルの管理、ジョブの開発を行うためのきめ細かい権限が必要です。 詳細については、「開発コンソールにアクセスするための権限を付与する」をご参照ください。
ステップ1:KMS認証情報の作成
KMS は複数種類の認証情報を提供します。以下の手順では、RDS 認証情報を例に説明します。
-
Key Management Service コンソールにログインします。上部メニューバーでリージョンを選択し、左側のナビゲーションペインで、[Resources] > [Secrets] を選択します。
-
[Self-Managed Secrets] タブの [Secret Type] エリアで、[Database Secret] をクリックします。
-
右側のリスト上部で、[Create Database Secret] の下にある [Create Single Secret] をクリックし、設定を完了してから [OK] をクリックします。
詳細については、「Secrets Manager の使用開始」および「ApsaraDB RDS シークレットの管理と使用」をご参照ください。
ステップ2:RAM ロールの作成と設定
このロールは、Flink サービスが KMS にアクセスするために使用するID 認証情報です。Flink はロールを引き受けて一時的な認証情報を取得し、そのロールとして KMS を呼び出して認証情報の値を取得します。KMS への認証情報不要のアクセスに関する詳細については、「RAM ロールを使用したクラウドリソースへのアクセス」の付録をご参照ください。
1. RAM ロールの作成
-
RAM コンソール - Roles ページにログインし、[Create Role] をクリックします。既定のオプションのまま [OK] をクリックします。
-
識別しやすいロール名 (例:
FlinkRoleForKMSRead) を入力し、[OK] をクリックします。
2. 信頼ポリシーの追加
ロールが作成された後、ロールの詳細ページで[信頼ポリシー] タブをクリックし、[信頼ポリシーの編集] をクリックします。Principal に "Service": ["stream.aliyuncs.com"] を追加して、Flink がロールを引き受けることを信頼できるようにします。詳細については、「RAM ロールの信頼ポリシーを変更する」をご参照ください。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"stream.aliyuncs.com"
]
}
}
],
"Version": "1"
}
3. RAM ロールへのKMSアクセス権限の付与
Flink がロールを引き受けた後、そのロールとして KMS を呼び出します。必要な KMS 権限を、事前にロールの権限ポリシーに付与してください。
ロールの詳細ページで [Permissions] タブをクリックし、[Grant Permission] をクリックします。AliyunKMSSecretUserAccess ポリシー (KMS 内の認証情報を取得する権限を付与) を追加します。認証情報がカスタマーマスターキー (CMK) で暗号化されている場合は、AliyunKMSCryptoUserAccess ポリシーを追加して kms:Decrypt 権限も付与します。
キーおよび認証情報レベルで権限を制御するには、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>"
}
]
}
ステップ3:RAMユーザーへの権限付与
権限ポリシーを作成し、RAM ユーザーに付与します。これにより、ユーザーはステップ2で作成した RAM ロールを Flink サービスに渡して引き受けさせることができます。
ステップ4の RAM ユーザーがすでに AliyunRAMFullAccess または AliyunStreamFullAccess ポリシーに関連付けられている場合、ユーザーはすでに PassRole 権限を持っています。このステップはスキップできます。
権限ポリシーの作成
RAM コンソール - Policies ページにログインし、[Create Policy] をクリックします。[Script] モードに切り替え、ポリシー内容を編集します。
{
"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 クラウドサービスに渡すことを許可します。ポリシーの
|
[OK] をクリックして、たとえば FlinkPassRolePolicy としてポリシーを保存します。詳細については、「カスタムポリシーの作成」をご参照ください。
RAMユーザーへの権限付与
-
RAM コンソール - Users ページにログインします。権限を付与する RAM ユーザーを見つけ、[Actions] 列の [Add Permissions] をクリックします。
-
[権限の追加] パネルで、ステップ 3 で作成したポリシー (例:
FlinkPassRolePolicy) を検索して選択し、[確認] をクリックします。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
ステップ4:FlinkでのRAM ロール参照
ステップ2で作成した RAM ロールを Flink の名前空間で参照し、ジョブがそのロールを使用して KMS にアクセスできるようにします。
-
Realtime Compute コンソールにログインし、対象のワークスペースに入ります。
-
左側のナビゲーションペインでを選択します。
-
[RAM ロール] タブをクリックします。
-
[RAM ロールを参照] をクリックします。
-
ダイアログボックスで、ステップ2で作成した RAM ロール (例:
FlinkRoleForKMSRead) を選択します。ロール名のあいまい検索も可能です。説明ロールリストには、現在の名前空間を所有する Alibaba Cloud アカウント配下の通常のサービスロールが含まれます。ロールを表示するには、オペレーターは現在の名前空間と同じ Alibaba Cloud アカウントに属し、
ram:ListRoles権限を持っている必要があります。 -
[テスト] をクリックします。システムは自動的に以下の 2 つの項目をチェックします。
-
PassRole権限チェック:現在のユーザーが、選択した RAM ロールに対して
ram:PassRole権限を持っていること。 -
信頼ポリシーチェック:選択した RAM ロールが、現在の Flink 名前空間によるロールの引き受けを信頼していること。
-
-
チェックが成功したら、[OK] をクリックします。
詳細については、「RAM ロールを使用してクラウドリソースにアクセスする」をご参照ください。
ステップ5:ジョブでのKMS認証情報の利用
前の手順が完了したら、ジョブコードで secret:// 参照形式を使用して資格情報を指定し、KMS 接続パラメーターを設定します。 Flink は、データソースにアクセスするために、実行時に資格情報の値を自動的に取得します。
Postgres CDCコネクタの例
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.ca' = 'oss://<bucket>/kms-ca.pem',
'kms.akless.assume-role.role-name' = 'FlinkRoleForKMSRead'
);
Postgres CDC コネクターのパラメーターの説明、前提条件、および型マッピングについては、「Postgres CDC コネクター」をご参照ください。
Kafkaコネクタの例
Kafka の認証情報は SASL JAAS 設定で参照します。properties.sasl.jaas.config 内の username と password の値を secret:// を使った参照に置き換えます。その他の Kafka パラメーターは変更しません。KMS に my-kafka-secret という名前の認証情報が作成済みで、SecretData は {"AccountName":"<SASL username>","AccountPassword":"<SASL password>"} であるものとします。
SQL ジョブ: 次の例では Kafka のソーステーブルを使用します。結果テーブルも同様に設定します。
CREATE TEMPORARY TABLE kafka_source (
order_id BIGINT,
user_id BIGINT,
amount INT,
payload STRING
) WITH (
'connector' = 'kafka',
'topic' = '<topic name>',
'properties.bootstrap.servers' = '<broker 1>,<broker 2>,<broker 3>',
'properties.group.id' = '<group id>',
'scan.startup.mode' = 'earliest-offset',
'format' = 'csv',
'properties.security.protocol' = 'SASL_PLAINTEXT',
'properties.sasl.mechanism' = 'PLAIN',
/* usernameとpasswordでKMS認証情報を参照します */
'properties.sasl.jaas.config' = 'org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="secret://kms.my-kafka-secret.AccountName" password="secret://kms.my-kafka-secret.AccountPassword";',
'kms.endpoint' = 'kms.cn-beijing.aliyuncs.com',
'kms.akless.assume-role.role-name' = 'FlinkRoleForKMSRead'
);
データインジェスト YAML ジョブ: ソースとシンクは、それぞれ個別に KMS パラメーターを指定します。ソースは共有ゲートウェイを使用し、シンクは専用ゲートウェイを使用するため、この例では両方を扱います。
source:
type: kafka
name: Kafka Source
topic: <topic name>
value.format: json
scan.startup.mode: earliest-offset
properties.bootstrap.servers: <broker 1>,<broker 2>,<broker 3>
properties.group.id: <group id>
properties.security.protocol: SASL_PLAINTEXT
properties.sasl.mechanism: PLAIN
properties.sasl.jaas.config: org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="secret://kms.my-kafka-secret.AccountName" password="secret://kms.my-kafka-secret.AccountPassword";
# 共有ゲートウェイ:エンドポイントはリージョンごとに固定で、kms.caは不要です
kms.endpoint: kms.cn-beijing.aliyuncs.com
kms.akless.assume-role.role-name: FlinkRoleForKMSRead
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: <broker 1>,<broker 2>,<broker 3>
# ApsaraMQ for Kafkaは冪等書き込みをサポートしていません。VVR 8.0.0以降では冪等性を無効にします
properties.enable.idempotence: false
properties.security.protocol: SASL_PLAINTEXT
properties.sasl.mechanism: PLAIN
properties.sasl.jaas.config: org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="secret://kms.my-kafka-secret.AccountName" password="secret://kms.my-kafka-secret.AccountPassword";
# 専用ゲートウェイ:kms.caも必要です
kms.endpoint: <your-kms-instance-vpc-endpoint>
kms.ca: oss://flink-fullymanaged-<workspace-id>/artifacts/namespaces/<namespace>/PrivateKmsCA_kst-******.pem
kms.akless.assume-role.role-name: FlinkRoleForKMSRead
-
YAML では、
properties.sasl.jaas.configの値にはダブルクォーテーションが含まれています。エスケープせずにそのまま記述してください。 -
SASL アクセス用のエンドポイントアドレスとポートは、ApsaraMQ for Kafka コンソールから取得してください。
Kafka コネクタの完全なパラメーターとセキュリティ設定については、「Kafka SQL コネクタ」および「Kafka YAML コネクタ」をご参照ください。
パラメーターの説明
認証情報の参照形式
KMS 認証情報の参照形式は secret://<provider>.<secret-name>.<key> です。
|
フィールド |
説明 |
|
|
認証情報ソースタイプの識別子です。現在、 |
|
|
KMS での認証情報名です (例: |
|
|
認証情報の SecretData JSON 内のフィールド名 (例: |
例: secret://kms.my-db-secret.AccountPassword
KMSパラメーター
|
パラメーター |
タイプ |
必須 |
説明 |
|
|
String |
はい |
KMS ゲートウェイのアドレス (専用ゲートウェイまたは共有ゲートウェイ)。
|
|
|
String |
専用ゲートウェイで必須 |
CA 証明書の OSS パスです。
|
|
|
String |
いいえ |
KMS へのアクセスに使用する RAM ロールの名前。 このロールは、[セキュリティ] > [RAMロール] で事前に参照されている必要があります。 |