⚙️

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

8 min read

はじめに

皆様、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ロールを付与できず、下記のエラーとなりました。

The action couldn't be completed because you don't have the right permissions. Click here to learn about service account requirements and limitations.

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サービスアカウントを指定できないため、エラーにならずにインスタンス作成が可能でした。

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"
}

どうやらサービスアカウントにIAMロールを付与するiam.serviceAccounts.setIamPolicy権限が足りないというエラーで怒られているようです。

5. 「サービスアカウント管理者」をロール付与

  • iam.serviceAccounts.setIamPolicy権限が含まれるIAMロールは下記2つになります。
    [IAM] > [セキュリティ管理者][7]
    [Service Accounts] > [サービスアカウント管理者][8]
  • サービスアカウント管理者の方が権限が弱いため、安全にこちらをIAMユーザに付与しました。
  • この状態で再度6.4.0でインスタンス作成してみると、サービスアカウントに権限付与することができ、インスタンスも無事作成できました。

今回、利用したIAMユーザには「組織の管理者」が付与されていたので、エラーにはなりませんでしたが、「編集者」で実施するとresourcemanager.projects.setIamPolicyも足りないと怒られます。「Project IAM 管理者」のロールも付与してください。

まとめ

さて、いかがでしたでしょうか。

2021年2月に発売されたGoogle Cloudではじめる実践データエンジニアリング入門[9]にもCloud Data Fusionの操作方法について触れられていますが、このサービスアカウントに権限を付与するIAMロールの件は書かれていませんでした。

これまで試してみた系の記事を書かれているブログもおそらくオーナー権限で操作されているのかなと思いました。

この記事を参考にして頂き、同じ失敗でハマる人が出ないことを願うばかりです^^;

しかしながら、この手順で必要なロールを割り当てると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

ログインするとコメントできます