AWS
CloudFormation

0. AWS Cloudformationで環境構築~ディレクトリ設計/スタックの単位~


対象の読者


  • 個人でサービスを作りたいけど、時間がない。でもちゃんとしたネットワークを作りたい人

  • 既存のサービスをcloudformationに乗せ変える為に勉強したい人

  • アプリケーションに集中したいのでネットワークは誰かのcloudformationを使って手っ取り早く使いたい人


使用しているサービス


  • api gateway

  • codebuild

  • codepipeline

  • alb

  • elasticbeanstalk

  • vpc

  • ec2(bastion-nat)

  • ecs

  • eip

  • sns

  • sam

  • route table

  • route53(public private)

  • lambda

  • cloudformation


Cloudformation化しているサービス


  • codebuild

  • codepipeline

  • alb

  • elasticbeanstalk

  • vpc

  • ec2(bastion-nat)

  • ecs

  • eip

  • route table

  • route53(public private)

  • lambda(sam)

  • cloudformation


ネットワーク構成

スクリーンショット 2019-03-04 23.16.10.png

※ 今回紹介するのは下記の図の左側とaws vpc常に構築されるecsのみ。


ディレクトリ構成

├── README.md

├── api
│   ├── deployment-pipeline.yml![Bad Request]()
![Bad Request]()

│   ├── eb.yml
│   ├── residential-map-template.yml
│   ├── route53.yml
│   └── main.yml
├── batch
│   ├── deployment-pipeline.yml
│   ├── eb.yml
│   ├── residential-map-template.yml
│   ├── route53.yml
│   └── main.yml
└── web
│ ├── deployment-pipeline.yml
│ ├── ecs-cluster.yml
│ ├── load-balancer.yml
│ ├── residential-map-template.yml
│ ├── route53.yml
│ ├── service.yml
│ └── main.yml
├── db.yml
├── delete.sh
├── route53.yml
├── run.sh
├── sg.yml
└── vpc.yml

実行順序は

vpc.yml


sg.yml

dns.yml

db.yml

batch/main.yml

api/main.yml

web/main.yml


Cloudformationはすべで一つのtemplateにして使用するべきが、部分的に使用するべきか

結論は、分けて管理する方がよかった。

全て一つのtemplateにして開発する場合のデメリット


  • stackの作成にはかなりの時間がかかるので原因の切り分けが難しい。

  • 一箇所で失敗すると全体がロールパックされてしまう。(かなり時間がかかってしまう。)

  • スコープが区切りにくい。一つのテンプレートで作成すると、重複を許さないように作る為にsg.ymlとかecs.ymlとかこだわってしまうと、どこに何が書いてあるのか見通しが悪くなる。(コレは個人的なものかも)

あるまとまりでスコープを区切って、あとはサービスごとにディレクトリを切って実行するのが良いのでは、というのが

このディレクトリ構成。

├── api/*

├── batch/*
└── web/*
├── db.yml
├── delete.sh
├── route53.yml
├── run.sh
├── sg.yml
└── vpc.yml

ただ、ちょっといただけないのが、一つのスタックが他のスタックに依存すると、そのスタック単体の更新ができないことがあります。

こんな感じです。

stack.png

次回vpcの作成に実際に使用している定義ファイルを詳しくいていきます。