[JAWS-UG CLI] Amazon Kinesis Firehose 入門 (4) Kinesis Agent環境の構築（VPC、EC2）

# この記事について

[JAWS-UG CLI専門支部 #73 Kinesis Firehose入門](https://jawsug-cli.doorkeeper.jp/events/41915)で実施するハンズオン用の手順書です。


# 前提条件

## 必要な権限

作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。

- Kinesis Firehoseのフルコントロール権限
- S3のフルコントロール権限
- STSの関するフルコントロール権限
- IAMの関するフルコントロール権限
- CloudWatchの関するフルコントロール権限
- CloudWatch Logsの関するフルコントロール権限

# 0. 準備

## 0.1. リージョンを指定

オレゴンリージョンで実施します。（東京マダー？）

```bash:コマンド
export AWS_DEFAULT_REGION="us-west-2"
```

## 0.2. 資格情報を確認


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

インスタンスプロファイルを設定したEC2インスタンスでアクセスキーを設定せずに実行した場合、以下のようになります。

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************QSAA         iam-role
secret_key     ****************c1xY         iam-role
    region                us-west-2              env    AWS_DEFAULT_REGION
```

## 0.3. バージョン確認

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

```text:結果
aws-cli/1.11.24 Python/2.7.12 Linux/4.4.30-32.54.amzn1.x86_64 botocore/1.4.81
```

## 0.4. バージョンアップ（必要に応じて）

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

# 1. VPCの作成

Kinesis Agentを導入するサーバを作成します。
併せて、データソースのApache Web Serverのログとします。

## VPCのCIDRを指定

```bash:コマンド
CIDR_BLOCK='10.0.0.0/16'
```

## パラメータを確認

```bash:コマンド
cat << ETX

   VPC_CIDR_BLOCK: "${CIDR_BLOCK}"

ETX
```

```text:結果

   VPC_CIDR_BLOCK: "10.0.0.0/16"

```

## VPCを作成

```bash:コマンド
aws ec2 create-vpc \
    --cidr-block ${CIDR_BLOCK}
```

```text:結果
{
    "Vpc": {
        "VpcId": "vpc-********",
        "InstanceTenancy": "default",
        "Tags": [],
        "State": "pending",
        "DhcpOptionsId": "dopt-********",
        "CidrBlock": "10.0.0.0/16",
        "IsDefault": false
    }
}
```

```bash:コマンド
VPC_ID=$(aws ec2 describe-vpcs \
    --query "Vpcs[?CidrBlock==\`${CIDR_BLOCK}\`].VpcId" \
    --output text) \
    && echo ${VPC_ID}
```

```text:結果
vpc-********
```

## 作成したVPCの確認

```bash:コマンド
aws ec2 describe-vpcs --vpc-ids ${VPC_ID}
```

```json:結果
{
    "Vpcs": [
        {
            "VpcId": "vpc-********",
            "InstanceTenancy": "default",
            "State": "available",
            "DhcpOptionsId": "dopt-********",
            "CidrBlock": "10.0.0.0/16",
            "IsDefault": false
        }
    ]
}
```

# 2. Internet Gatewayの作成、アタッチ

## インターネットゲートウェイの作成

```bash:コマンド
IGW_ID=$(aws ec2 create-internet-gateway \
    --query InternetGateway.InternetGatewayId \
    --output text) \
    && echo ${IGW_ID}
```

```text:結果
igw-********
```

## 作成したInternet Gatewayを確認

```bash:コマンド
aws ec2 describe-internet-gateways \
    --internet-gateway-ids ${IGW_ID}
```

```json:結果
{
    "InternetGateways": [
        {
            "Tags": [],
            "InternetGatewayId": "igw-********",
            "Attachments": []
        }
    ]
}
```

## パラメータを確認

```bash:コマンド
cat << ETX

   VPC_ID: "${VPC_ID}"
   IGW_ID: "${IGW_ID}"

ETX
```

```text:結果

   VPC_ID: "vpc-********"
   IGW_ID: "igw-********"

```

## VPCにインターネットゲートウェイをアタッチ

```bash:コマンド
aws ec2 attach-internet-gateway \
    --internet-gateway-id ${IGW_ID} \
    --vpc-id ${VPC_ID}
```

```text:結果
(返値なし)
```

## アタッチした結果を確認

```bash:コマンド
aws ec2 describe-internet-gateways \
    --internet-gateway-ids ${IGW_ID}
```

```json:結果
{
    "InternetGateways": [
        {
            "Tags": [],
            "InternetGatewayId": "igw-********",
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-********"
                }
            ]
        }
    ]
}
```

# 3. Subnetの作成

## サブネットを指定

```bash:コマンド
CIDR_BLOCK_SUBNET_A='10.0.0.0/24'
```

## パラメータを確認

```bash:コマンド
cat << ETX

   VPC_ID: "${VPC_ID}"
   Subnet_CIDR_BLOCK_on_${AWS_DEFAULT_REGION}a: "${CIDR_BLOCK_SUBNET_A}"

ETX
```

```text:結果

   VPC_ID: "vpc-********"
   Subnet_CIDR_BLOCK_on_ap-northeast-1a: "10.0.0.0/24"

```

## サブネットを作成

```bash:コマンド
aws ec2 create-subnet --vpc-id ${VPC_ID} \
    --cidr-block ${CIDR_BLOCK_SUBNET_A} \
    --availability-zone ${AWS_DEFAULT_REGION}a
```

```json:結果
{
    "Subnet": {
        "VpcId": "vpc-********",
        "AvailableIpAddressCount": 251,
        "MapPublicIpOnLaunch": false,
        "DefaultForAz": false,
        "Ipv6CidrBlockAssociationSet": [],
        "State": "pending",
        "AvailabilityZone": "us-west-2a",
        "SubnetId": "subnet-********",
        "CidrBlock": "10.0.0.0/24",
        "AssignIpv6AddressOnCreation": false
    }
}
```

```bash:コマンド
SUBNET_A_ID=$(aws ec2 describe-subnets \
    --query "Subnets[?CidrBlock==\`${CIDR_BLOCK_SUBNET_A}\`].SubnetId" \
    --output text) \
    && echo ${SUBNET_A_ID}
```

```text:結果
subnet-********
```

## 作成したサブネットを確認

```bash:コマンド
aws ec2 describe-subnets \
    --subnet-ids ${SUBNET_A_ID}
```

```json:結果
{
    "Subnets": [
        {
            "VpcId": "vpc-********",
            "CidrBlock": "10.0.0.0/24",
            "MapPublicIpOnLaunch": false,
            "DefaultForAz": false,
            "State": "available",
            "AvailabilityZone": "ap-northeast-1a",
            "SubnetId": "subnet-********",
            "AvailableIpAddressCount": 251
        }
    ]
}
```

# 4. Route Tableの編集

パブリックサブネットを作成するために、デフォルトのルートテーブルを編集します。

## 作成したVPCのデフォルトのルートテーブルIDを確認

```bash:コマンド
ROUTE_TABLE_ID=$(aws ec2 describe-route-tables \
    --query RouteTables[?VpcId==\'${VPC_ID}\'].RouteTableId \
    --output text) \
    && echo ${ROUTE_TABLE_ID}
```

```text:結果
rtb-********
```

## ルートテーブルを確認

```bash:コマンド
aws ec2 describe-route-tables \
    --query RouteTables[?VpcId==\'${VPC_ID}\']
```

```json:結果
[
    {
        "Associations": [
            {
                "RouteTableAssociationId": "rtbassoc-********",
                "Main": true,
                "RouteTableId": "rtb-********"
            }
        ],
        "RouteTableId": "rtb-********",
        "VpcId": "vpc-********",
        "PropagatingVgws": [],
        "Tags": [],
        "Routes": [
            {
                "GatewayId": "local",
                "DestinationCidrBlock": "10.0.0.0/16",
                "State": "active",
                "Origin": "CreateRouteTable"
            }
        ]
    }
]
```


## パラメータを確認

```bash:コマンド
cat << ETX

   RouteTable_ID: "${ROUTE_TABLE_ID}"
   InternetGateat_ID: "${IGW_ID}"

ETX
```

```text:結果

   RouteTable_ID: "rtb-********"
   InternetGateat_ID: "igw-********"

```

## デフォルトのルートテーブルにデフォルトルートを追加

```bash:コマンド
aws ec2 create-route \
    --route-table-id ${ROUTE_TABLE_ID} \
    --destination-cidr-block '0.0.0.0/0' \
    --gateway-id ${IGW_ID}
```

```json:結果
{
    "Return": true
}
```

## ルートテーブルに追加したルートを確認

```bash:コマンド
aws ec2 describe-route-tables \
    --query RouteTables[?VpcId==\'${VPC_ID}\']
```

```json:結果
[
    {
        "Associations": [
            {
                "RouteTableAssociationId": "rtbassoc-********",
                "Main": true,
                "RouteTableId": "rtb-********"
            }
        ],
        "RouteTableId": "rtb-********",
        "VpcId": "vpc-********",
        "PropagatingVgws": [],
        "Tags": [],
        "Routes": [
            {
                "GatewayId": "local",
                "DestinationCidrBlock": "10.0.0.0/16",
                "State": "active",
                "Origin": "CreateRouteTable"
            },
            {
                "GatewayId": "igw-********",
                "DestinationCidrBlock": "0.0.0.0/0",
                "State": "active",
                "Origin": "CreateRoute"
            }
        ]
    }
]
```

# 5. Sucurity Groupの作成、設定

作業用EC2インスタンス用のSecurity Groupを作成します。
今回、Web Serverのアクセスログをデータソースとするため、80番ポートへのアクセスを許可します。

## Security Groupの名前を設定（Amazon Linux用）

```bash:コマンド
SG_GROUP_NAME='SSH-HTTP'
SG_DESCRIPTION='JAWS-UG CLI at Co-Edo'
```

## パラメータの確認

```bash:コマンド
cat << ETX

   SG_GROUP_NAME: ${SG_GROUP_NAME}
   SG_DESCRIPTION: ${SG_DESCRIPTION}
   VPC_ID: ${VPC_ID}

ETX
```

```text:結果

   SG_GROUP_NAME: SSH-HTTP
   SG_DESCRIPTION: JAWS-UG CLI at Co-Edo
   VPC_ID: vpc-********

```

## ユーザ作成用のEC2インスタンスに設定するSecurity Groupを作成

```bash:コマンド
aws ec2 create-security-group \
    --group-name ${SG_GROUP_NAME} \
    --description "${SG_DESCRIPTION}" \
    --vpc-id ${VPC_ID}
```

```json:結果
{
    "GroupId": "sg-********"
}
```


```bash:コマンド
SG_ID=$(aws ec2 describe-security-groups \
    --query SecurityGroups[?GroupName==\'${SG_GROUP_NAME}\'].GroupId \
    --output text) \
    && echo ${SG_ID}
```

```text:結果
sg-********
```


## 作成したSecurity Groupを確認

（アウトバウンドの通信のみ全て許可する設定のみ、がデフォルト）

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

```json:結果
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "PrefixListIds": []
                }
            ],
            "Description": "JAWS-UG CLI at Co-Edo",
            "IpPermissions": [],
            "GroupName": "SSH-HTTP",
            "VpcId": "vpc-********",
            "OwnerId": "************",
            "GroupId": "sg-********"
        }
    ]
}
```

## インバウンドのルールを追加

sshおよびHTTP接続を許可します。

接続元のIPアドレスを制限したい場合には、確認君などでIPアドレスを確認してください。
http://www.ugtop.com/spill.shtml

```bash:コマンド
aws ec2 authorize-security-group-ingress \
    --group-id ${SG_ID} \
    --protocol 'tcp' \
    --port 22 \
    --cidr 0.0.0.0/0
```

```text:結果
（返値無し）
```

```bash:コマンド
aws ec2 authorize-security-group-ingress \
    --group-id ${SG_ID} \
    --protocol 'tcp' \
    --port 80 \
    --cidr 0.0.0.0/0
```

```text:結果
（返値無し）
```


## 追加されたルールを確認

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

```json:結果
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "PrefixListIds": [],
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "Ipv6Ranges": []
                }
            ],
            "Description": "JAWS-UG CLI at Co-Edo",
            "IpPermissions": [
                {
                    "PrefixListIds": [],
                    "FromPort": 80,
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "ToPort": 80,
                    "IpProtocol": "tcp",
                    "UserIdGroupPairs": [],
                    "Ipv6Ranges": []
                },
                {
                    "PrefixListIds": [],
                    "FromPort": 22,
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "UserIdGroupPairs": [],
                    "Ipv6Ranges": []
                }
            ],
            "GroupName": "SSH-HTTP",
            "VpcId": "vpc-********",
            "OwnerId": "************",
            "GroupId": "sg-********"
        }
    ]
}
```


# 6. Key Pairの作成

## KeyPairの名前および秘密鍵のファイル名を設定

```bash:コマンド
KEY_PAIR_NAME='Firehose'
KEY_MATERIAL_FILE='firehose.pem'
```

## 同名のKey Pairが存在しないことを確認

```bash:コマンド
aws ec2 describe-key-pairs \
    --key-names ${KEY_PAIR_NAME}
```

```text:結果
An error occurred (InvalidKeyPair.NotFound) when calling the DescribeKeyPairs operation: The key pair 'Firehose' does not exist
```

## 同名の秘密鍵ファイルが存在しないことを確認

```bash:コマンド
ls -al ~/.ssh | grep ${KEY_MATERIAL_FILE}
```

```text:結果
（返値無し）
```

## パラメータの確認

```bash:コマンド
cat << ETX

   KEY_PAIR_NAME: ${KEY_PAIR_NAME}
   KEY_MATERIAL_FILE: ${KEY_MATERIAL_FILE}

ETX
```

```text:結果

   KEY_PAIR_NAME: Firehose
   KEY_MATERIAL_FILE: firehose.pem

```


## KeyPairの作成

```bash:コマンド
aws ec2 create-key-pair \
    --key-name ${KEY_PAIR_NAME} \
    --query KeyMaterial \
    --output text \
    > ~/.ssh/${KEY_MATERIAL_FILE} \
    && chmod 600 ~/.ssh/${KEY_MATERIAL_FILE}
```

```text:結果
（返値無し）
```

## Key Pairが作成されたことを確認

```bash:コマンド
aws ec2 describe-key-pairs \
    --key-names ${KEY_PAIR_NAME}
```

```json:結果
{
    "KeyPairs": [
        {
            "KeyName": "Firehose",
            "KeyFingerprint": "**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**"
        }
    ]
}
```


## 秘密鍵ファイルを確認

```bash:コマンド
cat ~/.ssh/${KEY_MATERIAL_FILE}
```

```text:結果
-----BEGIN RSA PRIVATE KEY-----
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
****************************************************************************
-----END RSA PRIVATE KEY-----
```

## 権限の確認

```bash:コマンド
ls -al ~/.ssh/${KEY_MATERIAL_FILE}
```

```text:結果
-rw------- 1 ec2-user ec2-user 1675 Dec 19 07:08 /home/ec2-user/.ssh/firehose.pem
```


# 7. インスタンスプロファイルの作成

このハンズオンでは、EC2インスタンス上でKinesis Firehoseに関する操作を行います。
そのための権限をEC2インスタンスに付与します。

これにより、インスタンスメタデータからアクセスキーやトークンを取得できるため、aws-cliを利用する際にアクセスキーを直接扱う必要がなくなります。

## IAM Role名を指定

```bash:コマンド
ROLE_NAME='firehose-agent-role'
```

## 同名のロールがないことを確認

```bash:コマンド
aws iam get-role --role-name ${ROLE_NAME}
```

```text:結果
An error occurred (NoSuchEntity) when calling the GetRole operation: Unknown
```

## 信頼関係の定義

```bash:コマンド
TRUST_POLICY_FILE='Trust-Policy.json'
```

```bash:コマンド
cat << EOF > ${TRUST_POLICY_FILE}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
```

```text:結果
（返値無し）
```


## JSONファイルを検証

```bash:コマンド
jsonlint -q ${TRUST_POLICY_FILE}
```

```text:結果
（返値無し）
```

## IAMロールの作成

```bash:コマンド
aws iam create-role \
    --role-name ${ROLE_NAME} \
    --assume-role-policy-document file://${TRUST_POLICY_FILE}
```

```json:結果
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Effect": "Allow",
                    "Sid": ""
                }
            ]
        },
        "RoleId": "A********************",
        "CreateDate": "2016-04-02T12:33:09.681Z",
        "RoleName": "firehose-agent-role",
        "Path": "/",
        "Arn": "arn:aws:iam::************:role/firehose-agent-role"
    }
}
```

## IAMロールにManaged Policyをアタッチ

デリバリーストリームへのデータを投稿する権限を付与します。（ポリシーの作成手順を省略するため、既存のポリシーを利用しています。）

```bash:コマンド
KFH_POLICY_ARN='arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess'
```

```bash:コマンド
aws iam attach-role-policy \
    --role-name ${ROLE_NAME} \
    --policy-arn ${KFH_POLICY_ARN}
```

```text:結果
（返値無し）
```

## IAM Roleにポリシーがアタッチされたことを確認

```bash:コマンド
aws iam list-attached-role-policies --role-name ${ROLE_NAME}
```

```json:結果
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonKinesisFirehoseFullAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess"
        }
    ]
}
```

## 同名のインスタンスプロファイルが存在しないことを確認

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

```text:結果
An error occurred (NoSuchEntity) when calling the GetInstanceProfile operation: Instance Profile firehose-agent-role cannot be found.
```

## インスタンスプロファイルを作成

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

```json:結果
{
    "InstanceProfile": {
        "InstanceProfileId": "A********************",
        "Roles": [],
        "CreateDate": "2016-04-02T12:35:07.689Z",
        "InstanceProfileName": "firehose-agent-role",
        "Path": "/",
        "Arn": "arn:aws:iam::************:instance-profile/firehose-agent-role"
    }
}
```

## インスタンスプロファイルが作成されたことを確認

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

```json:結果
{
    "InstanceProfile": {
        "InstanceProfileId": "A********************",
        "Roles": [],
        "CreateDate": "2016-04-02T12:35:07Z",
        "InstanceProfileName": "firehose-agent-role",
        "Path": "/",
        "Arn": "arn:aws:iam::************:instance-profile/firehose-agent-role"
    }
}
```

## インスタンスプロファイルにIAM Roleを追加

```bash:コマンド
aws iam add-role-to-instance-profile \
    --instance-profile-name ${ROLE_NAME} \
    --role-name ${ROLE_NAME}
```

```text:結果
（返値無し）
```

## インスタンスプロファイルにIAM Roleが追加されたことを確認

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

```json:結果
{
    "InstanceProfile": {
        "InstanceProfileId": "A********************",
        "Roles": [
            {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Action": "sts:AssumeRole",
                            "Principal": {
                                "Service": "ec2.amazonaws.com"
                            },
                            "Effect": "Allow",
                            "Sid": ""
                        }
                    ]
                },
                "RoleId": "A********************",
                "CreateDate": "2016-04-02T12:33:09Z",
                "RoleName": "firehose-agent-role",
                "Path": "/",
                "Arn": "arn:aws:iam::************:role/firehose-agent-role"
            }
        ],
        "CreateDate": "2016-04-02T12:35:07Z",
        "InstanceProfileName": "firehose-agent-role",
        "Path": "/",
        "Arn": "arn:aws:iam::************:instance-profile/firehose-agent-role"
    }
}
```

# 8. EC2インスタンスの作成

## Amazon Linuxの最新AMIのImage IDを確認

Amazon LinuxのAMIのうち、最新のAMIを利用します。
（2016年12月3日現在）

```bash:コマンド
AMI_ID=ami-5ec1673e
```

## AWSアカウントのIDを取得

```bash:コマンド
AWS_ID=$(aws sts get-caller-identity \
    --query Account \
    --output text) \
    && echo ${AWS_ID}
```

```text:結果
************
```

## プライベートIPアドレスを指定

```bash:コマンド
PRIVATE_IP_ADDRESS="10.0.0.10"
```


## パラメータを確認

```bash:コマンド
cat << ETX

   AWS_ID: ${AWS_ID}
   AMI_ID: "${AMI_ID}"
   KEY_PAIR_NAME: ${KEY_PAIR_NAME}
   SecurityGroup_ID: "${SG_ID}"
   Subnet_ID: "${SUBNET_A_ID}"
   PRIVATE_IP_ADDRESS: ${PRIVATE_IP_ADDRESS}
   Instance Profile ARN: arn:aws:iam::${AWS_ID}:instance-profile/${ROLE_NAME}

ETX
```

```text:結果

   AWS_ID: ************
   AMI_ID: "ami-5ec1673e"
   KEY_PAIR_NAME: Firehose
   SecurityGroup_ID: "sg-********"
   Subnet_ID: "subnet-********"
   PRIVATE_IP_ADDRESS: 10.0.0.10
   Instance Profile ARN: arn:aws:iam::************:instance-profile/firehose-agent-role

```

## EC2インスタンスを作成

```bash:コマンド
aws ec2 run-instances \
    --image-id ${AMI_ID} \
    --key-name ${KEY_PAIR_NAME} \
    --security-group-ids ${SG_ID} \
    --instance-type 't2.micro' \
    --subnet-id ${SUBNET_A_ID} \
    --associate-public-ip-address \
    --private-ip-address ${PRIVATE_IP_ADDRESS} \
    --iam-instance-profile Arn=arn:aws:iam::${AWS_ID}:instance-profile/${ROLE_NAME}
```

```json:結果
{
    "OwnerId": "************",
    "ReservationId": "r-0b28c************",
    "Groups": [],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": "",
            "RootDeviceType": "ebs",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2016-12-19T07:20:08.000Z",
            "PrivateIpAddress": "10.0.0.10",
            "ProductCodes": [],
            "VpcId": "vpc-********",
            "StateTransitionReason": "",
            "InstanceId": "i-0****************",
            "ImageId": "ami-5ec1673e",
            "PrivateDnsName": "ip-10-0-0-10.us-west-2.compute.internal",
            "KeyName": "Firehose",
            "SecurityGroups": [
                {
                    "GroupName": "SSH-HTTP",
                    "GroupId": "sg-********"
                }
            ],
            "ClientToken": "",
            "SubnetId": "subnet-********",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "MacAddress": "02:5d:2f:3b:65:9f",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-********",
                    "Description": "",
                    "NetworkInterfaceId": "eni-********",
                    "PrivateIpAddresses": [
                        {
                            "Primary": true,
                            "PrivateIpAddress": "10.0.0.10"
                        }
                    ],
                    "Ipv6Addresses": [],
                    "Attachment": {
                        "Status": "attaching",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-********",
                        "AttachTime": "2016-12-19T07:20:08.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "SSH-HTTP",
                            "GroupId": "sg-********"
                        }
                    ],
                    "SubnetId": "subnet-********",
                    "OwnerId": "************",
                    "PrivateIpAddress": "10.0.0.10"
                }
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": "",
                "AvailabilityZone": "us-west-2a"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "IamInstanceProfile": {
                "Id": "A********************",
                "Arn": "arn:aws:iam::************:instance-profile/firehose-agent-role"
            },
            "RootDeviceName": "/dev/xvda",
            "VirtualizationType": "hvm",
            "AmiLaunchIndex": 0
        }
    ]
}
```

```bash:コマンド
INSTANCE_ID=$(aws ec2 describe-instances \
    --query "Reservations[].Instances[?PrivateIpAddress==\`${PRIVATE_IP_ADDRESS}\`].InstanceId" \
    --output text) \
    && echo ${INSTANCE_ID}
```

```text:結果
i-********
```

## EC2インスタンスが作成されたことを確認

```bash:コマンド
aws ec2 describe-instances \
    --instance-ids ${INSTANCE_ID}
```

```json:結果（例）
{
    "Reservations": [
        {
            "OwnerId": "************",
            "ReservationId": "r-0****************",
            "Groups": [],
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    "EbsOptimized": false,
                    "LaunchTime": "2016-04-02T13:07:20.000Z",
                    "PublicIpAddress": "**.**.**.**",
                    "PrivateIpAddress": "10.0.0.10",
                    "ProductCodes": [],
                    "VpcId": "vpc-********",
                    "StateTransitionReason": "",
                    "InstanceId": "i-0****************",
                    "ImageId": "ami-f80e0596",
                    "PrivateDnsName": "ip-10-0-0-10.ap-northeast-1.compute.internal",
                    "KeyName": "Redshift",
                    "SecurityGroups": [
                        {
                            "GroupName": "SSH",
                            "GroupId": "sg-********"
                        }
                    ],
                    "ClientToken": "",
                    "SubnetId": "subnet-********",
                    "InstanceType": "t2.micro",
                    "NetworkInterfaces": [
                        {
                            "Status": "in-use",
                            "MacAddress": "**:**:**:**:**:**",
                            "SourceDestCheck": true,
                            "VpcId": "vpc-********",
                            "Description": "",
                            "Association": {
                                "PublicIp": "**.**.**.**",
                                "PublicDnsName": "",
                                "IpOwnerId": "amazon"
                            },
                            "NetworkInterfaceId": "eni-********",
                            "PrivateIpAddresses": [
                                {
                                    "Association": {
                                        "PublicIp": "**.**.**.**",
                                        "PublicDnsName": "",
                                        "IpOwnerId": "amazon"
                                    },
                                    "Primary": true,
                                    "PrivateIpAddress": "10.0.0.10"
                                }
                            ],
                            "Attachment": {
                                "Status": "attached",
                                "DeviceIndex": 0,
                                "DeleteOnTermination": true,
                                "AttachmentId": "eni-attach-********",
                                "AttachTime": "2016-04-02T13:07:20.000Z"
                            },
                            "Groups": [
                                {
                                    "GroupName": "SSH",
                                    "GroupId": "sg-********"
                                }
                            ],
                            "SubnetId": "subnet-********",
                            "OwnerId": "************",
                            "PrivateIpAddress": "10.0.0.10"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Placement": {
                        "Tenancy": "default",
                        "GroupName": "",
                        "AvailabilityZone": "ap-northeast-1a"
                    },
                    "Hypervisor": "xen",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "Status": "attached",
                                "DeleteOnTermination": true,
                                "VolumeId": "vol-********",
                                "AttachTime": "2016-04-02T13:07:20.000Z"
                            }
                        }
                    ],
                    "Architecture": "x86_64",
                    "RootDeviceType": "ebs",
                    "IamInstanceProfile": {
                        "Id": "A********************",
                        "Arn": "arn:aws:iam::************:instance-profile/redshift-role"
                    },
                    "RootDeviceName": "/dev/xvda",
                    "VirtualizationType": "hvm",
                    "AmiLaunchIndex": 0
                }
            ]
        }
    ]
}
```

## パブリックIPを確認

```bash:コマンド
PUBLIC_IP_ADDRESS=$(aws ec2 describe-instances \
    --instance-ids ${INSTANCE_ID} \
    --query Reservations[0].Instances[0].PublicIpAddress \
    --output text) \
    && echo ${PUBLIC_IP_ADDRESS}
```

```text:結果
**.**.**.**
```

以上