[JAWS-UG CLI] CloudFormation:#2 S3バケットの作成

http://jawsug-cli.doorkeeper.jp/events/13797 でのハンズオン資料です。

CloudFormationの共通テンプレートを置くためのS3バケットを、CloudFormationで作成します。


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

* S3へのフルアクセス権限



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

0.1. S3バケット名の決定
-----------------------------


S3バケット名を決めておいてください。

```bash:コマンド:
   $ CF_BUCKET_NAME='cf-example'
```

バケット名はS3全体でユニークである必要があります。



0.2. 作業用ディレクトリの作成
-----------------------------

作業用ディレクトリを作成します。

```bash:コマンド:
   $ WORK_DIR="${HOME}/tmp/aws_cf"
   $ mkdir -p ${WORK_DIR}
   $ cd ${WORK_DIR}
```


1. S3バケット作成
=================


1.1. テンプレートの作成 (S3バケット作成)
----------------------------------------

CloudFormationテンプレートを作成します。

```bash:コマンド:
   $ FILE_CF_TEMPLATE="${CF_BUCKET_NAME}-bucket.json"
   $ CF_RESOURCE_ID='S3Bucket'
   $ CF_DESCRIBE='CloudFormation template bucket'
```

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

```bash:コマンド:
$ cat << EOF > ${FILE_CF_TEMPLATE}
{
     "AWSTemplateFormatVersion" : "2010-09-09",
     "Resources" : {
       "${CF_RESOURCE_ID}" : {
         "Type" : "AWS::S3::Bucket",
         "Properties" : {
            "BucketName" : "${CF_BUCKET_NAME}"
         }
       }
     },
     "Description": "${CF_DESCRIBE}"
}
EOF
```

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

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

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


1.2. S3バケットの作成
---------------------

```bash:コマンド:
   $ CF_STACK_NAME="${CF_BUCKET_NAME}-bucket" && echo ${CF_STACK_NAME}
```

```text:結果:
   cf-example01-bucket
```

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

```json:結果:
   {
       "StackId": "arn:aws:cloudformation:us-west-1:XXXXXXXXXXXX:stack/s3-bucket-www-example-jp/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
   }
```


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

list-stacksコマンドで、スタックの状況を確認してみましょう。

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

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

StackStatusが'CREATE_COMPLETE'になっていれば作成は完了です。

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

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


1.4. S3バケットの確認
---------------------

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

```text:結果:
   2014-09-09 15:19:34 cf-example
```


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

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

```json:結果:
   {
       "TemplateBody": {
           "AWSTemplateFormatVersion": "2010-09-09", 
           "Description": "cf bucket", 
           "Resources": {
               "S3Bucket": {
                   "Type": "AWS::S3::Bucket", 
                   "Properties": {
                       "BucketName": "cf-example"
                   }
               }
           }
       }
   }
```


1.6. バケットのURL取得(HTTPS)
-----------------------------

```bash:コマンド:
   CF_BUCKET_URL="s3-`aws s3api get-bucket-location --bucket=${CF_BUCKET_NAME} --query LocationConstraint --output text | sed 's/None/us-east-1/'`.amazonaws.com/${CF_BUCKET_NAME}" \
   && echo ${CF_BUCKET_URL}
```