GAEでGCSのファイルを扱う


[Google Cloud Platform] (https://cloud.google.com/?hl=ja) の中でファイルを扱う位置にいるのが [Google Cloud Storage (以下GCS)](https://developers.google.com/storage/index) です。

この記事では、同じく [Google Cloud Platform] (https://cloud.google.com/?hl=ja) に属する [Google Appengine (以下GAE)] ("https://developers.google.com/appengine/") からGCSのファイルを扱うための設定について書きます。

# Cloud Console Projectの作成
GAEのProjectを作成すると、Cloud Console Projectも自動で生成されます。
GAEのProjectを作った後に [Cloud Console](https://cloud.google.com/console#/project) にアクセスすれば、GAE AppIdと同じ名前のProjectが作られているはずです。

# Billing設定
GCSを利用するためにBilling設定が必要です。
Cloud Console ProjectのMenuからBillingを選択し、クレジットカードを設定を行います。

# GCS APIのStatusをONにする
GCSを使うためには、Cloud Console ProjectのGCS API StatusをONにします。
Project Menuの中から以下の階層に入って、Google Cloud Storageを探して、ONにします。

APIs & auth → APIs

MenuにCloud Storageが増えれば、OKです。

# Bucketの作成
BucketとはGCSでTopに位置するDirectoryのような存在です。
Bucketの作成は、Cloud Consoleの
Bucketの名前は世界でUniqueである必要があり、他の人が取得しているBucket名は取得することができません。
そのため、develop,stagingなどの複数環境を作ろうと思っている場合は、xxx-devのような形で名前を付ければ、分かりやすいです。

# ACLの設定
GCSは [アクセス制御](https://developers.google.com/storage/docs/accesscontrol) を行うことが出来ます。
DefaultではGAEからの操作が許可されていないので、追加する必要があります。
色々と細かく設定することも出来ますが、自分のGAEには全権限を与えることとします。

## gsutil install
ACLを設定するためには、専用のCommand Line Toolが必要になります。
それが [gsutil](https://developers.google.com/storage/docs/gsutil_install) です。
installはDownloadして、Pathを通すだけです。

## ACLの設定を追加する
### ACLの取得
gsutilを利用して、ACLの取得を行います。

```Bash
gsutil acl get {{your bucket name}} > acl.xml
```

{{your bucket name}}のところには、自分のBucket名を指定してください。
例えばBucket名=sampleの場合は以下です。

```Bash
gsutil acl get sample > acl.xml
```

これで以下のようなファイルが取得できます。
{{ID}}の部分はながーい数字が入っているはずです。

```XML:acl.xml
<?xml version="1.0" ?>
<AccessControlList>
    <Owner>
        <ID>
            {{ID}}
        </ID>
    </Owner>
    <Entries>
        <Entry>
            <Scope type="GroupById">
                <ID>
                    {{ID}}
                </ID>
            </Scope>
            <Permission>
                FULL_CONTROL
            </Permission>
        </Entry>
        <Entry>
            <Scope type="GroupById">
                <ID>
                    {{ID}}
                </ID>
            </Scope>
            <Permission>
                FULL_CONTROL
            </Permission>
        </Entry>
        <Entry>
            <Scope type="GroupById">
                <ID>
                    {{ID}}
                </ID>
            </Scope>
            <Permission>
                READ
            </Permission>
        </Entry>
    </Entries>
</AccessControlList>
```
### GAEのACLを追加
このファイルに以下のようなGAEの設定を足します。

```XML
<Entry>
    <Scope type="UserByEmail">
        <EmailAddress>
            {{your appengine server account name}}
        </EmailAddress>
    </Scope>
    <Permission>
        FULL_CONTROL
    </Permission>
</Entry>
```

{{your appengine server account name}}に指定する値は、GAE Consoleから見ることができます。

Application Settings → Service Account Nameにあります。
example@appspot.gserviceaccount.com のような値です。

追加した結果、以下のようになります。

```XML:acl.xml
<?xml version="1.0" ?>
<AccessControlList>
    <Owner>
        <ID>
            {{ID}}
        </ID>
    </Owner>
    <Entries>
        <Entry>
            <Scope type="GroupById">
                <ID>
                    {{ID}}
                </ID>
            </Scope>
            <Permission>
                FULL_CONTROL
            </Permission>
        </Entry>
        <Entry>
            <Scope type="GroupById">
                <ID>
                    {{ID}}
                </ID>
            </Scope>
            <Permission>
                FULL_CONTROL
            </Permission>
        </Entry>
        <Entry>
            <Scope type="GroupById">
                <ID>
                    {{ID}}
                </ID>
            </Scope>
            <Permission>
                READ
            </Permission>
        </Entry>
        <Entry>
            <Scope type="UserByEmail">
                <EmailAddress>
                    {{your appengine server account name}}
                </EmailAddress>
            </Scope>
            <Permission>
                FULL_CONTROL
            </Permission>
        </Entry>
    </Entries>
</AccessControlList>
```

### ACL設定をUpload
gsutilを使ってGAEの設定を追加したACLを適用します。

```Bash
gsutil acl set acl.xml {{your bucket name}}
```

これでGAEからGCSを扱うための設定は終了です。

#GAEからGCSのファイルを扱う記事
* [GAE/jでファイルを扱う Part1](http://qiita.com/sinmetal/items/6ed7ec012af030f3e8fa)
* [GAE/jでファイルを扱う Part2](http://qiita.com/sinmetal/items/7d2617001494cd204255)