#1 AWS CLIでVPCを構築する

# はじめに
AWS CLIでVPCを構築する手順です。構成図は以下の通りです。
![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501605/d9576fe1-4571-47a4-ee8d-3ddcb97dbdc2.png)

# 手順
以下の流れで環境を構築します。
* VPCの作成
* サブネットの作成
* SGの作成
* ルートテーブルの作成
* ルートテーブルのアタッチ
* IGWの作成
* IGWのアタッチ
* ルートテーブルの編集


## 1.VPCの作成
### 設定値の指定
```
#VPCのタグ設定
EC2_VPC_TAG_NAME='handson-test'
#VPCのアドレス指定
EC2_VPC_CIDR='10.0.0.0/16'
```
設定値を確認します。
```
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"handson-test"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_VPC_CIDR:"10.0.0.0/16"
       EC2_VPC_CIDR="${EC2_VPC_CIDR}"

END
```
### 処理の実行
* タグ文字列の生成は
`ResourceType=vpc,Tags=[{Key=Name,Value=<指定した設定値>}]`とします。
* VPCの作成は
`create-vpc`コマンド
`--cidr-brock`　`--tag-specifications`オプションを使います。
```
#タグ文字列の生成
string_ec2_vpc_tag="ResourceType=vpc,Tags=[{Key=Name,Value=${EC2_VPC_TAG_NAME}}]" \
   && echo ${string_ec2_vpc_tag}

#VPCの作成（変数の確認）
cat << END
 
   # EC2_VPC_CIDR:"10.0.0.0/16"
     EC2_VPC_CIDR="${EC2_VPC_CIDR}"
   # string_ec2_vpc_tag:"ResourceType=vpc,Tags=[{Key=Name,Value=handson-test}]"
     string_ec2_vpc_tag="${string_ec2_vpc_tag}"
 
END

#VPCの作成
aws ec2 create-vpc \
  --cidr-block ${EC2_VPC_CIDR} \
  --tag-specifications ${string_ec2_vpc_tag}

```
出力例
```
{
    "Vpc": {
        "CidrBlock": "10.0.0.0/16",
        "DhcpOptionsId": "dopt-xxxxxxxx",
        "State": "pending",
        "VpcId": "vpc-xxxxxxxx",
        "OwnerId": "xxxxxxxx",
        "InstanceTenancy": "default",
        "Ipv6CidrBlockAssociationSet": [],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-xxxxxxxx",
                "CidrBlock": "10.0.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "IsDefault": false,
        "Tags": [
            {
                "Key": "Name",
                "Value": "handson-test"
            }
        ]
    }
}
```
### 作業後の確認
* `describe-vpcs`コマンドで確認します。
オプション指定により、出力結果を絞り込みます。
* `--filters` `--query`でリソースをフィルタリングします。
* `--output`でコマンド出力の書式設定スタイルを決めます。
[【参考：コマンドリファレンス】](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpcs.html)
```
#作成したVPCの確認
aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME} \
  --query 'Vpcs[].Tags[?Key == `Name`].Value' \
  --output text
```

```
#作成したVPCのCIDR確認
aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME} \
  --query "Vpcs[].CidrBlock" \
  --output text
```

## 2.サブネットの作成
4つのサブネットを作成します。手順は例として、`10.0.2.0/24`のサブネットを作成しています。
### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#VPCのタグ名
EC2_VPC_TAG_NAME='handson-test'

#サブネットのタグ名
EC2_SUBNET_TAG_NAME='handson-test-private-1'

#アドレスレンジ
EC2_SUBNET_CIDR='10.0.2.0/24'

#サブネットの配置AZ
EC2_AZ_CODE="a"

EC2_AZ_NAME="${AWS_DEFAULT_REGION}${EC2_AZ_CODE}" \
  && echo ${EC2_AZ_NAME}
```
    
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_VPC_TAG_NAME:"handson-test"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_SUBNET_TAG_NAME:"handson-test-private-1"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"
  # 3. EC2_SUBNET_CIDR:"10.0.2.0/24"
       EC2_SUBNET_CIDR="${EC2_SUBNET_CIDR}"
  # 4. EC2_AZ_NAME:"ap-northeast-1a"
       EC2_AZ_NAME="${EC2_AZ_NAME}"

END
```
### 処理の実行
* `create-subnet`コマンドを使います。
オプションを指定し、出力結果を絞り込みます。
* `--tag-specifications`でリソース作成時にタグを生成します。
```
#VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

#タグ文字列の生成
STRING_EC2_SUBNET_TAG="ResourceType=subnet,Tags=[{Key=Name,Value=${EC2_SUBNET_TAG_NAME}}]" \
  && echo ${STRING_EC2_SUBNET_TAG}

#サブネットの作成（変数の確認）
cat << END

  # EC2_VPC_ID:"vpc-xxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # EC2_SUBNET_CIDR:"10.0.2.0/24"
    EC2_SUBNET_CIDR="${EC2_SUBNET_CIDR}"
  # EC2_AZ_NAME:"ap-northeast-1a"
    EC2_AZ_NAME="${EC2_AZ_NAME}"
  # STRING_EC2_SUBNET_TAG:"ResourceType=subnet,Tags=[{Key=Name,Value=handson-test-private-1}]"
    STRING_EC2_SUBNET_TAG="${STRING_EC2_SUBNET_TAG}"

END

#サブネットの作成
aws ec2 create-subnet \
  --vpc-id ${EC2_VPC_ID} \
  --cidr-block ${EC2_SUBNET_CIDR} \
  --availability-zone ${EC2_AZ_NAME} \
  --tag-specifications ${STRING_EC2_SUBNET_TAG}
```
出力例
```
{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-1a",
        "AvailabilityZoneId": "apne1-az4",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.2.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-xxxxxxxx",
        "VpcId": "vpc-xxxxxxxx",
        "OwnerId": "xxxxxxxx",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "handson-test-private-1"
            }
        ],
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:xxxxxxxx:subnet/subnet-xxxxxxxx",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}
```

### 作業後の確認
* `describe-subnets`で確認します。
* それぞれ`--query`オプションで絞り込むことで、`タグ名` `サブネット範囲` `AZ名`を出力します。
```
aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query 'Subnets[].Tags[?Key == `Name`].Value' \
  --output text
  
  
aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query "Subnets[].CidrBlock" \
  --output text
  
  
aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query "Subnets[].AvailabilityZone" \
  --output text
```

## 3.セキュリティグループの作成
WEB用、DB用、ELB用の合計3つのセキュリティグループを作成します。

### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#VPCのタグ名
EC2_VPC_TAG_NAME='handson-test'

#SG名
EC2_SECURITY_GROUP_NAME='handson-cli-db-sg'

#SGの説明
EC2_SECURITY_GROUP_DESCRIPTION='handson-cli-db-SecurityGroup.'
```
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_VPC_TAG_NAME:"handson-test"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_SECURITY_GROUP_NAME:"handson-cli-db-sg"
       EC2_SECURITY_GROUP_NAME="${EC2_SECURITY_GROUP_NAME}"
  # 3. EC2_SECURITY_GROUP_DESCRIPTION:"handson-cli-db-SecurityGroup."
       EC2_SECURITY_GROUP_DESCRIPTION="${EC2_SECURITY_GROUP_DESCRIPTION}"

END
```
### 処理の実行
* `create-security-group`を使います。
```
#VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

#ここまでの設定値の確認
cat << END

  # EC2_SECURITY_GROUP_NAME:"handson-cli-db-sg"
    EC2_SECURITY_GROUP_NAME="${EC2_SECURITY_GROUP_NAME}"
  # EC2_SECURITY_GROUP_DESCRIPTION:"handson-cli-db- SecurityGroup."
    EC2_SECURITY_GROUP_DESCRIPTION="${EC2_SECURITY_GROUP_DESCRIPTION}"
  # EC2_VPC_ID:"vpc-xxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"

END

#SGの作成
aws ec2 create-security-group \
  --group-name ${EC2_SECURITY_GROUP_NAME} \
  --description "${EC2_SECURITY_GROUP_DESCRIPTION}" \
  --vpc-id ${EC2_VPC_ID}
```
### 作業後の確認
* `describe-security-groups`で確認します。
* 先程と同様、`filter` `query`で情報を絞りこみ、`output`で出力形式を決めます。
```
aws ec2 describe-security-groups \
  --filter Name=vpc-id,Values=${EC2_VPC_ID} \
    Name=group-name,Values=${EC2_SECURITY_GROUP_NAME} \
  --query 'SecurityGroups[].GroupName' \
  --output text
```

### ルールの追加
* `aws ec2 authorize-security-group-ingress`で、ルールを追加します。
* `パブリックサブネット`、`プライベートサブネット`、`ELB`の3つに割り当てる、それぞれのSGにルールを追加する手順を記載しています。

```
#ルールの追加(WEB)
aws ec2 authorize-security-group-ingress --group-id sg-xxxx --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-xxxx --protocol tcp --port 80 --cidr 0.0.0.0/0

#ルールの追加(DB)
aws ec2 authorize-security-group-ingress --group-id sg-xxxx --protocol tcp --port 3306 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-xxxx --protocol tcp --port 80 --cidr 0.0.0.0/0

#ルールの追加(ELB)
aws ec2 authorize-security-group-ingress --group-id sg-xxxx --protocol tcp --port 80 --cidr 0.0.0.0/0

```

## 4.ルートテーブルの作成
### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#VPCのタグ名
EC2_VPC_TAG_NAME='handson-test'

#ルートテーブルのタグ名
EC2_ROUTE_TABLE_TAG_NAME='handson-test-private-routetable'

```
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_VPC_TAG_NAME:"handson-test"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"handson-test-private-routetable"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"

END
```

### 処理の実行
* `create-route-table`を使います。
```
#VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

#タグ文字列の生成
STRING_EC2_ROUTE_TABLE_TAG="ResourceType=route-table,Tags=[{Key=Name,Value=${EC2_ROUTE_TABLE_TAG_NAME}}]" \
  && echo ${STRING_EC2_ROUTE_TABLE_TAG}

#ルートテーブルの作成（変数の確認）
cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # STRING_EC2_ROUTE_TABLE_TAG:"ResourceType=route-table,Tags=[{Key=Name,Value=handson-test-private-routetable}]"
    STRING_EC2_ROUTE_TABLE_TAG="${STRING_EC2_ROUTE_TABLE_TAG}"

END

#ルートテーブルの作成
aws ec2 create-route-table \
  --vpc-id ${EC2_VPC_ID} \
  --tag-specifications ${STRING_EC2_ROUTE_TABLE_TAG}
```

### 作業後の確認
* `aws ec2 describe-route-tables`で確認します。
```
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Tags[?Key == \`Name\`].Value" \
  --output text
```

## 5.ルートテーブルのアタッチ
### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#VPCのタグ名
EC2_VPC_TAG_NAME='handson-test'

#ルートテーブルのタグ名
EC2_ROUTE_TABLE_TAG_NAME='handson-test-private-routetable'

#関連付けたいサブネットのタグ名
EC2_SUBNET_TAG_NAME='handson-test-private-2'
```
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_VPC_TAG_NAME:"handson-test"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"handson-test-public-routetable"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"
  # 3. EC2_SUBNET_TAG_NAME:"handson-test-public-1"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"

END
```

### 処理の実行
* `associate-route-table`を使います。
* オプションで`--subnet-id` `--route-table-id`を指定します。
```
#VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

#ルートテーブルIDの取得
EC2_ROUTE_TABLE_ID=$( \
  aws ec2 describe-route-tables \
    --filters Name=vpc-id,Values=${EC2_VPC_ID} \
              Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
    --query "RouteTables[].RouteTableId" \
    --output text \
) \
  && echo ${EC2_ROUTE_TABLE_ID}

#サブネットIDの取得
EC2_SUBNET_ID=$( \
  aws ec2 describe-subnets \
    --filters Name=vpc-id,Values=${EC2_VPC_ID} \
              Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
    --query "Subnets[].SubnetId" \
    --output text \
) \
  && echo ${EC2_SUBNET_ID}

#テーブルとサブネットの関連付け(変数の確認)
cat << END

  # EC2_SUBNET_ID:"subnet-xxxxxxxxxxxxxxxxx"
    EC2_SUBNET_ID="${EC2_SUBNET_ID}"
  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="${EC2_ROUTE_TABLE_ID}"

END

#テーブルとサブネットの関連付け
aws ec2 associate-route-table \
  --subnet-id ${EC2_SUBNET_ID} \
  --route-table-id ${EC2_ROUTE_TABLE_ID}
```
### 完了確認
* `aws ec2 describe-route-table`で確認します。
```
aws ec2 describe-route-tables \
  --route-table-ids ${EC2_ROUTE_TABLE_ID} \
  --query "RouteTables[].Associations[?SubnetId == \`${EC2_SUBNET_ID}\`].RouteTableAssociationId" \
  --output text
```

## 6.インターネットゲートウェイの作成
### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#IGWのタグ名
EC2_INTERNET_GATEWAY_TAG_NAME='handson-test-igw'
```
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_INTERNET_GATEWAY_TAG_NAME:"handson-test-igw"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END
```
### 処理の実行
* `create-internet-gateway`を使います。
* オプションで`--tag-specifications`を入力し、タグを作成します。
```
#変数の設定
STRING_EC2_INTERNET_GATEWAY_TAG="ResourceType=internet-gateway,Tags=[{Key=Name,Value=${EC2_INTERNET_GATEWAY_TAG_NAME}}]" \
  && echo ${STRING_EC2_INTERNET_GATEWAY_TAG}


#IGWの作成（変数の確認）
cat << END

  # STRING_EC2_INTERNET_GATEWAY_TAG:"ResourceType=internet-gateway,Tags=[{Key=Name,Value=handson-cli-igw}]"
    STRING_EC2_INTERNET_GATEWAY_TAG="${STRING_EC2_INTERNET_GATEWAY_TAG}"

END

#IGWの作成
aws ec2 create-internet-gateway \
  --tag-specifications ${STRING_EC2_INTERNET_GATEWAY_TAG}
```

### 完了確認
* `aws ec2 describe-internet-gateways`で確認します。
```
aws ec2 describe-internet-gateways \
  --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}  \
  --query "InternetGateways[].Tags[].Value" \
  --output text

```

## 7.インターネットゲートウェイのアタッチ
### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#VPCタグ名
EC2_VPC_TAG_NAME='handson-test'

#IGWタグ名
EC2_INTERNET_GATEWAY_TAG_NAME='handson-test-igw'

```
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_VPC_TAG_NAME:"handson-test-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_INTERNET_GATEWAY_TAG_NAME:"handson-test-igw"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END
```
### 処理の実行
* `attach-internet-gateway`を使います。
* オプションで`--vpc-id` `--internet-gateway-id`を指定します。
```
#VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

#IGWのID取得
EC2_INTERNET_GATEWAY_ID=$( \
  aws ec2 describe-internet-gateways \
    --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \
    --query "InternetGateways[].InternetGatewayId" \
    --output text \
) \
  && echo ${EC2_INTERNET_GATEWAY_ID}

#アタッチ（変数の確認）
cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="${EC2_INTERNET_GATEWAY_ID}"

END

#アタッチ
aws ec2 attach-internet-gateway \
  --vpc-id ${EC2_VPC_ID} \
  --internet-gateway-id ${EC2_INTERNET_GATEWAY_ID}

```
### 作業後の確認
* `aws ec2 describe-internet-gateways`で確認します。
```
aws ec2 describe-internet-gateways \
  --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}  \
  --query "InternetGateways[].Attachments[?VpcId == \`${EC2_VPC_ID}\`].VpcId" \
  --output text
```

## 8.ルートテーブルの編集
### 設定値の指定
```
#リージョンの指定
export AWS_DEFAULT_REGION='ap-northeast-1'

#VPCタグ名
EC2_VPC_TAG_NAME='handson-test'

#ルートテーブルのタグ名
EC2_ROUTE_TABLE_TAG_NAME='handson-test-public-routetable'

#宛先アドレス
EC2_ROUTE_DESTINATION_CIDR='0.0.0.0/0'

#IGWのタグ名
EC2_INTERNET_GATEWAY_TAG_NAME='handson-test-igw'

```
設定値を確認します。
```
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_VPC_TAG_NAME:"handson-cli-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"handson-cli-public-routetable"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"
  # 3. EC2_ROUTE_DESTINATION_CIDR:"0.0.0.0/0"
       EC2_ROUTE_DESTINATION_CIDR="${EC2_ROUTE_DESTINATION_CIDR}"
  # 4. EC2_INTERNET_GATEWAY_TAG_NAME:"handson-cli-igw"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END
```

### 処理の実行
* `create-route`を使います。
* `--route-table-id`でルートテーブルを指定します。
* `--destination-cidr-block`今回は編集で宛先として`0.0.0.0/0`を設定しています。
* `--gateway-id`インターネットゲートウェイを指定します。
```
#VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

#ルートテーブルのID取得
EC2_ROUTE_TABLE_ID=$( \
  aws ec2 describe-route-tables \
    --filters Name=vpc-id,Values=${EC2_VPC_ID} \
              Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
    --query "RouteTables[].RouteTableId" \
    --output text \
) \
  && echo ${EC2_ROUTE_TABLE_ID}

#IGWのID取得
EC2_INTERNET_GATEWAY_ID=$( \
  aws ec2 describe-internet-gateways \
    --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \
    --query "InternetGateways[].InternetGatewayId" \
    --output text \
) \
  && echo ${EC2_INTERNET_GATEWAY_ID}

#ルートの作成（変数の確認）
cat << END

  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="${EC2_ROUTE_TABLE_ID}"
  # EC2_ROUTE_DESTINATION_CIDR:"0.0.0.0/0"
    EC2_ROUTE_DESTINATION_CIDR="${EC2_ROUTE_DESTINATION_CIDR}"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="${EC2_INTERNET_GATEWAY_ID}"

END

#ルートの作成
aws ec2 create-route \
  --route-table-id ${EC2_ROUTE_TABLE_ID} \
  --destination-cidr-block ${EC2_ROUTE_DESTINATION_CIDR} \
  --gateway-id ${EC2_INTERNET_GATEWAY_ID}

```
### 完了確認
* `aws ec2 describe-route-tables`　`aws ec2 describe-route-tables`で確認します。
```
#ルートが存在することを確認
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].DestinationCidrBlock" \
  --output text

#ルートがIGWに設定されていることを確認
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].GatewayId" \
  --output text

```
# 参考ドキュメント
* [AWS CLI を使用して VPC を作成する](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/create-vpc.html#create-vpc-cli)
* [AWS CLI Command Reference](https://docs.aws.amazon.com/ja_jp/cli/latest/index.html)
* [【初心者向け】AWS CLIリファレンスを読むときのコツ](https://dev.classmethod.jp/articles/beginners-howtoread-awscli/)

# #2 EC2の作成に進む
* [AWS CLIでスケーラブルウェブサイトを構築する](https://qiita.com/kokichi8/items/fedb84896a286b70cc23)
* [#2 AWS CLIでEC2を作成する](https://qiita.com/kokichi8/items/20d52fb266677f0e88f3)