【Cloud Data Fusion】インスタンス作成でどハマりした話
はじめに
皆様、GCPのノーコードETLツールであるCloud Data Fusion[1]はご存知でしょうか?
今回は、Cloud Data Fusionでインスタンスを作成する時に
IAM権限周りでどハマりした失敗談について、恥を忍んでナレッジとして共有します^^;
オーナー権限を持っていないエンタープライズ環境のあるある的なやつです。
Cloud Data Fusionとは
Google Cloud Next'19で発表されたノーコードETLツールになります。
2018年にGoogleが買収したオープンソースのCDAP[2]がベースになっています。
CDAPのマネージドサービスがCloud Data Fusionになります。
Cloud Data FusionのETL処理はDataproc[3]上で動作する仕組みとなっています。
DataprocにCloud Data Fusion 実行者のロールが付与されたサービスアカウントを
割り当てて実行します。
多くの方々がすでに優良な記事を書かれています。
【参考】
・ Cloud Data Fusionをさわってみよう
・ ノンプログラミングで使えるデータパイプラインツール Cloud Data Fusion とは
・ Cloud Data FusionのチュートリアルでBigQueryにデータを作ってみる
利用環境
Product | version |
---|---|
Cloud Data Fusion | 2021年4月16日時点 |
CDAP | 6.4.0 |
Region | asia-northeast1 |
【補足】
2021年4月時点において、利用できるCDAPバージョンは以下の4バージョンになります。
- 6.1.4
- 6.2.3
- 6.3.1
- 6.4.0
利用したIAMユーザのロール
インスタンス作成に利用した操作IAMユーザのロールは以下の通りです。
※ 組織の管理者があれば、IAMロールは付与はできると思ってました。
何が起きたのか
Cloud Data FusionのAPIを有効化し、1stステップであるインスタンスの作成をする際
DataprocサービスアカウントにIAMロールを付与できず、下記のエラーとなりました。
6.2.3以降では、Dataprocサービスアカウントを自分で選択することができます。
(付与される権限はCloud Data Fusion 実行者
になります)
トラブルシューティングの流れ
- バージョン6.1.4でインスタンス作成を試す
- IAM画面でサービスアカウントにロール付与
- オーナーロールのIAMユーザで試す
- Cloud Loggingでエラー内容を確認
- 「サービスアカウント管理者」をロール付与
1. バージョン6.1.4でインスタンス作成を試す
- 6.1.4ではDataprocサービスアカウントを指定できないため、エラーにならずにインスタンス作成が可能でした。
2. IAM画面でサービスアカウントにロール付与
- [IAMと管理] > [IAM]を開きます。
- Dataprocサービスアカウントに利用するアカウントに
Cloud Data Fusion 実行者
のロールを付与できるか確認しましたが、問題なく付与できました。
3. オーナーロールのIAMユーザで試す
- 個人で契約しているGCPアカウントを利用して、オーナー[6]ロールのIAMユーザで6.4.0のインスタンスを作成してみました。
- 当然と言えば当然ですが、権限付与でエラーにならずに[作成]ボタンが押せました。
4. Cloud Loggingでエラー内容を確認
- [ロギング] > [ログエクスプローラ]を開きます。
- クエリビルダを使い、以下のクエリで絞り込みます。(IAM and ERROR)
protoPayload.serviceName="iam.googleapis.com"
severity=ERROR
- 以下のログが引っ掛かりました。
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"status": {
"code": 7,
"message": "Permission iam.serviceAccounts.setIamPolicy is required to perform this operation on service account projects/<プロジェクトID>/serviceAccounts/110835236889048555555."
},
"authenticationInfo": {
"principalEmail": "hibino@xxxxx.com",
"principalSubject": "user:hibino@xxxxx.com"
},
"requestMetadata": {
"callerIp": "xxx.xxx.xxx.xxx",
"callerSuppliedUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36,gzip(gfe)",
"requestAttributes": {
"time": "2021-04-16T06:01:26.125253833Z",
"auth": {}
},
"destinationAttributes": {}
},
"serviceName": "iam.googleapis.com",
"methodName": "google.iam.admin.v1.SetIAMPolicy",
"authorizationInfo": [
{
"permission": "iam.serviceAccounts.setIamPolicy",
"resourceAttributes": {}
}
],
"resourceName": "projects/-/serviceAccounts/110835236889048555555",
"serviceData": {
"@type": "type.googleapis.com/google.iam.v1.logging.AuditData",
"policyDelta": {}
},
"request": {
"resource": "projects/<プロジェクトID>/serviceAccounts/110835236889048555555",
"@type": "type.googleapis.com/google.iam.v1.SetIamPolicyRequest",
"policy": {
"bindings": [
{
"role": "roles/iam.serviceAccountUser",
"members": [
"serviceAccount:service-xxxxxxxxxxxx@gcp-sa-datafusion.iam.gserviceaccount.com"
]
}
],
"etag": "ACAB",
"version": 3
}
},
"response": {
"@type": "type.googleapis.com/google.iam.v1.Policy"
}
},
"insertId": "1pvw07pe4u91f",
"resource": {
"type": "service_account",
"labels": {
"email_id": "cloud-data-fusion-poc@<プロジェクトID>.iam.gserviceaccount.com",
"unique_id": "110835236889048555555",
"project_id": "<プロジェクトID>"
}
},
"timestamp": "2021-04-16T06:01:26.028077086Z",
"severity": "ERROR",
"logName": "projects/<プロジェクトID>/logs/cloudaudit.googleapis.com%2Factivity",
"receiveTimestamp": "2021-04-16T06:01:26.672669143Z"
}
5. 「サービスアカウント管理者」をロール付与
-
iam.serviceAccounts.setIamPolicy権限が含まれるIAMロールは下記2つになります。
[IAM] > [セキュリティ管理者][7]
[Service Accounts] > [サービスアカウント管理者][8]
- サービスアカウント管理者の方が権限が弱いため、安全にこちらをIAMユーザに付与しました。
- この状態で再度6.4.0でインスタンス作成してみると、サービスアカウントに権限付与することができ、インスタンスも無事作成できました。
まとめ
さて、いかがでしたでしょうか。
2021年2月に発売されたGoogle Cloudではじめる実践データエンジニアリング入門[9]にもCloud Data Fusionの操作方法について触れられていますが、このサービスアカウントに権限を付与するIAMロールの件は書かれていませんでした。
これまで試してみた系の記事を書かれているブログもおそらくオーナー権限で操作されているのかなと思いました。
この記事を参考にして頂き、同じ失敗でハマる人が出ないことを願うばかりです^^;
Cloud Data Fusion 関連投稿
- 本格的なパイプライン作ってみた!
- GCSバケット消えない問題
- プライベートインスタンスでS3からデータ収集する方法
- パイプライン実行エラー検知方法
- ZIPファイルの取り込み時の苦戦とその解決方法
- パイプライン失敗時のSlack通知方法
Discussion