iyuichiの私的開発ログ

渋谷で働くWebエンジニアのログ. Java, Android, iOS, Docker, GCP, AWS, ゲーム開発

gcloudコマンドでGoogle Cloud Strageを使うときにハマったこと

Google Cloud StrageはGoogleが提供するAmazonのS3みたいなものです。

こいつに接続するためにコマンドラインツールが提供されているので利用してみます。 以下のページでインストール方法などは見られます。

Developer Tools - Tools — Google Cloud Platform

最初、試してみるときには

gcloud auth login

としてブラウザが起動してGoogleアカウントでログインする方法でやってました。 それでも良かったのですが、管理画面をみていたら

APIと認証->認証情報->新しいクライアントIDを作成

とするとAPIアクセス用のサービスユーザの作成ができるようなのでそちらでやってみよう!と思ったら軽くハマりました。

サービスIDを使ってgsutilを動かす

まずは以下の画面で新しいクライアントIDの作成を押します。

f:id:iyuichi:20150415153732p:plain

すると以下のようなポップアップが出てくるのでサービスアカウントを選択して作成をします。

f:id:iyuichi:20150415153913p:plain

アカウントができあがるとjsonファイルが落ちてくるのですが、こいつがハマりどころです。

このファイルを利用して認証を行うためには以下のコマンドを利用します。

gcloud auth activate-service-account - Cloud SDK — Google Cloud Platform

gcloud auth activate-service-account [ACCOUNT] --key-file xxxxxxxxxxx.json --project xxxxxxx

[ACCOUNT] には以下の画面のメールアドレスを入れます。 f:id:iyuichi:20150416081723p:plain

key-fileはダウンロードされたjsonファイルへのパス projectは後でもセットできますが、メニューの概要から見られるプロジェクトIDですので入れておきました。 あとから設定する場合は以下のようにコマンドを打ちます。

gcloud config set project PROJECT

さてこれでバケットに対してlsしてみると少し時間がかかった後でエラーがでました。

$ gsutil ls gs://test_bucket/
You are attempting to access protected data with no configured
credentials. Please visit https://cloud.google.com/console#/project
and sign up for an account, and then run the "gcloud auth login"
command to configure gsutil to use these credentials.

なんだかログインしろと言われているようですが、サービスアカウントなんで。。。 なにが起きているのかよくわからなかったのでデバッグモードで実行してみます。

$ gsutil -D ls gs://test_bucket/

すると以下のようなエラーが何回か出て終了していて401エラーが発生していることがわかりました。

gsutil/4.11 (darwin) Cloud SDK Command Line Tool 0.9.55\r\n\r\n'
reply: 'HTTP/1.1 401 Unauthorized\r\n'
header: Vary: Origin
header: Vary: X-Origin
header: WWW-Authenticate: Bearer realm="https://accounts.google.com/"
header: Content-Type: application/json; charset=UTF-8
header: Content-Encoding: gzip
header: Date: Wed, 15 Apr 2015 05:37:17 GMT
header: Expires: Wed, 15 Apr 2015 05:37:17 GMT
header: Cache-Control: private, max-age=0
header: X-Content-Type-Options: nosniff
header: X-Frame-Options: SAMEORIGIN
header: X-XSS-Protection: 1; mode=block
header: Server: GSE
header: Alternate-Protocol: 443:quic,p=0.5
header: Transfer-Encoding: chunked
DEBUG 0415 14:37:17.889982 http_wrapper.py] Response returned status 401, retrying

いろいろネット上を調べてみたところどうもツールのバグらしいことがわかってきました。 ソースは以下です。

How do I access a google cloud storage bucket using a service account from the command line? - Server Fault

Issue 162 - google-compute-engine - gsutil issues with service account JSON keys - Google Compute Engine issue tracker - Google Project Hosting

ということで、jsonのファイルでの認証はあきらめてp12証明書をダウンロードして動かしてみることにしました。 すると今度はこんなメッセージが。

WARNING: .p12 service account keys are deprecated.  Please switch to a new .json service account key for this account.
Password:
ERROR: (gcloud.auth.activate-service-account) PyOpenSSL is not available. If you have already installed PyOpenSSL, you will need to enable site packages by setting the environment variable CLOUDSDK_PYTHON_SITEPACKAGES to 1. If that does not work, see https://developers.google.com/cloud/sdk/crypto for details or consider using .json private key instead.

エラーメッセージにあるように以下のページに書かれている通りにpythonのモジュールのインストールと環境変数の設定をしたら、今度はあっさりとgsutilが動きました。

The Google Cloud SDK and PyOpenSSL - Cloud SDK — Google Cloud Platform

ちょっとした罠があったのでメモとして。 意外に情報少なくてサービスアカウント使うのって少数派なのかな? 個人的には複数人で開発するGCPプロジェクトではGoogleアカウントに紐付かないのでこちらの方がいいと思うのだけど。

ということで今回は以上です!