とりゅふの森

GCPデータエンジニアとして生きる

【GCP入門】GCPサービスアカウントを発行する【認証・権限設定もしよう】

f:id:true-fly:20220211224629p:plain

本ブログでは、GCPの各プロダクトや、Googleが提供する各種サービスを利用した記事をたくさん公開しています。
これらのサービスはそれぞれAPIを提供しており、Web上で利用しているサービスをPythonなどのプログラムで実行することができます。

WebブラウザでGoogleのサービスを実行するときは、自分のGoogleアカウントで認証して操作します。では、プログラムでそれらのサービスを操作するときはどうすれば良いでしょうか?毎回プログラムを実行するたびに、Webブラウザ上でGoogleアカウント認証を挟むのでしょうか?
Googleのサービスは、GCPのサービスアカウントを用いて認証することができます。

今回は、私のブログでも頻繁に出現する、GCPのサービスアカウントの利用方法について、簡単にご紹介します!

そもそもGCPサービスアカウントとは?

そもそもGCPサービスアカウントとは何者なのか?
Googleのアカウントといえば、企業などの独自ドメインを設定していない限り、
[アカウント名]@gmail.com
のメールアドレスで表されます。Gmailのアドレスってやつですね。

Googleアカウントはヒトに紐づくもので、ヒトがこのアカウントの認証情報を通して、Googleの各種サービスを利用します。

一方でGCPサービスアカウントは、GCPのプロジェクトに紐づくものです。一般的にはヒトではなく、プログラム等が認証して利用するものといえます。

[アカウント名]@[GCPのプロジェクトID].iam.gserviceaccount.com
で表します。
プログラムがこのGCPサービスアカウントで認証し、各種サービスを自動で操作するのです。

API KEY等を発行し、それで認証する方法と近いものがあります。

しかし、GCPサービスアカウントは、Googleアカウントと同様に、"アカウント"であるため、後述するGCP側の権限設定を、Googleアカウントと同様の手段で設定できることができます。

GCPサービスアカウントを発行する

まずはGCPコンソールにアクセスします。
ハンバーガーメニューから、[IAMと管理] > [サービスアカウント]から、サービスアカウント一覧画面にアクセスしましょう。
https://console.cloud.google.com/iam-admin/serviceaccounts?hl=ja

画面上部の[+ サービスアカウントを作成]をクリックします。

サービスアカウント名、サービスアカウントID、説明を設定します。
アカウント名を入力すると、IDはアカウント名 + @プロジェクトID.iam.gserviceaccount.comになるので、
アカウント名を英数ハイフンで設定するとわかりやすいです。
②、③のアクセス許可設定については省略で大丈夫です。必要があればあとから設定可能です。

f:id:true-fly:20220211201739p:plain:w480

サービスアカウントの一覧画面で、作成したアカウントが確認できたら完了です!

サービスアカウントの秘密鍵を発行する

このサービスアカウントを使って、プログラムで認証するために秘密鍵を発行します。

GCPコンソールのサービスアカウント一覧画面から、秘密鍵を作成したいアカウントの右側の縦三点リーダーから、[鍵を管理]を選択します。

f:id:true-fly:20220211204531p:plain

作成してからなにもしていないサービスアカウントには鍵が存在しないので、[鍵を追加] > [新しい鍵を作成]を選択します。

f:id:true-fly:20220211204649p:plain

キータイプを選択します。JSONが推奨されているので、特に変更せず、[作成]をクリックします。
するとPC上にJSONファイルが保存されます。

f:id:true-fly:20220211204809p:plain

では、このJSONファイルを用いて、自分のGCPプロジェクトにアクセスしてみましょう。

gcloud SDKとサービスアカウントを用いてGCPにアクセスする

ローカルPCにgcloud SDKをインストールします。

cloud.google.com

インストール後、カレントディレクトリにサービスアカウントの秘密鍵を配置します。
今回は、credentials.jsonという名前で配置しています。

まずは秘密鍵を用いて認証します。

$ gcloud auth activate-service-account --key-file credentials.json
Activated service account credentials for: [sample-account@******.iam.gserviceaccount.com]

以下のコマンドでアクティブになっているアカウントが確認できます。*がついているのが、現在アクティブなアカウントです。

$ gcloud auth list
                    Credentialed Accounts
ACTIVE  ACCOUNT
        ******@gmail.com
*       sample-account@******.iam.gserviceaccount.com

では、この状態で、gsutil lsコマンドを実行し、プロジェクト配下のバケット一覧を取得してみます。

$ gsutil ls
AccessDeniedException: 403 sample-account@******.iam.gserviceaccount.com does not have storage.buckets.list access to the Google Cloud project.

403エラーになりました。まだサービスアカウントがstorage.buckets.listを持っていないため、エラーになります。

サービスアカウントにGCPのロールを設定する

再びGCPコンソールにアクセスし、[IAMと管理] > [IAM]を開きます。
画面上部の[追加]をクリックします。

f:id:true-fly:20220211212442p:plain

サービスアカウントと、設定したいロールを選択しましょう。
今回はgsutil lsコマンドを通したいので、「ストレージ管理者」ロールを設定します。

f:id:true-fly:20220211213541p:plain

gsutil lsコマンドを実行し、バケットの一覧が取得できたら成功です!

$ gsutil ls
gs://******/
gs://******/

まとめ

以上、今回はGCPサービスアカウントの作り方と、秘密鍵の作り方、gcloud SDKによる認証方法について簡単にご紹介しました。
本ブログでもサービスアカウントを使ったソースコードを紹介する機会が多いので、その時はこの記事に戻ってお役に立てれば幸いです!