【AWS/GCP/VPC】2020年07月17日時点でVPC設計する時に気をつけること

現時点でVPC設計する時に注意したいことをいろんな資料を見ながら書いていこうと思います。

## 重要項目
- 単一もしくは複数？
- サブネットはAZ毎、ルーティング、管理特性で分離する
- パブリックサブネットは最低限にとどめる
- VPCのレンジはMediumくらいでどうでしょう？(自信ない。。。。)
- デフォルトネットワークを使用しない
- 明確な命名規則を使用する

### 注意事項
- 一度作成したVPCとサブネットはリサイズする事はできない
- 1つのサブネットが複数のAZをまたがることはできない

## 単一もしくは複数？
**アカウントとVPC、それぞれが単一なのか、それとも複数なのかを確認します**
複数のVPCを使用する場合は、VPC ピアリング接続なども検討に入り、使うサービスが若干変わってきたりするためです。
上記で書いているアカウントの概念は、GCPだとプロジェクトになりますかかね。
[いまさら、AWSのネットワーク設計](https://www.slideshare.net/serverworks/aws-121012921)
[VPC 設計のためのベスト プラクティスとリファレンス アーキテクチャ  \|  ソリューション  |  Google Cloud](https://cloud.google.com/solutions/best-practices-vpc-design?hl=ja#single-project-single-vpc)

## サブネットはAZ毎、ルーティング、管理特性で分離する
サブネットはAZごとに分割でき、ルーティングするごとに分けることができます。
例えば同じリージョン内で、EC2からRDSにトラフィックを飛ばすのであれば、別のサブネットを切るべきでしょう。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/c882913a-085b-a84e-dab6-5f3a42a7f4d9.png)
[いまさら、AWSのネットワーク設計](https://www.slideshare.net/serverworks/aws-121012921)　より引用

### 管理特性
ここでいう管理特性とは、**IPアドレスが増減するか、プライベートIPアドレスを指定できるか**の2つを指します。
この管理特性が異なるものについてもサブネットを分けます。イメージは上記図の通りです。
以下のサービスを念頭においてサブネットは分割します。

#### プライベートIPアドレスを指定できる
- EC2

#### プライベートIPアドレスを指定できない
- RDS
- NAT Gateway

#### IPアドレスが増減するサービス
- ELB
- AutoScaling(EC2)

[いまさら、AWSのネットワーク設計](https://www.slideshare.net/serverworks/aws-121012921)

## パブリックサブネットは最低限にとどめる
上記にように分割するとアプリケーションとDBはプライベートサブネットに入れて運用し、**インターネットに接続するのは最低限のサブネットにします。**
下記の例だと、インターネットに接続するのはロードバランサー(ELB)のみでそれ以外はプライベートサブネットになっています。**そのため下記のように、ロードバランサーだけがインターネットに接続できるようにして、残りはプラベートサブネットに所属させるのはベースになるのかなあと思っています。**またプライベートサブネットにおいて、インターネットに接続したい場合は、NATゲートウェイを利用します。

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/7fe4c361-ff21-0c8e-8150-69c6ba3a710a.png)
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/ec9e6865-aa26-1b64-bfc5-03f5008e03ba.png)
[AWSのネットワーク設計入門](https://d0.awsstatic.com/events/jp/2017/summit/slide/D2T3-5.pdf) より引用


## VPCのレンジはMediumくらいでどうでしょう？
自社プロダクトを開発するにあたっては、**Mediumくらいで良いのではと思っています。**
将来的にIPアドレススペースを余分に確保しておくことは重要とはわかっているのですが、そこを自分の中でまだ言語化できていません。なのではてなマークを書いています。

下記の記事で書かれている参考数値が非常に参考になります。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/971917cd-da22-9ef3-8c6f-130a651aae09.png)
[AWSネットワーク設計思想（VPC、サブネット）とベストプラクティス \| Tamanyan.me | たまにゃんのエンジニアブログ](https://tamanyan.me/aws-single-vpc-design/) より引用

### 役立つサイト
またIPアドレスの計算は下記サイトが役立ちます。
[192.168.0.0/21 を /24 でサブネット分割 - IPアドレス計算](https://www.ipkeisan.com/subnet/?nw=192.168.0.0&len=21&sub=24)

## デフォルトネットワークを使用しない
### 理由
- オンプレミス環境のネットワークに接続した際、IPが重複することがある
- サブネットに自分たちでつけた命名規則を運用することで、ネットワークの把握と保守が容易になる
- 自分たちで作成しているので、時にどのような設定になっているか明確

[VPC 設計のためのベスト プラクティスとリファレンス アーキテクチャ](https://cloud.google.com/solutions/best-practices-vpc-design?hl=ja#custom-mode)
[VPC ネットワークの概要  \|  Google Cloud](https://cloud.google.com/vpc/docs/vpc?hl=ja)

あとGCPだと、新しいリージョンが導入された時に、自動モードネットワークに新しいサブネットが自動的に作成されるようです。
アドレスの重複とか考えると、VPCを作成し、デフォルトを早めに削除した方が良さそうです。

## 明確な命名規則を使用する
実装してる時は気をつけるのに、VPCになるとなんとなくつけてしまっていることがありました。大いに反省。
ということで命名規則は気をつけたいところです。
下記の例はそのまま使えそうです。

>会社名: Acme Company: acmeco
ビジネス ユニット: 人事部: hr
アプリケーション コード: 給与システム: comp
リージョン コード: northamerica-northeast1: na-ne1、europe-west1: eu-we1
環境コード: dev、test、uat、stage、prod
[VPC 設計のためのベスト プラクティスとリファレンス アーキテクチャ](https://cloud.google.com/solutions/best-practices-vpc-design?hl=ja#naming) より引用

## その他参考になる記事
[設計サンプルで学ぶ、AWS構築の原則 - Webアプリ アーキテクチャのベストプラクティスを理解する - エンジニアHub｜若手Webエンジニアのキャリアを考える！](https://employment.en-japan.com/engineerhub/entry/2018/12/21/130000)
[AWSのネットワーク設計入門](https://d1.awsstatic.com/events/jp/2018/summit/tokyo/aws/07.pdf)
[AWSに関するありがちミスとその対策〜EC2、S3、RDS、Lambda、CloudFrontの場合 - エンジニアHub｜若手Webエンジニアのキャリアを考える！](https://employment.en-japan.com/engineerhub/entry/2018/07/17/110000)