http://jawsug-cli.doorkeeper.jp/events/13797 でのハンズオン資料です。
CloudFormationの共通テンプレートを置くためのS3バケットを、CloudFormationで作成します。
前提条件
- S3へのフルアクセス権限
- 事前作業
=================
0.1. S3バケット名の決定
S3バケット名を決めておいてください。
コマンド
$ CF_BUCKET_NAME='cf-example'
バケット名はS3全体でユニークである必要があります。
0.2. 作業用ディレクトリの作成
作業用ディレクトリを作成します。
コマンド
$ WORK_DIR="${HOME}/tmp/aws_cf"
$ mkdir -p ${WORK_DIR}
$ cd ${WORK_DIR}
- S3バケット作成
=================
1.1. テンプレートの作成 (S3バケット作成)
CloudFormationテンプレートを作成します。
コマンド
$ FILE_CF_TEMPLATE="${CF_BUCKET_NAME}-bucket.json"
$ CF_RESOURCE_ID='S3Bucket'
$ CF_DESCRIBE='CloudFormation template bucket'
JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。
コマンド
$ 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ファイルを作成したら、フォーマットが壊れてないか必ず確認します。
コマンド
$ cat ${FILE_CF_TEMPLATE} | json_verify
結果
JSON is valid
1.2. S3バケットの作成
コマンド
$ CF_STACK_NAME="${CF_BUCKET_NAME}-bucket" && echo ${CF_STACK_NAME}
結果
cf-example01-bucket
コマンド
$ aws cloudformation create-stack --stack-name ${CF_STACK_NAME} --template-body file://${FILE_CF_TEMPLATE}
結果
{
"StackId": "arn:aws:cloudformation:us-west-1:XXXXXXXXXXXX:stack/s3-bucket-www-example-jp/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
1.3. スタックの状況確認
list-stacksコマンドで、スタックの状況を確認してみましょう。
コマンド
$ aws cloudformation list-stacks \
| jq -r --arg stackname ${CF_STACK_NAME} '.StackSummaries[] | select(.StackName == $stackname) | .StackStatus'
結果
CREATE_COMPLETE
StackStatusが'CREATE_COMPLETE'になっていれば作成は完了です。
それ以外が表示されている場合は、下記コマンドでFailedの文字が出ている前後を見て原因を調べます。
コマンド
$ aws cloudformation describe-stack-events --stack-name ${CF_STACK_NAME}
1.4. S3バケットの確認
コマンド
$ aws s3 ls | grep ${CF_BUCKET_NAME}
結果
2014-09-09 15:19:34 cf-example
1.5. スタックの内容確認
コマンド
$ aws cloudformation get-template --stack-name ${CF_STACK_NAME}
結果
{
"TemplateBody": {
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "cf bucket",
"Resources": {
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "cf-example"
}
}
}
}
}
1.6. バケットのURL取得(HTTPS)
コマンド
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}