サービスアカウントの鍵を発行せずに権限を借用してgcloudコマンドを実行する

2024.05.08

Google Cloudデータエンジニアのはんざわです。
普段、様々な検証を行う際にユーザーアカウントからサービスアカウントに切り替えて、Google Cloudのコマンドを実行するケースが頻繁にあります。
そのような場合にどのような方法でアカウントを切り替えてコマンドを実行しているかを紹介したいと思います。

はじめに

ユーザーアカウントからサービスアカウントに切り替える方法はいくつかあります。

よくある方法だとサービスアカウントの鍵を発行し、gcloud auth loginで鍵のファイルを渡す方法があります。
しかし、この方法はセキュリティ上の関係で現在では推奨されていない方法になり、鍵を発行するのも手間です。

他にもWorkload Identityを使用する方法がありますが、同様に設定が手間です。

今回の記事では、そのような手間を一切かけずにサービスアカウントに切り替えて、Google Cloudの各コマンドを実行する方法を紹介したいと思います。

検証

サービスアカウントを作成する

まずは検証に使用するサービスアカウントを作成し、BigQuery データ閲覧者の権限を付与します。

# サービスアカウントを作成
gcloud iam service-accounts create sa-sample

# 作成したサービスアカウントに権限を付与
gcloud projects add-iam-policy-binding <PROJECT_ID> \
  --member="serviceAccount:sa-sample@<PROJECT_ID>.iam.gserviceaccount.com" \
  --role="roles/bigquery.dataViewer" \
  --condition=None

サービスアカウントの権限を借用する

以下のドキュメントを参考にしています。

ここで注意点ですが、コマンドを実行するアカウントにサービスアカウントトークン作成者(roles/iam.serviceAccountTokenCreator)の権限が必要になります。
余談ですが、プロジェクトのオーナー権限にも必要な権限が含まれていなかったので別途権限を付与しました。

次のコマンドを実行すると、Google Cloudのコマンド実行時にデフォルトで選択したサービスアカウントが使用されるようになります。

gcloud config set auth/impersonate_service_account sa-sample@<PROJECT_ID>.iam.gserviceaccount.com

> Updated property [auth/impersonate_service_account].

コマンドを実行してみる

まずは試しにbq lsコマンドを実行してみます。

bq ls

> WARNING: This command is using service account impersonation. All API calls will be executed as [sa-sample@<PROJECT_ID>.iam.gserviceaccount.com].

    datasetId      
------------------ 
 samples_dataset

BigQueryのデータセットの一覧が表示されました。
また、サービスアカウントの権限を借用しているため下記のような警告が出ています。

This command is using service account impersonation. All API calls will be executed as [sa-sample@.iam.gserviceaccount.com].

次に権限を付与していないgcloud storage lsコマンドを実行してみます。

gcloud storage ls

> WARNING: This command is using service account impersonation. All API calls will be executed as [sa-sample@<PROJECT_ID>.iam.gserviceaccount.com].
> WARNING: This command is using service account impersonation. All API calls will be executed as [sa-sample@<PROJECT_ID>.iam.gserviceaccount.com].
> ERROR: (gcloud.storage.ls) HTTPError 403: sa-sample@<PROJECT_ID>.iam.gserviceaccount.com does not have storage.buckets.list access to the Google Cloud project. Permission 'storage.buckets.list' denied on resource (or it may not exist).

想定通り、権限が足りずにエラーを吐きました。

まとめ

今回は簡単にサービスアカウントに切り替えて、Google Cloudの各コマンドを実行する方法を紹介しました。

自分の場合は、gcloud config set auth/impersonate_service_accountとコマンドを実行するのも面倒なので.bashrcに覚えやすい関数名で登録しています。
同じようなケースに出会った方は是非、活用してみてください!