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の作成を押します。
すると以下のようなポップアップが出てくるのでサービスアカウントを選択して作成をします。
アカウントができあがるとjsonファイルが落ちてくるのですが、こいつがハマりどころです。
このファイルを利用して認証を行うためには以下のコマンドを利用します。
gcloud auth activate-service-account - Cloud SDK — Google Cloud Platform
gcloud auth activate-service-account [ACCOUNT] --key-file xxxxxxxxxxx.json --project xxxxxxx
[ACCOUNT] には以下の画面のメールアドレスを入れます。
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
いろいろネット上を調べてみたところどうもツールのバグらしいことがわかってきました。 ソースは以下です。
ということで、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アカウントに紐付かないのでこちらの方がいいと思うのだけど。
ということで今回は以上です!