[JAWS-UG CLI] AutoScaling #7 AutoScaling launch configurationの作成 (CodeDeploy)

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


AutoScalingへの権限
-------------------

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


AWS CLIのバージョン
-------------------

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

- AWS CLI 1.11.14

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

結果(例):

      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71

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

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


デフォルトVPCの存在
-------------------

デフォルトVPCが存在すること。


SSHを許可するセキュリティグループの存在
---------------------------------------

存在しない場合は、作成します:

http://qiita.com/tcsh/items/77f8c9887634fd67f4d8


キーペアの存在
--------------

存在しない場合は、作成します:

http://qiita.com/tcsh/items/59303d9506ca7d13f744


0. 準備
=======


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

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


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         iamFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```

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


1.1. 起動設定名の決定
---------------------

```bash:変数の設定:
AS_LAUNCH_CONFIG_NAME="handson-$(date +%Y%m%d)" \
        && echo ${AS_LAUNCH_CONFIG_NAME}
```

同名の起動設定が存在しないことを確認します。

```bash:コマンド:
aws autoscaling describe-launch-configurations \
        --launch-configuration-names ${AS_LAUNCH_CONFIG_NAME} 
```

結果(例):

      {
        "LaunchConfigurations": []
      }


1.2. セキュリティグループの指定
-------------------------------

セキュリティグループの一覧を確認します。

```bash:コマンド:
aws ec2 describe-security-groups \
  --query 'SecurityGroups[].GroupName'
```

- 'ec2-http-https-global-inbound'が存在しない場合は、  http://qiita.com/tcsh/items/1d6a499b03b776355ee2 を実施してください。

- 'ec2-ssh-global-inbound'が存在しない場合は、 http://qiita.com/tcsh/items/77f8c9887634fd67f4d8 を実施してください。


### HTTP/HTTPS

利用するセキュリティグループ名を指定します。

```bash:変数の設定:
VPC_SG_NAME='ec2-http-https-global-inbound'
```

セキュリティグループのIDを取得します。

```bash:コマンド:
VPC_SG_ID=$( \
  aws ec2 describe-security-groups \
    --filter Name=group-name,Values=${VPC_SG_NAME} \
    --query 'SecurityGroups[].GroupId' \
    --output text \
) \
  && echo ${VPC_SG_ID}
```

```text:結果(例):
sg-xxxxxxxx
```

セキュリティグループを配列に入れておきます。

```bash:変数の設定:
ARRAY_VPC_SG_ID="${VPC_SG_ID} ${ARRAY_VPC_SG_ID}" \
  && echo ${ARRAY_VPC_SG_ID}
```


### SSH

利用するセキュリティグループ名を指定します。

```bash:変数の設定:
VPC_SG_NAME='ec2-ssh-global-inbound'
```

セキュリティグループのIDを取得します。

```bash:コマンド:
VPC_SG_ID=$( \
  aws ec2 describe-security-groups \
    --filter Name=group-name,Values=${VPC_SG_NAME} \
    --query 'SecurityGroups[].GroupId' \
    --output text \
) \
  && echo ${VPC_SG_ID}
```

```text:結果(例):
sg-xxxxxxxx
```

セキュリティグループを配列に入れておきます。

```bash:変数の設定:
ARRAY_VPC_SG_ID="${VPC_SG_ID} ${ARRAY_VPC_SG_ID}" \
  && echo ${ARRAY_VPC_SG_ID}
```



1.3. キーペアの指定
-------------------

まず、キーペアの一覧を確認します。

```bash:コマンド:
aws ec2 describe-key-pairs \
        --query 'KeyPairs[].KeyName'
```

結果(例):

      {
        "KeyPairs": [
          {
              "KeyName": "prjz-ap-northeast-1-ec2",
              "KeyFingerprint": "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
          }
        ]
      }

利用するキーペア名を指定します。

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

利用するキーペアの秘密鍵ファイルを指定します。

```bash:変数の設定:
FILE_SSH_KEY="${HOME}/.ssh/<キーペア秘密鍵のファイル名>" \
  && echo ${FILE_SSH_KEY}
```

秘密鍵が存在することを確認しましょう。

```bash:コマンド:
ls ${FILE_SSH_KEY}
```


1.4. インスタンスタイプの決定
-----------------------------

```bash:変数の設定:
EC2_INSTANCE_TYPE='t2.micro'
```


1.5. イメージIDの決定
---------------------

AMIを選択します。

```bash:変数の設定:
AMZLINUX_VERSION='2016.03.3'
EC2_IMAGE_NAME="amzn-ami-hvm-${AMZLINUX_VERSION}.x86_64-gp2"
```

```bash:コマンド:
EC2_IMAGE_ID=$( \
        aws ec2 describe-images \
          --filters Name=name,Values="${EC2_IMAGE_NAME}" \
          --query 'Images[].ImageId' --output text \
) \
        && echo ${EC2_IMAGE_ID}
```

結果(例):

      ami-XXXXXXXX


1.6. インスタンスプロファイルの指定
-----------------------------------

```bash:コマンド:
aws iam list-instance-profiles \
        --query 'InstanceProfiles[].InstanceProfileName'
```

結果(例):

      [
        "CodeDeployEC2InstanceProfile"
      ]

```bash:変数の設定:
IAM_INSTANCE_PROFILE_NAME='CodeDeployEC2InstanceProfile'
```

```bash:コマンド:
aws iam get-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      {
        "InstanceProfiles": [
          {
              "InstanceProfileId": "AIPAJRUJIZXNNQU4R6VZM",
              "Roles": [
                  {
                      "AssumeRolePolicyDocument": {
                          "Version": "2012-10-17",
                          "Statement": [
                              {
                                  "Action": "sts:AssumeRole",
                                  "Principal": {
                                      "Service": "ec2.amazonaws.com"
                                  },
                                  "Effect": "Allow",
                                  "Sid": ""
                              }
                          ]
                      },
                      "RoleId": "AROAXXXXXXXXXXXXXXXXX",
                      "CreateDate": "2016-11-21T01:23:45Z",
                      "RoleName": "CodeDeployEC2InstanceProfileRole",
                      "Path": "/",
                      "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployEC2InstanceProfileRole"
                  }
              ],
              "CreateDate": "2016-11-21T01:23:45Z",
              "InstanceProfileName": "CodeDeployEC2InstanceProfile",
              "Path": "/",
              "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/CodeDeployEC2InstanceProfile"
          }
        ]
      }


1.7. user dataスクリプトの作成
------------------------------

```bash:変数の設定:
FILE_EC2_USERDATA='userdata.bash'
```

```bash:コマンド:
cat << EOF > ${FILE_EC2_USERDATA}
#!/bin/bash
yum -y update
yum install -y ruby
yum install -y wget
cd /home/ec2-user
wget https://aws-codedeploy-${AWS_DEFAULT_REGION}.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
EOF

cat ${FILE_EC2_USERDATA}
```


2. 起動設定の作成
=================


2.1. 起動設定の作成
-------------------

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

        AS_LAUNCH_CONFIG_NAME:     ${AS_LAUNCH_CONFIG_NAME}
        EC2_IMAGE_ID:              ${EC2_IMAGE_ID}
        ARRAY_VPC_SG_ID:           ${ARRAY_VPC_SG_ID}
        EC2_INSTANCE_TYPE:         ${EC2_INSTANCE_TYPE}
        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}
        FILE_EC2_USERDATA:         ${FILE_EC2_USERDATA}
        EC2_KEY_PAIR_NAME:         ${EC2_KEY_PAIR_NAME}

ETX
```

```bash:コマンド:
aws autoscaling create-launch-configuration \
        --launch-configuration-name ${AS_LAUNCH_CONFIG_NAME} \
        --image-id ${EC2_IMAGE_ID} \
        --security-groups ${ARRAY_VPC_SG_ID} \
        --instance-type ${EC2_INSTANCE_TYPE} \
        --iam-instance-profile ${IAM_INSTANCE_PROFILE_NAME} \
        --user-data file://${FILE_EC2_USERDATA} \
        --key-name ${EC2_KEY_PAIR_NAME}
```

結果:

      (戻り値なし)


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


起動設定の確認
--------------

```bash:コマンド:
aws autoscaling describe-launch-configurations \
        --launch-configuration-names ${AS_LAUNCH_CONFIG_NAME} 
```

結果(例):

      {
        "LaunchConfigurations": [
          {
              "UserData": "IyEvYmluL2Jhc2gKeXVtIC15IHVwZGF0ZQp5dW0gaW5zdGFsbCAteSBydWJ5Cnl1bSBpbnN0YWxsIC15IHdnZXQKY2QgL2hvbWUvZWMyLXVzZXIKd2dldCBodHRwczovL2F3cy1jb2RlZGVwbG95LXVzLXdlc3QtMi5zMy5hbWF6b25hd3MuY29tL2xhdGVzdC9pbnN0YWxsCmNobW9kICt4IC4vaW5zdGFsbAouL2luc3RhbGwgYXV0bwo=",
              "IamInstanceProfile": "CodeDeployEC2InstanceProfile",
              "EbsOptimized": false,
              "LaunchConfigurationARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:launchConfiguration:8d1a40ce-bec5-480c-8ab1-158f9f4a7438:launchConfigurationName/handson-20161121",
              "InstanceMonitoring": {
                  "Enabled": true
              },
              "ClassicLinkVPCSecurityGroups": [],
              "CreatedTime": "2016-11-21T01:23:45.678Z",
              "BlockDeviceMappings": [],
              "KeyName": "prjz-ap-northeast-1-ec2",
              "SecurityGroups": [
                  "sg-68b42e11"
              ],
              "LaunchConfigurationName": "handson-20161121",
              "KernelId": "",
              "RamdiskId": "",
              "ImageId": "ami-xxxxxxxx",
              "InstanceType": "t2.micro"
          }
        ]
      }


完了
====