[JAWS-UG CLI] EC2 # インスタンスの作成 (Public)

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


EC2への権限
-----------

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


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

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

* AWS CLI 1.11.14

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

結果(例):

      aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

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

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


AWSアカウントの属性
-------------------

AWSアカウントがEC2-Classicに対応していないこと。

```bash:コマンド:
AWS_SUPPORT_PLATFORMS=$( \
         aws ec2 describe-account-attributes \
           --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' \
           --output text \
) \
        && echo ${AWS_SUPPORT_PLATFORMS}
```

結果:

      VPC

注釈: 'VPC'の他に'EC2'が表示される場合、別のアカウントを作成もしくは
  利用し てください。


0. 準備
=======


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

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


0.2. プロファイルの確認
-----------------------

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

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2full-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


0.3. VPCの指定
--------------

既存のVPCに割り当てられているCIDRブロックを確認します。

```bash:コマンド:
aws ec2 describe-vpcs \
        --query 'Vpcs[].CidrBlock'
```

結果(例):

      [
        "172.31.0.0/16",
        "10.192.0.0/16"
      ]

ここでは、10.192.0.0/16を範囲とするVPCを選択します。

```bash:変数の設定:
VPC_CIDR='10.192.0.0/16'
```

VPC IDを取得します。

```bash:コマンド:
VPC_ID=$( \
        aws ec2 describe-vpcs \
          --filters Name=cidr,Values=${VPC_CIDR} \
          --query 'Vpcs[].VpcId' \
          --output text \
) \
        && echo ${VPC_ID}
```

結果(例):

      vpc-xxxxxxxx


0.4. サブネットの指定
---------------------

```bash:変数の設定:
VPC_SUBNET_CIDR='10.192.0.0/24'
```

```bash:コマンド:
VPC_SUBNET_ID=$( \
        aws ec2 describe-subnets \
          --filters Name=cidrBlock,Values=${VPC_SUBNET_CIDR} \
          --query 'Subnets[].SubnetId' \
          --output text \
) \
        && echo ${VPC_SUBNET_ID}
```

結果(例):

      subnet-xxxxxxxx


0.5. UserDataの指定
-------------------

```bash:変数の設定:
FILE_INPUT='config-ec2-handson-20170213/userdata.bash' \
        && cat ${FILE_INPUT}
```


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

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

```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": "2017-02-13T01:23:45Z",
                      "RoleName": "EC2InstanceProfile_EnvAMI_Role",
                      "Path": "/",
                      "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/EC2InstanceProfile_EnvAMI_Role"
                  }
              ],
              "CreateDate": "2017-02-13T01:23:45Z",
              "InstanceProfileName": "EC2InstanceProfile_EnvAMI",
              "Path": "/",
              "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/EC2InstanceProfile_EnvAMI"
          }
        ]
      }


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


1.1. プライベートアドレスの決定
-------------------------------

選択したサブネットのアドレス範囲内で、起動するインスタンスのプライベー
トIPアドレスを指定します。

```bash:変数の設定:
EC2_PRIVATE_ADDR='10.192.0.22'
```


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

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

```bash:コマンド:
aws ec2 describe-security-groups \
        --query "SecurityGroups[?VpcId == \` ${VPC_ID}\`].GroupName"
```

結果(例):

      [
        "default",
        "EnvMaintAMI"
      ]

対象となるセキュリティグループ名を指定します。

```bash:変数の設定:
VPC_SG_NAME='EnvMaintAMI'
```

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

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

結果(例):

      sg-xxxxxxxx

セキュリティグループの内容を確認しましょう。

```bash:コマンド:
aws ec2 describe-security-groups \
        --group-ids ${VPC_SG_ID}
```

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

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


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

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

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

結果(例):

      [
          "<キーペアー名>"
      ]

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

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

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

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

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

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


1.4. イメージ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.5. インスタンスタイプの決定
-----------------------------

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


1.6. 稼動インスタンスを確認
---------------------------

同一リージョンでインスタンスが起動していないことを確認します。

```bash:コマンド:
EC2_INSTANCE_STATUS='running'
```

```bash:コマンド:
aws ec2 describe-instances \
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS}
```

結果:

      {
        "Reservations": []
      }


2. インスタンス起動
===================


2.1. インスタンス起動
---------------------

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

        EC2_IMAGE_ID:              ${EC2_IMAGE_ID}
        EC2_INSTANCE_TYPE:         ${EC2_INSTANCE_TYPE}
        EC2_KEY_PAIR_NAME:         ${EC2_KEY_PAIR_NAME}
        EC2_PRIVATE_ADDR:          ${EC2_PRIVATE_ADDR}
        ARRAY_VPC_SG_IDS:          ${ARRAY_VPC_SG_IDS}
        VPC_SUBNET_ID              ${VPC_SUBNET_ID}
        FILE_INPUT:                ${FILE_INPUT}
        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}

ETX
```

コマンド

      aws ec2 run-instances \
        --image-id ${EC2_IMAGE_ID} \
        --instance-type ${EC2_INSTANCE_TYPE} \
        --security-group-ids ${ARRAY_VPC_SG_IDS} \
        --key-name ${EC2_KEY_PAIR_NAME} \
        --subnet-id ${VPC_SUBNET_ID} \
        --private-ip-address ${EC2_PRIVATE_ADDR} \
        --associate-public-ip-address  \
        --user-data file://${FILE_INPUT} \
        --iam-instance-profile Name=${IAM_INSTANCE_PROFILE_NAME}

結果(例):

      {
        "OwnerId": "XXXXXXXXXXXX",
        "ReservationId": "r-xxxxxxxxxxxxxxxxx",
        "Groups": [],
        "Instances": [
          {
              "Monitoring": {
                  "State": "disabled"
              },
              "PublicDnsName": "",
              "RootDeviceType": "ebs",
              "State": {
                  "Code": 0,
                  "Name": "pending"
              },
              "EbsOptimized": false,
              "LaunchTime": "2017-02-13T01:23:45.000Z",
              "PrivateIpAddress": "10.192.16.22",
              "ProductCodes": [],
              "VpcId": "vpc-xxxxxxxx",
              "StateTransitionReason": "",
              "InstanceId": "i-xxxxxxxxxxxxxxxxx",
              "ImageId": "ami-xxxxxxxx",
              "PrivateDnsName": "ip-xxx-xxx-xxx-xxx.ap-northeast-1ap-northeast-1.compute.internal",
              "KeyName": "<キーペアー名>",
              "SecurityGroups": [
                  {
                      "GroupName": "EnvMaintAMI",
                      "GroupId": "sg-xxxxxxxx"
                  }
              ],
              "ClientToken": "",
              "SubnetId": "subnet-xxxxxxxx",
              "InstanceType": "t2.micro",
              "NetworkInterfaces": [
                  {
                      "Status": "in-use",
                      "MacAddress": "xx:xx:xx:xx:xx:xx",
                      "SourceDestCheck": true,
                      "VpcId": "vpc-xxxxxxxx",
                      "Description": "",
                      "NetworkInterfaceId": "eni-xxxxxxxx",
                      "PrivateIpAddresses": [
                          {
                              "Primary": true,
                              "PrivateIpAddress": "10.192.16.22"
                          }
                      ],
                      "Attachment": {
                          "Status": "attaching",
                          "DeviceIndex": 0,
                          "DeleteOnTermination": true,
                          "AttachmentId": "eni-attach-xxxxxxxx",
                          "AttachTime": "2017-02-13T01:23:45.000Z"
                      },
                      "Groups": [
                          {
                              "GroupName": "<キーペアー名>",
                              "GroupId": "sg-xxxxxxxx"
                          }
                      ],
                      "SubnetId": "subnet-xxxxxxxx",
                      "OwnerId": "XXXXXXXXXXXX",
                      "PrivateIpAddress": "10.192.16.22"
                  }
              ],
              "SourceDestCheck": true,
              "Placement": {
                  "Tenancy": "default",
                  "GroupName": "",
                  "AvailabilityZone": "ap-northeast-1a"
              },
              "Hypervisor": "xen",
              "BlockDeviceMappings": [],
              "Architecture": "x86_64",
              "StateReason": {
                  "Message": "pending",
                  "Code": "pending"
              },
              "RootDeviceName": "/dev/xvda",
              "VirtualizationType": "hvm",
              "AmiLaunchIndex": 0
          }
        ]
      }


2.2. インスタンスIDの取得
-------------------------

起動中のインスタンスからインスタンスIDを取得します。

```bash:コマンド:
EC2_INSTANCE_ID=$( \
        aws ec2 describe-instances \
          --filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} \
          --query 'Reservations[].Instances[].InstanceId' \
          --output text \
) \
        && echo ${EC2_INSTANCE_ID}
```

結果(例):

      i-xxxxxxxxxxxxxxxxx


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


インスタンスのステータス確認
----------------------------

```bash:コマンド:
EC2_INSTANCE_STATE=$( \
        aws ec2 describe-instances \
        --instance-ids ${EC2_INSTANCE_ID} \
        --query 'Reservations[].Instances[].State.Name' \
        --output text \
) \
        && echo ${EC2_INSTANCE_STATE}
```

結果(例):

      running


完了
====

amzn-ami-hvm-2016.09.1.20170119-x86_64-gp2