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.1. ドメインの決定
Webサイトホスティングを行なうドメインを決めます。
$ S3_BUCKET_NAME=www.example.com
0.2. 変数の定義
$ 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のデフォルトリージョンが変更されます。)
$ export AWS_DEFAULT_REGION='ap-northeast-1'
0.4. リポジトリへの移動
リポジトリが存在する場合、作業場所としてリポジトリディレクトリに移動します。
$ cd ~/_work/aws/project-01
$ touch ${FILE_CF_TEMPLATE}
$ hg add ${FILE_CF_TEMPLATE}
- テンプレート作成
===================
CloudFormationテンプレートを作成します。 ここではS3バケット(設定なし)を2つ作成します。
- コンテンツバケット (公開するホスト名と同じ必要があります。)
- ログバケット (ここでは、{コンテンツバケット}-logという名前にします。)
$ 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ファイルを作成したら、フォーマットが壊れてないか必ず確認します。
$ cat ${FILE_CF_TEMPLATE} | json_verify
JSON is valid
invalidとエラーが表示された場合は、jsonlintでどこが壊れているか調べます。
$ cat ${FILE_CF_TEMPLATE} | jsonlint
validate-templateサブコマンドで、簡単な検証ができます。
$ aws cloudformation validate-template --template-body file://${FILE_CF_TEMPLATE}
- バケット作成
===============
S3上で、バケットを作成します。
2.1. スタック(S3バケット)作成
$ aws cloudformation create-stack --stack-name ${CF_STACK_NAME} --template-body file://${FILE_CF_TEMPLATE}
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/route53-example-com-hostedzone/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
2.2. スタックの状況確認
$ aws cloudformation list-stacks \
| jq -r --arg stackname ${CF_STACK_NAME} '.StackSummaries[] | select(.StackName == $stackname) | .StackStatus'
CREATE_COMPLETE
StackStatusが’CREATE_COMPLETE’になっていれば作成は完了です。 (30秒から1分程度かかるようです。)
それ以外が表示されている場合は、下記コマンドでFailedの文字が出ている前後を見て原因を調べます。
$ aws cloudformation describe-stack-events --stack-name ${CF_STACK_NAME}
2.3. スタックの内容確認
作成されたスタックの内容を確認します。
$ aws cloudformation get-template --stack-name ${CF_STACK_NAME}
{
"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"
}
}
}
}
}
- バケット確認
================
コンテンツバケットとログバケットが作成されていることを確認します。
$ aws s3 ls | grep ${S3_BUCKET_NAME}
2014-11-10 13:05:20 www.example.com
2014-11-10 13:05:16 www.example.com-log
- コミット
============
問題無くバケッドの作成が完了していれば、ここで一旦テンプレートをコミットしておきましょう。
$ hg commit -m "created website bucket (${S3_BUCKET_NAME})."
完了
Webサイトホスティングに必要なバケットを作成したので、引き続きWeb公開に必要な設定をしていきます。 (http://qiita.com/tcsh/items/3e72c7bd32d4872b972a)