[JAWS-UG CLI] S3:#4 静的Webホスティングのバケットポリシー設定


S3で公開している静的コンテンツについて、バケット単位でのポリシー設定を行ないます。

これにより、#3まででは新規ファイルをアップロードするたびに個別設定が必要だったACL指定が不要になります。

(実際にはバケットポリシーとACLは組み合わせて使うものですが。)


前提条件
========

* [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。

S3への権限
----------------------

S3に対してフルアクセス権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.1
* AWS CLI 1.7.39


```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.10.1 Python/2.7.5 Darwin/13.4.0 botocore/1.3.23
```



0. 準備
=======

0.1. リージョンの決定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile        s3Full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '\<not set\>'と表示されます。
それ以外のときにprofileが '\<not set\>'  と表示される場合は、以下を実行してください。

```bash:コマンド:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```

0.3. コンテンツの公開
---------------------

http://qiita.com/tcsh/items/70694da357c1738c6bf8 (ハイレベルS3コマンドで静的Webホスティング)の手順を実施しておいてください。




1. 事前作業
=============

# 1. コンテンツのアクセス確認

コンテンツファイルを増やしてみます。

```bash:コマンド(jawsug-cli-sample-webディレクトリで):
cp img.jpg img2.jpg
aws s3 sync . s3://${S3_BUCKET_NAME}/ \
  --exclude ".git*"
```

ブラウザで img2.jpg (下記で表示されるURL)を開いてみましょう。

```bash:コマンド:
echo "http://${S3_BUCKET_NAME}.s3-website-${AWS_DEFAULT_REGION}.amazonaws.com/img2.jpg"
```

"404 File Not Found"となって表示されないはずです。


# 2. コンテンツ用バケットのポリシー設定

## 2.1. 設定ファイルの作成

```bash:変数の設定:
FILE_S3_BUCKET_POLICY='s3-policy-readonly.json'
```

```bash:変数の確認:
cat << ETX

  FILE_S3_BUCKET_POLICY: ${FILE_S3_BUCKET_POLICY}
  S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
```

```bash:コマンド
cat << EOF > ${FILE_S3_BUCKET_POLICY}
{
  "Version":"2012-10-17",
  "Statement":[{
      "Sid":"AddPerm",
      "Effect":"Allow",
        "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::${S3_BUCKET_NAME}/*"]
    }
  ]
}
EOF

cat ${FILE_S3_BUCKET_POLICY}
```

```json:s3-policy-readonly.json:
{
  "Version":"2012-10-17",
  "Statement":[{
      "Sid":"AddPerm",
      "Effect":"Allow",
        "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::example-handson-201602011830/*"]
    }
  ]
}
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド:
jsonlint -q ${FILE_S3_BUCKET_POLICY}
```

```text:result:
(戻り値なし)
```

## 2.2. ポリシーの適用

```bash:変数の確認:
cat << ETX

  S3_BUCKET_NAME:        ${S3_BUCKET_NAME}
  FILE_S3_BUCKET_POLICY: ${FILE_S3_BUCKET_POLICY}

ETX
```

```bash:コマンド:
aws s3api put-bucket-policy \
  --bucket ${S3_BUCKET_NAME} \
  --policy file://${FILE_S3_BUCKET_POLICY}
```

```text:result:
(戻り値なし)
```


## 2.3. ポリシーの確認

```bash:コマンド:
aws s3api get-bucket-policy \
  --bucket ${S3_BUCKET_NAME}
```

```json:result:
{
    "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AddPerm\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::example-handson-201602011830/*\"}]}"
}
```


# 3. コンテンツのアクセス確認

ブラウザで先程の img2.jpg を開いてみましょう。

```bash:コマンド:
echo "http://${S3_BUCKET_NAME}.s3-website-${AWS_DEFAULT_REGION}.amazonaws.com/img2.jpg"
```

今度は表示されたはずです。

完了
======