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
ビルド後、
を指定して、実行します。以下のような感じです。
$ 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一覧が表示されます。