[JAWS-UG CLI] CloudFormation:#5 スタックの作成


この手順の目的
====================

CloudFormationスタック"BasicWebServerInVPC"を作成します。


作業対象
===============

- CloudFormationサービス


標準時間
========

8分


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


作業権限
------------------

### CloudFormationへの権限

CloudFormationに対してフル権限があること。


作業環境
--------------------

### AWS CLIのバージョン

以下のバージョンで動作確認済

- AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.97 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.60

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


開始条件
========


作業に必要なモノ・情報
---------------------------------

作業開始には、以下が全て揃っていることが必要です。

- 設定ファイル用ディレクトリ

  - 今回は"${HOME}/tmp/conf-cloudformation"を設定ファイルディレクトリとします。

```bash:
ls ${HOME}/tmp/conf-cloudformation
```

  - 存在しない場合は作成します。

```bash:
mkdir -p ${HOME}/tmp/conf-cloudformation
```

- CloudFormationスタック名

  - 作成するCloudFormationスタックの名称です。

  - 今回は"BasicWebServerInVPC"とします。

- テンレートファイル

  - 検査の対象となるCloudFormationテンプレートファイルです。

  - 今回は"BasicWebServerInVPC.template"とします。

- テンプレートのパラメータ

  - テンプレートに必要なパラメータです。

  - パラメータに含まれているリソースは存在するものとします。

```bash:変数の設定
EC2_KEYPAIR_NAME='<キーペア名>'
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        DIR_CONF:            (0.3) ${DIR_CONF}
        CF_STACK_NAME:       (0.4) ${CF_STACK_NAME}
        FILE_INPUT:          (0.5) ${FILE_INPUT}
        CF_STACK_PARAMETERS: (0.6) ${CF_STACK_PARAMETERS}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      DIR_CONF:            (0.3) ${HOME}/tmp/conf-cloudformation
      CF_STACK_NAME:       (0.4) BasicWebServerInVPC
      FILE_INPUT:          (0.5) ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template
      CF_STACK_PARAMETERS: (0.6) ParameterKey=KeyName,ParameterValue=${EC2_KEYPAIR_NAME}

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      <CloudFormationのフル権限が許可されているプロファイル>

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='<CloudFormationのフル権限が許可されているプロファイル>'
```


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

```bash:変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.3. 設定ファイルディレクトリの指定
-----------------------------------

```bash:変数の設定:
DIR_CONF="${HOME}/tmp/conf-cloudformation"
```


0.4. スタック名の指定
---------------------

```bash:変数の設定:
CF_STACK_NAME='BasicWebServerInVPC'
```


0.5. テンプレートファイル名の指定
---------------------------------

```bash:変数の設定:
FILE_INPUT="${DIR_CONF}/${CF_STACK_NAME}.template" \
        && echo ${FILE_INPUT}
```


0.6. パラメータの指定
---------------------

```bash:変数の設定:
CF_STACK_PARAMETERS="ParameterKey=KeyName,ParameterValue=${EC2_KEYPAIR_NAME}" \
        && echo ${CF_STACK_PARAMETERS}
```


再確認
------

設定された変数の内容を再確認します。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        DIR_CONF:            (0.3) ${DIR_CONF}
        CF_STACK_NAME:       (0.4) ${CF_STACK_NAME}
        FILE_INPUT:          (0.5) ${FILE_INPUT}
        CF_STACK_PARAMETERS: (0.6) ${CF_STACK_PARAMETERS}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      DIR_CONF:            (0.3) ${HOME}/tmp/conf-cloudformation
      CF_STACK_NAME:       (0.4) BasicWebServerInVPC
      FILE_INPUT:          (0.5) ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template
      CF_STACK_PARAMETERS: (0.6) ParameterKey=KeyName,ParameterValue=${EC2_KEYPAIR_NAME}


1. 事前作業
===========


1.1. 作業対象の状態確認
-----------------------

設定ファイル用ディレクトリが存在することを確認します。

```bash:コマンド:
ls -d ${DIR_CONF}
```

結果(例):

      <ディレクトリのフルパス名>

テンプレートファイルが設定ファイル用ディレクトリに存在することを確認します。

```bash:コマンド:
ls -1 ${FILE_INPUT}
```

結果:

      ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template

作成しようとしているCloudFormationスタック"BasicWebServerInVPC"はまだ存在しないことを確認します。

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

結果(例):

      An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id BasicWebServerInVPC does not exist


2. 本作業
=========


2.1. スタックの作成
-------------------

```bash:変数の確認:
cat << ETX

        CF_STACK_NAME:       ${CF_STACK_NAME}
        CF_STACK_PARAMETERS: ${CF_STACK_PARAMETERS}
        FILE_INPUT:          ${FILE_INPUT}

ETX
```

```bash:コマンド:
aws cloudformation create-stack \
        --stack-name "${CF_STACK_NAME}" \
        --template-body file://${FILE_INPUT} \
        --parameters ${CF_STACK_PARAMETERS}
```

結果(例):

      {
        "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/BasicWebServerInVPC/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }


2.2. ステータスの確認
---------------------

```bash:コマンド:
CF_STACK_STATUS=$( \
        aws cloudformation describe-stacks \
          --stack-name ${CF_STACK_NAME} \
          --query "Stacks[?StackName == \`${CF_STACK_NAME}\`].StackStatus" \
          --output text \
) \
        && echo ${CF_STACK_STATUS}
```

結果(例):

      CREATE_IN_PROGRESS


2.3. イベントの確認
-------------------

ステータスがROLLBUCKになった場合は、イベントを確認して原因を特定します
。

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

結果(例):

      (省略)


3. 事後作業
===========


3.1. 完了条件の確認
-------------------

作成したCloudFormationスタック"BasicWebServerInVPC"が存在することを確認します。

```bash:コマンド:
CF_STACK_STATUS=$( \
        aws cloudformation describe-stacks \
          --stack-name ${CF_STACK_NAME} \
          --query "Stacks[?StackName == \`${CF_STACK_NAME}\`].StackStatus" \
          --output text \
) \
        && echo ${CF_STACK_STATUS}
```

結果(例):

      CREATE_COMPLETE


完了
====