Vertex AI Pipelines のサービスアカウントで少しつまずいたので整理した

· 6min · Masataka Kashiwagi

Vertex AI Pipelines のサービスアカウント周りが少し分かりづらかったのと,GCP の他のサービスへの権限付与(IAM ロールの付与)の方法について備忘録として残しておく.

Vertex AI Pipelines に関連する3つのサービスアカウント

Vertex AI Pipelines に関連するサービスアカウントは下記の3つがある.

  • ① パイプライン実行時に指定できるサービスアカウント
  • パイプラインの各コンポーネントが各種リソースにアクセスするために GCP 側が用意したサービスアカウント(サービスエージェント)
    • ② Vertex AI Service Agent
    • ③ Vertex AI Custom Code Service Agent

パイプライン実行時に指定できるサービスアカウント

Vertex AI Pipelines の job.submit に指定できるサービスアカウントでパイプライン実行をするために使用される.これを指定しない場合は,Compute Engine のデフォルトのサービスアカウントを使用してパイプラインが実行される.

# sample code
SERVICE_ACCOUNT = os.environ["SERVICE_ACCOUNT"]
PROJECT_ID = os.environ["PROJECT_ID"]

job = aiplatform.PipelineJob(
    display_name="sample-pipelines",
    template_path="sample-pipelines.json",
    project=PROJECT_ID,
    location="asia-northeast1",
    enable_caching=False
)

job.submit(service_account=SERVICE_ACCOUNT)

僕はこのサービスアカウントを開発時に勘違いしていて,ここのサービスアカウントに指定したもので,パイプラインの全てのコンポーネントが動くと勘違いしていた.なので,ML 用にカスタマイズした(必要な IAM ロールを付与)サービスアカウントを指定して実行したものの,権限エラーで動かずという感じで困っていた.

次に説明する2つのサービスアカウントが実際の各コンポーネントを動かすサービスアカウントになっている.

GCP 側が用意したサービスアカウント(サービスエージェント)

Vertex AI に関する GCP 側が用意したサービスアカウント(サービスエージェント)は2つある.

  1. Vertex AI Custom Code Service Agent
  2. Vertex AI Service Agent

IAM ロールの画面上では,以下のような登録になっている.

PrincipalNameRole
service-PROJECT_NUMBER@gcp-sa-aiplatform-cc.iam.gserviceaccount.comAI Platform Custom Code Service AgentVertex AI Custom Code Service Agent
[email protected]AI Platform Service AgentVertex AI Service Agent

Vertex AI Custom Code Service Agent

このロールはカスタムトレーニングコードを実行するために使用され,付与されているロールは Vertex AI Custom Code Service Agent (roles/aiplatform.customCodeServiceAgent) ドキュメントから確認できる.

Vertex AI Service Agent

このロールはVertex AI 全般の機能を動作させるために使用され,付与されているロールは Vertex AI Service Agent (roles/aiplatform.serviceAgent) ドキュメントから確認できる.

実際のパイプラインの各コンポーネントの権限は,上記2つのサービスアカウントのどちらかが使われることになるので,このどちらかのサービスアカウントに予め付与されていないサービスを使う場合は権限エラーになってしまう.そのため,使用したいサービスの権限がリンク先のアクセスコントロールのページで付与されていない場合は,IAM ロールの画面から追加する必要がある.

GCP 側が用意したサービスアカウントに IAM ロールを付与する方法

2つのサービスアカウントのうち使用されるアカウントに対して,適宜必要なロールを付与することで権限がなかったサービスにもアクセスすることができる.

例えば,Firestore へのアクセスは上記2つのアカウントには付与されていないため,デフォルトの状態だと権限不足でアクセスできない.そのため read/write できる Cloud Datastore User (roles/datastore.user) のロールを追加で付与することで Firestore への読み書きができるようになる.

IAM ロールの設定画面

画面上からだと,上図の「Include Google-provided role grants」にチェックを入れることで,GCP 側が用意したサービスアカウントが表示される.上記2つのサービスアカウントを探して必要な権限を編集して追加することで権限エラーを回避することができる.


job.summit 時に指定したサービスアカウントでパイプラインのコンポーネント動かせると思い込んでいて,実際はパイプラインを実行するだけだったので,若干混乱した.

パイプラインを動かす実際のサービスアカウントは別で2つ存在しており,このドキュメントを見つけることがすぐにできず,時間を消費してしまったのもあり,もしこの辺りで悩んでいる人が居れば参考になるかなと思い,備忘録として今回残すことにした.


このエントリーをはてなブックマークに追加

ブログ記事を読んで頂き,ありがとうございます!もしこの記事が良かったり参考になったら,「Buy me a coffee」ボタンから☕一杯をサポートして頂けるとモチベーションが上がります!どうぞよろしくお願いします🤩