kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

GCPサービスアカウントでgsutilを利用したりAPIアクセスする方法

GCPのリソース、例えばGoogle Cloud Storageにアクセスする際に個人のアカウントを使って gcloud auth login などで認証すればgsutilでアクセスできるけれど、サーバーサイドのアプリケーションなどからアクセスする場合は個人のアカウントで認証したくはないですね。

このような用途のためにGCPにはサービスアカウントというのがあるようです。このサービスアカウントを使ってGCPリソースにアクセスする方法についてメモっておきます。

サービスアカウントの取得

Google Developer Consoleの "APIs & auth" -> "Credentials" -> "Add credentials" から "Service account" を選択します。

そうすると Key type として "JSON" か "P12" を選択できるので、"JSON"を選択して "Create" します。そうすると、json ファイルがダウンロードされます。

過去の情報ではJSONファイルを利用した認証にはバグがあってP12で回避しているものがありますが、今では解消されておりJSONを推奨しているようなので、JSONを利用します。

取得したJSONファイル内にも記載されていますが、コンソールにもEmail addressが表示されるのでこれは後で使います。このEmail addressで認証してアクセスするような感じとなっているようです。

APIアクセスでの使い方

Goであれば、

go-docs-samples/listbuckets.go at master · GoogleCloudPlatform/go-docs-samples · GitHub

にサンプルがあります。これを動かすにはまず以下のように go get します。

$ go get golang.org/x/oauth2/google
$ go get google.golang.org/api/storage/v1

ビルド後、

  • JSONファイルを指定するGOOGLE_APPLICATION_CREDENTIALS 環境変数
  • プロジェクトを指定する TEST_PROJECT_ID 環境変数(これはこのサンプル特有のもの)

を指定して、実行します。以下のような感じです。

$ GOOGLE_APPLICATION_CREDENTIALS=/path/to/myproject-9999-9c82deb7e430.json TEST_PROJECT_ID=myproject-9999 ./listbuckets

これで、Google Cloud Storage のBucketが表示されます。

gcloud(gsutil)での使い方

gcloud(gsutil)の場合、

$ GOOGLE_APPLICATION_CREDENTIALS=/path/to/myproject-9999-9c82deb7e430.json gsutil ls -p myproject-9999

でいけるかと思いきや、これは認証を通りませんでした(jsonファイルを読んでいない感じ)。

なので、以下のようにして key file を使ってサービスアカウントをActivateします。Mail Address部分は上記で出てきたメールアドレスです。JSONファイル内にも記載されています。

$ gcloud auth activate-service-account XXXXXXX-zzzzzzzzzzzzzzzzzzzzzzzzzz@developer.gserviceaccount.com --key-file /path/to/myproject-9999-9c82deb7e430.json --project myproject-9999

これで、gcloud auth list で確認すると

$ gcloud auth list
Credentialed accounts:
 - XXXXXXX-zzzzzzzzzzzzzzzzzzzzzzzzzz@developer.gserviceaccount.com (active)

To set the active account, run:
  $ gcloud config set account ``ACCOUNT''

のようになっています。

この状態で

$ gsutil ls

とすれば、Bucket一覧が表示されます。

参考にした情報