⚙️

【Cloud Data Fusion】インスタンス作成でどハマりした話

2021/04/19に公開

はじめに

皆様、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ユーザのロールは以下の通りです。

  • 組織の管理者[4]
  • Cloud Data Fusion 管理者[5]
  • Logging 管理者

組織の管理者があれば、IAMロールは付与はできると思ってました。

何が起きたのか

Cloud Data FusionのAPIを有効化し、1stステップであるインスタンスの作成をする際
DataprocサービスアカウントにIAMロールを付与できず、下記のエラーとなりました。

6.2.3以降では、Dataprocサービスアカウントを自分で選択することができます。
(付与される権限はCloud Data Fusion 実行者になります)

トラブルシューティングの流れ

  1. バージョン6.1.4でインスタンス作成を試す
  2. IAM画面でサービスアカウントにロール付与
  3. オーナーロールのIAMユーザで試す
  4. Cloud Loggingでエラー内容を確認
  5. 「サービスアカウント管理者」をロール付与

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 関連投稿

脚注
  1. Cloud Data Fusion ↩︎

  2. CDAP ↩︎

  3. Dataproc ↩︎

  4. 組織管理者を追加する ↩︎

  5. Cloud Data Fusion の役割 ↩︎

  6. 基本ロールの定義 ↩︎

  7. IAMロール ↩︎

  8. サービスアカウントロール ↩︎

  9. Google Cloudではじめる実践データエンジニアリング入門 ↩︎

Discussion