Help us understand the problem. What is going on with this article?

【GCP】Google Cloud Storage を curl コマンドで利用する

More than 1 year has passed since last update.

はじめに

curl コマンドのみで Google Cloud Storage の API を利用する手順を確立させたのでメモ。

手順

前提

  • Google Cloud Platform
  • Curl

Google Cloud Storage JSON API の有効化

Google Cloud Platform にログインし、任意のプロジェクトで設定を行っていきます。

まず、API ライブラリで Google Cloud Storage JSON API を有効にします。
image.png

OAuth 同意画面作成

認証情報ページで、クライアントIDに Google Cloud Storage JSON API の利用権限を付与するためのOAuth同意画面を新規作成します。
[アプリケーション名]に任意のアプリ名を指定します。
image.png

[スコープの追加]をクリックし、スコープ一覧からGoogle Cloud Storage JSON APIで検索して、[../auth/devstorage.read_write]にチェックを入れ、[追加]をクリックします。
image.png

スコープ一覧に「../auth/devstorage.read_write」が追加されたら、[保存]をクリックします。
image.png

クライアントID作成

OAuth同意画面の作成を保存すると、次にクライアントID作成画面が表示されます。

[アプリケーションの種類]から[ウェブアプリケーション]を選択し、任意のクライアントID名を指定して、[承認済みのリダイレクト URI]にhttp://localhostを指定し、[作成]をクリックします。
スクリーンショット 2019-03-19 16.27.40.png

クライアントIDとクライアントシークレットがダイアログ表示されるので控えておきます。

認証コードの取得

クエリ名 説明
scope https://www.googleapis.com/auth/devstorage.read_write スコープ一覧に記載されている利用したいAPIのスコープURI
redirect_uri http://localhost クライアントID作成時に指定した[承認済みのリダイレクト URI]の値
client_id 先程控えたクライアントID クライアントID
response_type code 固定値
access_type offline 固定値

https://accounts.google.com/o/oauth2/v2/authに上記のクエリを指定してWebブラウザからアクセスします。

URI例

https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http://localhost&client_id=XXXXXXX.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/devstorage.read_write&response_type=code&access_type=offline

表示されるOAuth同意画面に従い、Google アカウントでのログインおよびAPIスコープへの権限付与の許可を行います。

http://localhost画面にリダイレクトされたら、URL欄に表示されているリダイレクト先URIのcodeクエリの値が認証コードなので控えます。
image.png

リダイレクト先URI例

http://localhost/?code=4/EgEanhtbO...&scope=https://www.googleapis.com/auth/devstorage.read_write

アクセストークン/リフレッシュトークンの取得

クエリ名 説明
redirect_uri http://localhost クライアントID作成時に指定した[承認済みのリダイレクト URI]の値
client_id 先程控えたクライアントID クライアントID
client_secret 先程控えたクライアントシークレット クライアントシークレット
code 先程控えた認証コード 認証コード
grant_type authorization_code 固定値
access_type offline 固定値

上記のクエリを指定して下記例の通りリクエストを実行します。

実行例

$ REDIRECT_URI=http://localhost
$ CLIENT_ID=...
$ CLIENT_SECRET=...
$ AUTHORIZATION_CODE=...
$ curl --data "redirect_uri=${REDIRECT_URI}" \
     --data "client_id=${CLIENT_ID}" \
     --data "client_secret=${CLIENT_SECRET}" \
     --data "code=${AUTHORIZATION_CODE}" \
     --data "grant_type=authorization_code" \
     --data "access_type=offline" \
     https://www.googleapis.com/oauth2/v4/token

{
  "access_token": "ya29....",
  "expires_in": 3600,
  "refresh_token": "1/Z...",
  "scope": "https://www.googleapis.com/auth/devstorage.read_write",
  "token_type": "Bearer"
}

アクセストークンaccess_tokenとリフレッシュトークンrefresh_tokenが取得できました。

Google Cloud Storage JSON API の利用(例:ファイルアップロード)

バケットが未作成の場合はGoogle クラウド ストレージにバケットを作成します。
image.png

API Reference: https://cloud.google.com/storage/docs/json_api/v1/
アップロードコマンド: https://cloud.google.com/storage/docs/uploading-objects?hl=ja

必要なパラメータ(アップロード時) 説明
OBJECT アップロードしたいローカルファイルのパス
OAUTH2_TOKEN 先程取得したアクセストークン
OBJECT_CONTENT_TYPE アップロードしたいファイルのMIMEタイプ
BUCKET_NAME アップロード先のバケット名
OBJECT_NAME アップロード後のファイル名

例えば、バケットにファイルをアップロードするには、上記のパラメータを指定して下記例の通りリクエストを実行します。

アップロード実行例

$ ls
file1.txt
$ OBJECT=file1.txt
$ AUTH2_TOKEN=ya29....
$ OBJECT_CONTENT_TYPE=text/plain
$ BUCKET_NAME=test...
$ OBJECT_NAME=file1.txt
$ curl -X POST --data-binary @${OBJECT} \
    -H "Authorization: Bearer ${OAUTH2_TOKEN}" \
    -H "Content-Type: ${OBJECT_CONTENT_TYPE}" \
    "https://www.googleapis.com/upload/storage/v1/b/${BUCKET_NAME}/o?uploadType=media&name=${OBJECT_NAME}"

ファイルがバケット内にアップロードされました。
image.png

アクセストークンの更新

アクセストークンの有効期限は3600秒です。期限切れの場合はリフレッシュトークンを利用してアクセストークンを更新する必要があります。

クエリ名 説明
client_id 先程控えたクライアントID クライアントID
client_secret 先程控えたクライアントシークレット クライアントシークレット
refresh_token 先程認証コードを利用して取得したリフレッシュトークン リフレッシュトークン
grant_type refresh_token 固定値

新しいアクセストークンを取得する場合は、上記のクエリを指定して下記例の通りリクエストを実行します。

$ CLIENT_ID=...
$ CLIENT_SECRET=...
$ REFRESH_TOKEN=...
$ curl --data "client_id=${CLIENT_ID}"  \
    --data "client_secret=${CLIENT_SECRET}"  \
    --data "refresh_token=${REFRESH_TOKEN}"  \
    --data "grant_type=refresh_token" \
    https://www.googleapis.com/oauth2/v4/token

{
  "access_token": "ya29....",
  "expires_in": 3600,
  "scope": "https://www.googleapis.com/auth/devstorage.read_write",
  "token_type": "Bearer"
}

これで次回期限(3600秒間)まで有効なアクセストークンaccess_tokenを再度取得することができました。
リフレッシュトークンは次回のアクセストークン更新でも継続して利用することが可能です。
実際の利用では、「アクセストークンの更新」→「Google Cloud Storage JSON API の利用」を毎回セットで実施することになるかと思います。

おわりに

アタッチやボリュームマウントができない Docker コンテナ内で生成したファイルを回収するために、gsutil の導入や json キーの環境変数への埋込みを行わずに Google Cloud Storage にファイルアップロードをしたかったので、これで何とかなりました。

r-wakatsuki
クラウド技術(主にAWS)、Docker、Pythonなどの小ネタ中心。
https://dev.classmethod.jp/author/wakatsuki-ryuta/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away