本ブログでは、GCPの各プロダクトや、Googleが提供する各種サービスを利用した記事をたくさん公開しています。
これらのサービスはそれぞれAPIを提供しており、Web上で利用しているサービスをPythonなどのプログラムで実行することができます。
WebブラウザでGoogleのサービスを実行するときは、自分のGoogleアカウントで認証して操作します。では、プログラムでそれらのサービスを操作するときはどうすれば良いでしょうか?毎回プログラムを実行するたびに、Webブラウザ上でGoogleアカウント認証を挟むのでしょうか?
Googleのサービスは、GCPのサービスアカウントを用いて認証することができます。
- そもそもGCPサービスアカウントとは?
- GCPサービスアカウントを発行する
- サービスアカウントの秘密鍵を発行する
- gcloud SDKとサービスアカウントを用いてGCPにアクセスする
- サービスアカウントにGCPのロールを設定する
- まとめ
そもそもGCPサービスアカウントとは?
そもそもGCPサービスアカウントとは何者なのか?
Googleのアカウントといえば、企業などの独自ドメインを設定していない限り、
[アカウント名]@gmail.com
のメールアドレスで表されます。Gmailのアドレスってやつですね。
[アカウント名]@[GCPのプロジェクトID].iam.gserviceaccount.com
で表します。
プログラムがこのGCPサービスアカウントで認証し、各種サービスを自動で操作するのです。
API KEY等を発行し、それで認証する方法と近いものがあります。
GCPサービスアカウントを発行する
まずはGCPコンソールにアクセスします。
ハンバーガーメニューから、[IAMと管理] > [サービスアカウント]から、サービスアカウント一覧画面にアクセスしましょう。
https://console.cloud.google.com/iam-admin/serviceaccounts?hl=ja
画面上部の[+ サービスアカウントを作成]をクリックします。
サービスアカウント名、サービスアカウントID、説明を設定します。
アカウント名を入力すると、IDはアカウント名 + @プロジェクトID.iam.gserviceaccount.com
になるので、
アカウント名を英数ハイフンで設定するとわかりやすいです。
②、③のアクセス許可設定については省略で大丈夫です。必要があればあとから設定可能です。
サービスアカウントの一覧画面で、作成したアカウントが確認できたら完了です!
サービスアカウントの秘密鍵を発行する
このサービスアカウントを使って、プログラムで認証するために秘密鍵を発行します。
GCPコンソールのサービスアカウント一覧画面から、秘密鍵を作成したいアカウントの右側の縦三点リーダーから、[鍵を管理]を選択します。
作成してからなにもしていないサービスアカウントには鍵が存在しないので、[鍵を追加] > [新しい鍵を作成]を選択します。
キータイプを選択します。JSONが推奨されているので、特に変更せず、[作成]をクリックします。
するとPC上にJSONファイルが保存されます。
では、このJSONファイルを用いて、自分のGCPプロジェクトにアクセスしてみましょう。
gcloud SDKとサービスアカウントを用いてGCPにアクセスする
ローカルPCにgcloud SDKをインストールします。
インストール後、カレントディレクトリにサービスアカウントの秘密鍵を配置します。
今回は、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]を開きます。
画面上部の[追加]をクリックします。
サービスアカウントと、設定したいロールを選択しましょう。
今回はgsutil ls
コマンドを通したいので、「ストレージ管理者」ロールを設定します。
gsutil ls
コマンドを実行し、バケットの一覧が取得できたら成功です!
$ gsutil ls
gs://******/
gs://******/
まとめ
以上、今回はGCPサービスアカウントの作り方と、秘密鍵の作り方、gcloud SDKによる認証方法について簡単にご紹介しました。
本ブログでもサービスアカウントを使ったソースコードを紹介する機会が多いので、その時はこの記事に戻ってお役に立てれば幸いです!