[AWS] CloudFormationでAWSの複数サービスを簡単に立ち上げてみる

2016.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。三上です。

今年の冬は寒くなると聞いて、ビクビクな毎日です。。(寒いのやだなあ。。。

やりたいこと

  • AWS EC2とS3とRedshiftを簡単に立ち上げたい
  • 同じサービス構成を何回も簡単に作りたい
  • 誰が作業しても同じ環境ができるようにしたい
  • 自分が立ち上げた全部のサービスを忘れずに破棄できるようにしたい

shellスクリプトからAWS CLIでCloudFormationのスタックを作って、 CloudFormationにEC2+S3+Redshiftをつくってもらおう!

※作業者はshellスクリプトを実行するだけでOK!

準備するもの

1. AWS IAM(Identity and Access Management)ユーザー

IAMユーザー作成後、アクセスキーとシークレットキーを取得します。

 

参照:アクセスキー ID と秘密アクセスキーの取得

2. AWS CLI(Command Line Interface)

インストール後、取得した認証情報を設定します。

参照:AWS CLI のインストールと設定

 

今回は、認証情報にprofileオプションを指定します。

$ aws configure --profile mikami
AWS Access Key ID [********************]:
AWS Secret Access Key [********************]:
Default region name [ap-northeast-1]:
Default output format :

3. shell実行環境

Windowsの場合は、shellを実行できる環境にしておきます。

Unixコマンドツール Gowをインストールしました。

やってみよう

1. AWS CloudFormationのテンプレートを作成

CloudFormationにつくってもらいたいEC2、S3、Redshiftを、テンプレートに定義します。

ですがこのテンプレート、どこに何を書けばよいのかよく分からない。。

json(またはYAML)形式なのでサンプル見てみてもいまいちピンとこない。。

 

そこで、AWS CloudFormationデザイナーを使います。

テンプレートをグラフィカルに作成&カスタマイズ可能(分かりやすい!v

操作や編集箇所については、こちらを参照しました。

AWSのサンプルテンプレートページの「View in Designer」リンクから、サンプルテンプレートをカスタマイズできます。

今回は、こんな環境を作成します。

2.shellスクリプトを作成

AWS CLIでCloudFormationのスタックをcreateするshellスクリプトを書きます。

  • 設定ファイル

stack_info.cnf

PROFILE=mikami
STACK_NAME=cm-mikami-test
TEMPLATE_NAME=template.json
  • shellスクリプト

create.sh

#!/bin/bash
echo "Start Create Instances..."
source `dirname $0`/stack_info.cnf
aws --profile $PROFILE cloudformation create-stack \
--region ap-northeast-1 \
--stack-name $STACK_NAME \
--template-body file://$TEMPLATE_NAME \
--capabilities CAPABILITY_IAM
AWS_CF_RET=$?
if [[ $AWS_CF_RET -ne 0 ]]; then
    echo "[ERROR]CloudFormation create error." >&2
    exit 1
fi

aws --profile $PROFILE cloudformation wait stack-create-complete --stack-name $STACK_NAME
AWS_CF_RET=$?
if [[ $AWS_CF_RET -ne 0 ]]; then
    echo "[ERROR]CloudFormation wait error." >&2
    exit 1
fi
echo "Stack created."
REDSHIFT_ENDPOINT=`aws --profile $PROFILE cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey == "ClusterEndpoint") | .OutputValue'`
ELASTIC_IP=`aws --profile $PROFILE cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey == "EC2ElasticIp") | .OutputValue'`
echo -e "{\n  \"RedshiftEndPoint\": \"$REDSHIFT_ENDPOINT\",\n  \"Ec2ElasticIP\": \"$ELASTIC_IP\"\n}"
echo -e "{\n  \"RedshiftEndPoint\": \"$REDSHIFT_ENDPOINT\",\n  \"Ec2ElasticIP\": \"$ELASTIC_IP\"\n}" > access_info.txt
echo "fin."

3. shellスクリプトを実行

$ ./create.sh

待ちます(どきどき →shellの実行が終わったら、きちんとサービスができているか確認してみます。

  • EC2

・管理コンソール

・TeraTermで接続 →できてるv

  • S3

・管理コンソール →よしよしv

  • Redshift

・管理コンソール

・コマンドラインから接続してみる  alt= →ちゃんとつながったー!

お片付け

CloudFormationのスタックを削除するshellスクリプトを作っておけば、作成したサービスの破棄も簡単。

terminate.sh

#!/bin/bash

echo "Start Delete Instances..."

source `dirname $0`/stack_info.cnf

# delete stack
aws --profile $PROFILE cloudformation delete-stack --stack-name $STACK_NAME
AWS_CF_RET=$?
if [[ $AWS_CF_RET -ne 0 ]]; then
echo "[ERROR]CloudFormation delete error." >&2
exit 1
fi

echo "waiting.."

aws --profile $PROFILE cloudformation wait stack-delete-complete --stack-name $STACK_NAME
AWS_CF_RET=$?
if [[ $AWS_CF_RET -ne 0 ]]; then
echo "[ERROR]CloudFormation wait error."  >&2
exit 1
fi

echo "fin."

スクリプト実行で、全部きれいになくなります。

$ ./terminate.sh

まとめ(所感)

  • CloudFormationってすごい!

テンプレートファイルをバージョン管理しておけばサービス構成を管理できるし、いつでもすぐに同じ環境を構築可能!

CloudFormationをterminateすれば、作ったサービスも一緒に消してくれるので、後片付けもらくちんv

  • 夢がふくらむ

shellたたくだけでいいので、人の手を介さないでも実行できる。

jobスケジューラーから実行したり、Jenkinsさんにたたいてもらえば、何かいろいろ自動化できそうv