[JAWS-UG CLI] #91 Amazon Inspector入門(1) : 診断用インスタンスの作成とタグの作成

Amazon Inspector動作確認用のインスタンスを作成します。

前提条件
========
本手順はJAWS-UG CLI専門支部の実施したハンズオン手順です。 
全工程については下記総合案内をご確認ください。
[#91 Amazon Inspector 入門 (CloudWatch Eventで定期診断編)](http://qiita.com/tcsh/items/b55eee599ae2c8806e4f#91-inspector-%E5%85%A5%E9%96%80-cloudwatch-event%E3%81%A7%E5%AE%9A%E6%9C%9F%E8%A8%BA%E6%96%AD%E7%B7%A8)


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

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


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

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

- AWS CLI 1.11.122

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

結果(例):

      aws-cli/1.11.122 Python/2.7.10 Linux/4.1.27-25.49.amzn1.x86_64 botocore/1.5.85

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

```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"
      ]

ここでは、172.31.0.0/16を範囲とするVPCを選択します(デフォルトVPCを選択)

```bash:変数の設定:
VPC_CIDR='172.31.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='172.31.0.0/20'
```

```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


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

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

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

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

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

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

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

結果(例):

      [
        "default",
        "ec2-ssh-global-inbound"
      ]

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

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

```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:変数の設定
ARRAY_VPC_SG_ID="${VPC_SG_ID}" \
        && echo ${ARRAY_VPC_SG_ID}
```


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

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

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

結果(例):

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

利用するキーペア名を指定します(本ハンズオンではSSHログインはしない為、基本的にはどのキーでもOK)

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

※キーが存在しない場合は下記コマンドで作成してください。

```bash:コマンド:
aws ec2 create-key-pair --key-name '<キーペアー名>'
``` 

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

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

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

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



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

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

1.5. Userdataの設定（AWSエージェントインストール）
-----------------------------

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

```bash:コマンド:
cat << EOF > ${FILE_EC2_USERDATA}
#!/bin/bash
wget https://d1wk0tztpsntt1.cloudfront.net/linux/latest/install
sudo bash install
EOF

cat ${FILE_EC2_USERDATA}
```


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_ID:           ${ARRAY_VPC_SG_ID}
        VPC_SUBNET_ID              ${VPC_SUBNET_ID}
        FILE_EC2_USERDATA          ${FILE_EC2_USERDATA}

ETX
```

```bash:コマンド
aws ec2 run-instances \
    --image-id ${EC2_IMAGE_ID} \
    --instance-type ${EC2_INSTANCE_TYPE} \
    --security-group-ids ${ARRAY_VPC_SG_ID} \
    --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_EC2_USERDATA} 
```

結果(例):

     {
         "Instances": [
             {
                 "Monitoring": {
                     "State": "disabled"
                 },
                 "PublicDnsName": "",
                 "StateReason": {
                     "Message": "pending",
                     "Code": "pending"
                 },
                 "State": {
                     "Code": 0,
                     "Name": "pending"
                 },
                 "EbsOptimized": false,
                 "LaunchTime": "2017-08-18T01:43:27.000Z",
                 "PrivateIpAddress": "172.31.0.8",
                 "ProductCodes": [],
                 "VpcId": "vpc-cd0a2ea9",
                 "StateTransitionReason": "",
                 "InstanceId": "i-026a0f32b99b2db89",
                 "ImageId": "ami-374db956",
                 "PrivateDnsName": "ip-172-31-0-8.ap-northeast-1.compute.internal",
                 "KeyName": "test",
                 "SecurityGroups": [
                     {
                         "GroupName": "default",
                         "GroupId": "sg-993e58ff"
                     }
                 ],
                 "ClientToken": "",
                 "SubnetId": "subnet-50043008",
                 "InstanceType": "t2.micro",
                 "NetworkInterfaces": [
                     {
                         "Status": "in-use",
                         "MacAddress": "0a:91:3e:06:d6:34",
                         "SourceDestCheck": true,
                         "VpcId": "vpc-cd0a2ea9",
                         "Description": "",
                         "NetworkInterfaceId": "eni-55236f59",
                         "PrivateIpAddresses": [
                             {
                                 "PrivateDnsName": "ip-172-31-0-8.ap-northeast-1.compute.internal",
                                 "Primary": true,
                                 "PrivateIpAddress": "172.31.0.8"
                             }
                         ],
                         "PrivateDnsName": "ip-172-31-0-8.ap-northeast-1.compute.internal",
                         "Attachment": {
                             "Status": "attaching",
                             "DeviceIndex": 0,
                             "DeleteOnTermination": true,
                             "AttachmentId": "eni-attach-f81f2311",
                             "AttachTime": "2017-08-18T01:43:27.000Z"
                         },
                         "Groups": [
                             {
                                 "GroupName": "default",
                                 "GroupId": "sg-993e58ff"
                             }
                         ],
                         "Ipv6Addresses": [],
                         "OwnerId": "xxxx",
                         "SubnetId": "subnet-50043008",
                         "PrivateIpAddress": "172.31.0.8"
                     }
                 ],
                 "SourceDestCheck": true,
                 "Placement": {
                     "Tenancy": "default",
                     "GroupName": "",
                     "AvailabilityZone": "ap-northeast-1c"
                 },
                 "Hypervisor": "xen",
                 "BlockDeviceMappings": [],
                 "Architecture": "x86_64",
                 "RootDeviceType": "ebs",
                 "RootDeviceName": "/dev/xvda",
                 "VirtualizationType": "hvm",
                 "AmiLaunchIndex": 0
             }
         ],
         "ReservationId": "r-03bf5d17d27a7be9e",
         "Groups": [],
         "OwnerId": "xxxx"
     }

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. タグの作成
===========
Inspector診断用のタグを作成します。

3.1. タグの決定
-------------------

```bash:変数の設定:
TAG_KEY='inspector'
TAG_VALUE='ON'
```

3.2. タグの作成
-------------------

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

        TAG_KEY:         ${TAG_KEY}
        TAG_VALUE:       ${TAG_VALUE}
        EC2_INSTANCE_ID: ${EC2_INSTANCE_ID}

ETX
```

```bash:コマンド:
aws ec2 create-tags \
        --resources ${EC2_INSTANCE_ID} \
        --tags "Key=${TAG_KEY},Value=${TAG_VALUE}"
```

結果(例):

      (戻り値なし)


3.3.タグの確認
----------

```bash:コマンド:
aws ec2 describe-tags \
  --query 'Tags[?Key==`inspector`]'
```

結果(例):

     [
         {
             "ResourceType": "instance",
             "ResourceId": "i-xxxxxxxxxxxx",
             "Value": "ON",
             "Key": "inspector"
         },
     ]

完了
====