AWS
EC2
aws-cli
Inspector

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

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

前提条件

本手順はJAWS-UG CLI専門支部の実施したハンズオン手順です。
全工程については下記総合案内をご確認ください。
#91 Amazon Inspector 入門 (CloudWatch Eventで定期診断編)

EC2への権限

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

AWS CLIのバージョン

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

  • AWS CLI 1.11.122
コマンド
aws --version

結果(例):

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

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

コマンド
sudo -H pip install -U awscli

AWSアカウントの属性

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

コマンド
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. リージョンの決定

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

0.2. 変数の確認:

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

変数の確認
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ブロックを確認します。

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

結果(例):

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

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

変数の設定
VPC_CIDR='172.31.0.0/16'

VPC IDを取得します。

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

結果(例):

  vpc-xxxxxxxx

0.4. サブネットの指定

変数の設定
VPC_SUBNET_CIDR='172.31.0.0/20'
コマンド
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アドレスを指定します。

変数の設定
EC2_PRIVATE_ADDR='172.31.0.8'

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

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

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

結果(例):

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

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

変数の設定
VPC_SG_NAME='default'
コマンド
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

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

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

1.2. キーペアの指定

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

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

結果(例):

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

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

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

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

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

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

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

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

コマンド
ls ${FILE_SSH_KEY}

1.3. イメージIDの決定

AMIを選択します。

変数の設定
AMZLINUX_VERSION='2016.03.3'
EC2_IMAGE_NAME="amzn-ami-hvm-${AMZLINUX_VERSION}.x86_64-gp2"
コマンド
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. インスタンスタイプの決定

変数の設定
EC2_INSTANCE_TYPE='t2.micro'

1.5. Userdataの設定(AWSエージェントインストール)

変数の設定
FILE_EC2_USERDATA='userdata.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. インスタンス起動

変数の確認
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
コマンド
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を取得します。

コマンド
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. タグの決定

変数の設定
TAG_KEY='inspector'
TAG_VALUE='ON'

3.2. タグの作成

変数の確認
cat << ETX

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

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

結果(例):

  (戻り値なし)

3.3.タグの確認

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

結果(例):

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

完了