AWSを使用した新規プロジェクトを始める上でまずやらなければいけないことは、VPCによるネットワーク設計です。
このテンプレートはこれまでの経験を元に作られたものです。作成にはCloudFormation
かterraform
のどちかで実行お願いします。terraform
を使ってVPC以外のAWSリソースも作成するならば、terraform
がよいと思います。terraform
に馴染みがない場合は、CloudFormation
を使用してください。どちらも同じ設計ができあがるので、どちらでも構いません。
以下に簡単にこのテンプレートの説明をします。
-
各リソースをわかりやすくネーミング
-
{project}-{vpc環境}-{リソース名}
- demo-develop-vpc
- demo-develop-front-subnet-1
- demo-develop-elb-sg
-
IPレンジをわかりやすいものにする
- 第2オクテットで環境が分かるようにする
- 10.0 => 本番
- 10.1 => ステージング
- 10.2 => 開発
- 第3オクテットでサブネットが分かるようにする
- 10,20 => front
- 30,40 => app
- 50,60 => backend
- 第3オクテットでAvailabilityZoneが分かるようにする
- 奇数 => ap-northeast-1b
- 偶数 => ap-northeast-1c
- 第2オクテットで環境が分かるようにする
-
3層サブネット構造(AWSのDDoS対策ホワイトペーパーでも推奨)
- フロントサブネット(DMZ)
- 用途:ELB、SSH bastionインスタンス、deployインスタンス
- アプリケーションサブネット(private)
- 用途:Web/Appインスタンス
- バックエンドサブネット(private)
- 用途:RDSインスタンス、ElastiCacheクラスター、Batchサーバ
- フロントサブネット(DMZ)
-
外部連携APIなどを考慮に入れて、NATを通じてインターネット外に出て行くルーティング
- 外部APIでは接続元のIPを制限することは少なくない
- AutoScalingでは接続元IPは固定できない
- privateサブネットのアプリケーションサブネットにWeb/Apサーバを配置してアウトバウンドはNATを経由するルーティングならば、提供元API業者にもNATのグローバルIPを伝えるだけでよい
-
NATの冗長化
- 本番環境では冗長化するためにそれぞれのAZに用意
- NATにはグローバルIPを付与する(ElasticIP)
- ElasticIPの上限はデフォルトは5つまでなので、プロジェクトでもっと必要な場合は上限申請
- 開発環境とステージング環境ではコスト削減のためシングル
VPCを作成する場合の、テンプレートを2つ用意しました。
- 本番環境用ベストプラクティステンプレート
- vpc-bestpractice-production.template
- 開発環境・ステージング環境用ベストプラクティステンプレート
- vpc-bestpractice.template
HashiCorpのTerraformを使って各環境のVPCを作成することができます。 Terraformについては、以下の参考リンクで確認お願いします。
他にもたくさん参考になりそうなページはありますので、探してみてください。
./
├── dev
│ ├── igw.tf
│ ├── providers.tf
│ ├── rt.tf
│ ├── rta.tf
│ ├── sg.tf
│ ├── sn.tf
│ ├── terraform.tfstate
│ ├── terraform.tfstate.backup
│ ├── terraform.tfvars
│ ├── variables.tf
│ └── vpc.tf
├── prod
│ ├── igw.tf
│ ├── providers.tf
│ ├── rt.tf
│ ├── rta.tf
│ ├── sg.tf
│ ├── sn.tf
│ ├── terraform.tfstate
│ ├── terraform.tfstate.backup
│ ├── terraform.tfvars
│ ├── variables.tf
│ └── vpc.tf
├── script.sh
└── stg
├── igw.tf
├── providers.tf
├── rt.tf
├── rta.tf
├── sg.tf
├── sn.tf
├── terraform.tfstate
├── terraform.tfstate.backup
├── terraform.tfvars
├── variables.tf
└── vpc.tf
実行はscript.sh
を使用します。
実行時にはスクリプトの引数に以下を追加してください。
- 環境名 (dev/prod/stg)
- 実行コマンド (terraformのコマンド)
- plan => dry-run
- apply => リソースの作成
- destroy => リソースの削除
- IAMのアクセスキー
- IAMのシークレットキー
./script.sh dev plan AKIxxxxx oooooo