[AWS]コマンドラインからVPCを作成してみよう！その２[AWSCLI]


社内の内職でVPC自動で作るスクリプト作ってたらいつの間にかかなり複雑な構成図を全消しするスクリプト作ることに・・・
想像の裏に破壊あり！・・・じゃないですけど、壊す前に作って確認しなきゃなんで結局全部CLIで作ることになるかなーと思って＼(＞ヮ＜)／って感じになってます。

###まあ、それはそれで面白いからいいんですけどね。

---

[前回の記事](http://qiita.com/Yuki_BB3/items/42efe6f2e6d881c4ace6)の続きからです。
**作りたい構成**
![150713-0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/3aff0c81-08bb-fb39-d216-8a486ae2632b.jpeg "150713-0002.jpg")

**前回できた構成**
![150713-0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/91b27c91-220b-7038-7de4-96bb2ed5f81a.jpeg "150713-0003.jpg")




**今回のやること**
1. サブネットの作成
2. 通信をIGWに向ける


インスタンスを立てる手前までやっていきましょう！




## 1.サブネットの作成
###[create-subnet]コマンド
|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------|:------------|
| --vpc-id     | VPCを指定する　| vpc-XXXXXXXX |
| --cidr-block | サブネットのCIDR　| 10.0.0.0/24 など |
| --availability-zone | サブネットを所属させるAZ | ap-northeast-1aなど|

所属させるVPCを指定し、IPの範囲を設定したら、どのAZに所属させるかを決めます。
コマンドで見ると難しそうですけど、いつもマネジメントコンソールでやってる操作なんですよねー

```bash:サンプル
aws ec2 create-subnet --vpc-id vpc-XXXXXXXX --cidr-block 10.0.1.0/24

```
idとcidrを適宜修正し、サンプルを実行してください。
指定したVPCにサブネットが作成されたはずです。
コマンドの実行結果として以下の表示が得られます。

```json:表示

{
    "Subnet": {
        "VpcId": "vpc-xxxxxxxx", 
        "CidrBlock": "10.0.1.0/24", 
        "State": "pending", 
        "AvailabilityZone": "ap-northeast-1c", 
        "SubnetId": "subnet-xxxxxxxx", 
        "AvailableIpAddressCount": 251
    }
}


```

##2. 通信をIGWに向ける

このコマンドを使って、VPCを作成した際に一緒に作られたルートテーブルを作成します。

**そ　の　ま　え　に**　

サンプルをコマンドラインで実行してください

```bash:サンプル
aws ec2 describe-route-tables
```

```json:表示

{
    "RouteTables": [
        {
            "Associations": [
                {
                    "RouteTableAssociationId": "rtbassoc-xxxxxxxx", 
                    "Main": true, 
                    "RouteTableId": "rtb-xxxxxxxx"
                }
            ], 
            "RouteTableId": "rtb-xxxxxxxx", 
            "VpcId": "vpc-xxxxxxxx", 
            "PropagatingVgws": [], 
            "Tags": [], 
            "Routes": [
                {
                    "GatewayId": "local", 
                    "DestinationCidrBlock": "172.31.0.0/16", 
                    "State": "active", 
                    "Origin": "CreateRouteTable"
                }, 
                {
                    "GatewayId": "igw-xxxxxxxx", 
                    "DestinationCidrBlock": "0.0.0.0/0", 
                    "State": "active", 
                    "Origin": "CreateRoute"
                }
            ]
        }, 
        {
            "Associations": [
                {
                    "RouteTableAssociationId": "rtbassoc-aaaaaaaa", 
                    "Main": true, 
                    "RouteTableId": "rtb-aaaaaaaa"
                }
            ], 
            "RouteTableId": "rtb-aaaaaaaa", 
            "VpcId": "vpc-aaaaaaaa", 
            "PropagatingVgws": [], 
            "Tags": [], 
            "Routes": [
                {
                    "GatewayId": "local", 
                    "DestinationCidrBlock": "10.0.0.0/16", 
                    "State": "active", 
                    "Origin": "CreateRouteTable"
                }
            ]
        }
    ]
}

```

こんな感じでよく分からない表示が出力されると思います。
これは存在するルートテーブルの情報をJSONで出力した結果です。
このままだとなんだかよく分からないので必要な情報だけ取得してみましょう。

```bash:サンプル
aws ec2 describe-route-tables --filters
```

フィルターオプションを使います。
フィルターはName,Valueの組み合わせで取得しますが、
####JSONで返ってくる名前と違うので注意してください！
> aws ec2 describe-route-tables help

で詳細を取得できるので確認してくださいね。

```bash:サンプル
aws ec2 describe-route-tables --filters Name=vpc-id,Values=vpc-xxxxxxxx

```
```json:表示

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

```

何個も出ていて見にくかったですが、このくらいならなんとかなりますね。
「RouteTableId」がルートテーブルのIDです。
こんな感じでマネジメントコンソールを使わなくても欲しい情報は手に入れることができるのでできるだけ頑張ってみましょう。


--

ちなみに、jqを利用できる環境であれば以下のコマンドでルートテーブルの値だけを取得することもできます。
jqに関してはまた別途書いていきたいと思います。

```bash:サンプル
aws ec2 describe-route-tables | jq -r '.RouteTables[] | select(.VpcId=="vpc-xxxxxxxx").RouteTableId'

```
```bash:表示
rtb-xxxxxxxx

```
jqは勉強中ですが、非常に便利なので皆さんもぜひ使ってみてください。
話題が逸れました。

---
###[create-route-table]コマンド
ルートテーブルを作成します。
さっき既存のルートテーブルのIDとか取りましたが勉強なので作ってみましょう。
指定するオプションはVPCのIDくらいです。
成功すると下の結果が表示されます。

```bash:サンプル
aws ec2 create-route-table --vpc-id vpc-xxxxxxxx
```
```json:表示
{
    "RouteTable": {
        "Associations": [], 
        "RouteTableId": "rtb-xxxxxxxx", 
        "VpcId": "vpc-xxxxxxxx", 
        "PropagatingVgws": [], 
        "Tags": [], 
        "Routes": [
            {
                "GatewayId": "local", 
                "DestinationCidrBlock": "10.0.0.0/16", 
                "State": "active", 
                "Origin": "CreateRouteTable"
            }
        ]
    }
}
```


これで指定のVPCにルートテーブルを作成できます。
RouteTableIdを控えておきましょう。

---

###[associate-route-table]コマンド
ルートテーブルとサブネットの紐付けを行います。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------|:------------|
| --route-table-id | ルートテーブルID | rtb-xxxxxxxx |　
| --subnet-id | サブネットのID　| subnet-xxxxxxxx |

```bash:サンプル
aws ec2 associate-route-table --route-table-id rtb-xxxxxxxx --subnet-id subnet-xxxxxxxx
```
```json:表示
{
    "AssociationId": "rtbassoc-xxxxxxxx"
}
```

---

###[create-route]コマンド
ルートテーブルには何の設定もしていないので通信がIGWに向くように設定をしてあげます。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------|:------------|
| --route-table-id | 設定を行うルートテーブルの指定 | rtb-xxxxxxxx |
| --destination-cidr-block | トラフィックの向ける先を指定 | 0.0.0.0/0で全てのトラフィックの意 |
| --gateway-id | トラフィックを向ける先のIGWを指定します | igw-XXXXXXXX |


今回は全てのトラフィックをIGWに向けたいので0.0.0.0/0(全てのトラフィック)としています。
マネジメントコンソールでやる時と一緒です。

```bash:サンプル
aws ec2 create-route --route-table-id rtb-xxxxxxxx --destination-cidr-block 0.0.0.0/0 --gateway-id igw-XXXXXXXX
```


成功しても特に何も帰ってきません。

###[associate-route-table]コマンド
作成したルートテーブルをサブネットに関連付けます。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------:|:------------|
| --route-table-id | ルートテーブルID | rtb-xxxxxxxx |　
| --subnet-id | サブネットのID　| subnet-xxxxxxxx |

```bash:サンプル
aws ec2 associate-route-table --route-table-id rtb-xxxxxxxx --subnet-id subnet-xxxxxxxx

```

アタッチ予定のルートテーブルとアタッチ先のサブネットをオプションで指定してあげれば紐付けることができます。

前回と今回でVPCを使う準備ができました。
次回はセキュリティグループの設定やEC2を立てるところをやっていきたいと思います。