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

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

## Google Cloud Platform にサインアップ

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

- [Google Cloud Platform](https://cloud.google.com/)

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

![01-signup.png](https://qiita-image-store.s3.amazonaws.com/0/8734/cb615940-6c03-90ef-8ba3-d8ea35d1458d.png)

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

----

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

![02-console.png](https://qiita-image-store.s3.amazonaws.com/0/8734/bcaa3dde-b253-f63e-75f3-12beff98fad5.png)

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

![03-new-project.png](https://qiita-image-store.s3.amazonaws.com/0/8734/f5543218-9eab-d006-599f-dd79034ef5a2.png)

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

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

## バケットを作成

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

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

![04-new-bucket.png](https://qiita-image-store.s3.amazonaws.com/0/8734/b457109b-1f5e-e579-f692-78a4839eca08.png)

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

![05-new-bucket.png](https://qiita-image-store.s3.amazonaws.com/0/8734/dc6cdca7-7c0d-e28a-9924-f253af3acde3.png)

## 相互運用性

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

1. デベロッパーコンソールでプロジェクトを開く
2. 左ペインで **ストレージ > Cloud Storage > ストレージアクセス** を選択
3. **相互運用性** タブを選択
4. **{プロジェクト名} を既定プロジェクトにする** をクリック
5. **相互運用アクセスを有効にする** をクリック
6. **新しいキーを作成** をクリック

![06-interop.png](https://qiita-image-store.s3.amazonaws.com/0/8734/c68004db-1e13-634f-4241-512964da4ec4.png)

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

![07-interop.png](https://qiita-image-store.s3.amazonaws.com/0/8734/70e12985-3ae0-cc9f-6cc8-401bf22f2a1d.png)

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

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

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

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

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

## AWS CLI

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

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

```console
$ vim ~/.aws/credentials
```

次のように追記します。

```ini
[google-cloud-storage]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
```

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

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

```console
$ echo "this is test" > test.txt
```

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

```console
$ 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` コマンドでアップロードされているか確認してみます。

```console
$ 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](https://qiita-image-store.s3.amazonaws.com/0/8734/bf34b954-c827-66b5-9c0a-74776bc49d36.png)

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

## AWS SDK for PHP

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

```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',
]);
```

実行します。

```console
$ php google-cloud-storage.php
```

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

![09-aws-sdk.png](https://qiita-image-store.s3.amazonaws.com/0/8734/e40bcb72-b7f0-38ff-4602-1fc76165af5a.png)

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

# さいごに

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