PHP
AWS
GoogleCloudPlatform

Google Cloud Storage に AWS CLI や AWS SDK for PHP でアップロード

More than 3 years have passed since last update.

Google Cloud Storage が S3 互換の API を持っているらしいので、AWS CLI や AWS SDK for PHP で Google Cloud Storage にファイルをアップロードしてみました。


Google Cloud Platform にサインアップ

まずはなにはともあれ Google Cloud Platform サインアップします。

「今すぐ試す」をクリックします。

01-signup.png

住所とか氏名とかクレジットカード番号とかを入力してサインアップします。


「デベロッパーコンソール」という AWS でいうところのマネジメントコンソールが開くので、「プロジェクトの作成」から適当にプロジェクトを作成します。

02-console.png

プロジェクト名とプロジェクトIDを入力して 作成 をクリックします。

03-new-project.png

プロジェクトIDは自動で入力されていますが自分で好きな値に書き換えることもできます(ただし重複してはならない)。

なお、わたしは以前に App Engine を使っていたためか、Google Cloud Platform にサインアップした直後に App Engine で作っていたアプリがプロジェクトとして最初から登録されていました。


バケットを作成

次にバケットを作成します。


  • デベロッパーコンソールの左ペインで ストレージ -> Cloud Storage -> ストレージブラウザ を選択


  • Create a Bucket をクリック

04-new-bucket.png


  • バケット名とかを入力して 作成 をクリック

05-new-bucket.png


相互運用性

次に S3 互換の API を使うために Interoperability API を有効にします。


  1. デベロッパーコンソールでプロジェクトを開く

  2. 左ペインで ストレージ > Cloud Storage > ストレージアクセス を選択


  3. 相互運用性 タブを選択


  4. {プロジェクト名} を既定プロジェクトにする をクリック


  5. 相互運用アクセスを有効にする をクリック


  6. 新しいキーを作成 をクリック

06-interop.png

最後の手順でいわゆるアクセスキー/シークレットキーが作成されるので保存しておきます。

07-interop.png

なお、4. の {プロジェクト名} を既定プロジェクトにする は、複数のプロジェクトを作成していて、かつ、API でバケットを作ったりしない限りは多分関係ありません。


既定プロジェクトは、Interoperability API でのすべてのバケットの作成リクエストやバケットの表示リクエストに使用されます。


つまり、バケットの作成やバケットの表示のような、既存の特定のバケットを指定するのではない API の呼び出しでは、ここで設定した既定プロジェクトが選択されるということだと思います(AWS には「プロジェクト」なんて階層はなくて「アカウント→バケット」だから)。

バケットを指定する API では、バケットからプロジェクトは特定できるので既定プロジェクトの設定が使われることはありません(多分)。

(と、思ったんだけど、アクセスキーでプロジェクトは特定されるのではないの?)


AWS CLI

それでは AWS CLI で適当なファイルをアップロードしてみます。

まずはアクセスキー/シークレットキーを保存します。

$ vim ~/.aws/credentials

次のように追記します。

[google-cloud-storage]

aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

YOUR_ACCESS_KEYYOUR_SECRET_ACCESS_KEY には↑のほうで作成したアクセスキー/シークレットキーを設定します。

アップロードするファイルを作ります。

$ echo "this is test" > test.txt

エンドポイントに Google Cloud Storage の URL を、プロファイルに google-cloud-storage を指定してs3 cp コマンドでファイルをアップロードしてみます。

$ aws --endpoint-url https://storage.googleapis.com --profile google-cloud-storage \

s3 cp test.txt s3://YOUR_BUCKET_NAME/test.txt
upload: ./test.txt to s3://YOUR_BUCKET_NAME/test.txt

s3 ls コマンドでアップロードされているか確認してみます。

$ aws --endpoint-url https://storage.googleapis.com --profile google-cloud-storage \

s3 ls s3://YOUR_BUCKET_NAME/
> 2015-04-22 22:48:09 13 test.txt

デベロッパーコンソールのストレージブラウザを見てみます。

08-aws-cli.png

アップロードされています。


AWS SDK for PHP

次に AWS SDK for PHP でアップロードしてみます。

<?php

require __DIR__ . '/vendor/autoload.php';

use Aws\S3\S3Client;

$client = S3Client::factory([
'endpoint' => 'https://storage.googleapis.com',
'profile' => 'google-cloud-storage',
]);

$result = $client->putObject([
'Bucket' => 'YOUR_BUCKET_NAME',
'Key' => 'php.txt',
'Body' => 'this is aws sdk for php',
]);

実行します。

$ php google-cloud-storage.php

デベロッパーコンソールのストレージブラウザを見てみます。

09-aws-sdk.png

アップロードされています。


さいごに

Google Cloud Storage は S3 互換の API を持つので、Web アプリで両方への対応が簡単に実装出来そうです。