[JAWS-UG CLI] S3:#5 バケット作成 (CloudFormation)

http://jawsug-cli.doorkeeper.jp/events/14614 でのハンズオン資料 (その2)です。

CloudFormationを利用して、S3上に静的ウェブホスティング(独自ドメイン)用のバケットを構築、運用します。

今回は、何の設定も無い、ピュアなS3バケットを作成します。

ドメイン取得直後(もしくは新しいサブドメインの作成)のWeb公開準備作業として行なうことを想定しています。
(前作業として、Route53上にHosted Zoneを作成しています。 http://qiita.com/tcsh/items/dcd72bfd807626fad8f0)


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

* S3へのフルアクセス権限
* 独自ドメインを運用している。
  * 独自ドメイン取得手順: http://qiita.com/tcsh/items/597e7644949bfe4ab405
  * 独自ドメインを持っていない場合は、example.comやexample.jpのサブドメインを利用してみてください。(Route53への登録は可能なようです。継続的に利用できるかは未確認)


0. 事前作業
=============

0.1. ドメインの決定
--------------------

Webサイトホスティングを行なうドメインを決めます。

```bash:コマンド:
$ S3_BUCKET_NAME=www.example.com
```

0.2. 変数の定義
------------------

```bash:コマンド:
$ CF_STACK_NAME="s3-`echo ${S3_BUCKET_NAME}|sed 's/\./-/g'`"; echo ${CF_STACK_NAME}
$ FILE_CF_TEMPLATE="${CF_STACK_NAME}.template"
```

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

バケットを作成したいリージョンをAWS_DEFAULT_REGIONで指定します。
(aws cliのデフォルトリージョンが変更されます。)

```bash:コマンド(東京リージョンの例):
$ export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.4. リポジトリへの移動
----------------------


リポジトリが存在する場合、作業場所としてリポジトリディレクトリに移動します。

```bash:コマンド(例):
$ cd ~/_work/aws/project-01
```

```bash:コマンド:
$ touch ${FILE_CF_TEMPLATE}
$ hg add ${FILE_CF_TEMPLATE}
```

1. テンプレート作成
===================

CloudFormationテンプレートを作成します。 ここではS3バケット(設定なし)を2つ作成します。

* コンテンツバケット (公開するホスト名と同じ必要があります。)
* ログバケット (ここでは、{コンテンツバケット}-logという名前にします。)

```bash:コマンド:
$ cat << EOF > ${FILE_CF_TEMPLATE}
{
   "AWSTemplateFormatVersion": "2010-09-09",

   "Description": "website bucket (${S3_BUCKET_NAME})",

   "Resources": {
     "LogBucket": {
       "Type": "AWS::S3::Bucket",
       "Properties": {
         "BucketName": "${S3_BUCKET_NAME}-log"
       }
     },
     "WebBucket": {
       "Type": "AWS::S3::Bucket",
       "Properties": {
         "BucketName": "${S3_BUCKET_NAME}"
       }
     }
   }
}
EOF
```

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


```bash:コマンド:
$ cat ${FILE_CF_TEMPLATE} | json_verify
```

```text:結果:
JSON is valid
```

invalidとエラーが表示された場合は、jsonlintでどこが壊れているか調べます。


```bash:コマンド:
$ cat ${FILE_CF_TEMPLATE} | jsonlint
```

validate-templateサブコマンドで、簡単な検証ができます。

```bash:コマンド:
$ aws cloudformation validate-template --template-body file://${FILE_CF_TEMPLATE}
```



2. バケット作成
===============

S3上で、バケットを作成します。

2.1. スタック(S3バケット)作成
------------------------------

```bash:コマンド:
$ aws cloudformation create-stack --stack-name ${CF_STACK_NAME} --template-body file://${FILE_CF_TEMPLATE}
```

```json:結果:
{
  "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/route53-example-com-hostedzone/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

2.2. スタックの状況確認
-----------------------


```bash:コマンド:
$  aws cloudformation list-stacks \
   | jq -r --arg stackname ${CF_STACK_NAME} '.StackSummaries[] | select(.StackName == $stackname) | .StackStatus'
```

```text:結果:
CREATE_COMPLETE
```

StackStatusが’CREATE_COMPLETE’になっていれば作成は完了です。 (30秒から1分程度かかるようです。)

それ以外が表示されている場合は、下記コマンドでFailedの文字が出ている前後を見て原因を調べます。


```bash:コマンド:
$ aws cloudformation describe-stack-events --stack-name ${CF_STACK_NAME}
```

2.3. スタックの内容確認
------------------------

作成されたスタックの内容を確認します。


```bash:コマンド:
$ aws cloudformation get-template --stack-name ${CF_STACK_NAME}
```

```json:結果:
{
    "TemplateBody": {
        "AWSTemplateFormatVersion": "2010-09-09", 
        "Description": "website bucket (www.example.com)", 
        "Resources": {
            "WebBucket": {
                "Type": "AWS::S3::Bucket", 
                "Properties": {
                    "BucketName": "www.example.com"
                }
            }, 
            "LogBucket": {
                "Type": "AWS::S3::Bucket", 
                "Properties": {
                    "BucketName": "www.example.com-log"
                }
            }
        }
    }
}
```

3. バケット確認
================

コンテンツバケットとログバケットが作成されていることを確認します。

```bash:コマンド:
$ aws s3 ls | grep ${S3_BUCKET_NAME}
```

```text:コマンド:
  2014-11-10 13:05:20 www.example.com
  2014-11-10 13:05:16 www.example.com-log
```


4. コミット
============

問題無くバケッドの作成が完了していれば、ここで一旦テンプレートをコミットしておきましょう。


```bash:コマンド:
$ hg commit -m "created website bucket (${S3_BUCKET_NAME})."
```


完了
======

Webサイトホスティングに必要なバケットを作成したので、引き続きWeb公開に必要な設定をしていきます。 (http://qiita.com/tcsh/items/3e72c7bd32d4872b972a)