Posted at

APIを使ってGoogle Cloud StorageへUploadしてみた

More than 1 year has passed since last update.


初めに

やりたいことはすごく簡単なはずなのに、いろんなドキュメント見てもぱっと見て実装出来そうな良いのが無かったので書きます。


やりたいこと(背景)


  • Hadoopに入ってるアクセスログをHiveで抽出して、Google Cloud Storage(GCS)に上げる。

  • それをGoogle Cloud Platform(GCP)の解析基盤に流してよしなにする。

このフローにおける前者の部分をサクッとバッチ化しました。


PHPのクライアントライブラリを利用しています。


1. 取り敢えずHiveからファイル出力する

別にHiveの話したいわけじゃないので割愛します。


こんなかんじ。

sudo -u hdfs hive -e "$query" | grep -v WARN > $filename

1.7GBくらいのファイルを走査して350MBくらいのファイルを吐きます。


30秒位で終わる。優秀!(自画自賛)


2. 該当のファイルをUploadします。

アホなことしてないで本題に入ります。


事前準備

GCPへのプロジェクト追加やGCSへのバケット追加とかは割愛します。

詳細は公式のリファレンスをご参照下さい。


色々書いてあって、一通り読んでもよくわからないかもしれません。

今回はバッチとして自動的に動かすので、「サービスアカウントによる認証」を行います。


鍵ファイルを事前にダウンロードしておいてそれを用いて認証を行うものです。


鍵の取り扱いにはご注意を。

以下は8割位公式からのコピペですが大体このとおりです。


  • 左上のハンバーガーメニューから「APIとサービス」->「認証情報」


  • [認証情報を作成する] をクリックします。

  • [サービス アカウント キー] を選択します。

  • [サービス アカウント キーの作成] ウィンドウが開きます。

  • [サービス アカウント] の下にあるプルダウン ボックスをクリックし、[新しいサービス アカウント] をクリックします。

  • [名前] にサービス アカウントの名前を入力します。

  • デフォルトのサービス アカウント ID を使用するか、別の ID を作成します。

  • [役割] に適切な権限範囲を割り当てましょう。ここでは「ストレージ」-> 「ストレージのオブジェクト作成者」にしておけばUploadはできます。

  • [キーのタイプ] で JSON を選択します。

  • [作成] をクリックします。

  • [サービス アカウントの作成] ウィンドウが表示され、選択したキーのタイプの秘密鍵が自動的にダウンロードされます。

P12の鍵でも良いですが、私はJSONでやったのでそちらに寄せて書いてます。

さて、鍵はダウンロードできたのでそれを利用して通信を行うPHPコードを書きましょう。


その前に公式のクライアントライブラリに関するドキュメントに目を通しておくと良いと思います。(任意)

まずはcomposer使ってライブラリ落としておきます。

php composer.phar require google/cloud-storage

次に、先ほどDownloadしてきたJSONファイルを、バッチ実行したいサーバに置きます。


パスは任意ですが権限には気をつけましょう。

続いて、そのファイルを示す環境変数を定義します。


私の場合は ShellScript からPHPスクリプトを呼んでるのでそこでコマンド発行しています。

export GOOGLE_APPLICATION_CREDENTIALS=JSON_FILEPATH.json

あとは以下のようなコードでUploadできます。


ShellScriptでファイル自動生成して、Argumentとしてファイル名を渡してます。

<?php

# Includes the autoloader for libraries installed with composer
require __DIR__ . '/../vendor/autoload.php';

# Imports the Google Cloud client library
use Google\Cloud\Storage\StorageClient;

# Your Google Cloud Platform project ID
$projectId = 'YOUR_PROJECCT_ID';

# Instantiates a client
$storage = new StorageClient([
'projectId' => $projectId
]);
$bucket = $storage->bucket('YOUR_BUCKET_NAME');

$object = $bucket->upload(
fopen(__DIR__ . '/../' . $argv[1], 'r')
);


おわりに

あんまり需要ないかもですが、コレをとっかかりに別のAPI叩いたりも出来るはず。


GCPはドキュメント読むのがつらいので誰かのお役にでも立てれば幸いです。