[CloudFormation] CFnで環境作り完全版 Part1.5. 全体説明編
目次
Introduction
前回の記事から結構時間が空いてしまいました。Part1で終わらなくてよかったです。笑
実際にCloudFormation(以下CFn)で実際にリソースを作成する前に今回作成するAWSリソースの構成図とCFnの依存関係図をもとに何を構築するか説明していきたいと思います。
また、今回のCFnの設計はAWSのベストプラクティスから外れたものになります。その理由(言い訳)もついでに話していければなと思っています。
作成するAWSリソース
今回の「CFnで環境作り完全版」で作成する完成系のAWSリソース図になります。

ざっくりな概要は以下の通りです。
- ECSでサーバーで立てAutoScalingGroupでインスタンス数調整。スポットインスタンスも指定できる
- IAMのRoleはなるべく権限を絞って、CloudTrailなど最低限のセキュリティ監視は担保
- CloudFrontとALBはS3にアクセスログをECSのタスクのアプリケーションログはCloudWatchへ
- ECSのEC2にアクセスできるようにSessionManagerを設定
- GitHubのコードをデプロイできるようにCodePipelineでCICDを構築
他にもS3に保存したアクセスログを解析など他にもいろいろとやろうとするといっぱいあるのですが、書ききれないので今回は基本構成のみで最低限サービスとして動くまでを目標に作成しました。
DBやCacheがないとサービスとして無理あるだろみたいな反論は受け付けておりません。プラスで必要なリソースはその都度自身で追加していただくと幸いです。(タイトルが完全版って書いてあるのにすみません…)
CloudFormationの依存関係
先の述べておくと冒頭でも話した通り、今回のCFnの依存関係やファイル分割設計は、AWSのベストプラクティスから外れています。
保険をかけた上で、上記のAWSリソースをCloudFormationで作成した際の依存関係が以下の図になります。

Fn::ImportValue:
波線は、Parametersや直書きでのリソース指定による依存関係などを表しています。なぜこのような構成・依存関係になっているかというと、結論、わかりやすく説明したいためリソースごとにCFnを分けたいからです。
AWSのCFnのベストプラクティスでは以下のような記載があります→「ライフサイクルと所有権によるスタックの整理」。要は再作成や削除などを行う時にそのリソース群がスタックごとに分かれすぎていると管理が大変だから作成するリソースの塊ごとにスタック(CFn)を作成すると管理しやすいよってことです。
今回の記事で作成するCFnは、ロードバランサーはalb.yaml、ECSはecs-xxx.yamlとリソースごとに作成しているのですが、これだと新しいサーバーを構築するときに、またalb.yamlやecs-xxx.yamlを別でいっぱい流していくか、alb.yamlに追記しないといけないので既にあるスタックに影響が出てしまうと怖いよねってことです。
ただ繰り返しになりますが、今回はリソースごとにCFnで作成していきながら説明していくのでリソースごとのCFnで分割していきます。一部ImportValueでの循環参照やライフサイクルの関係でcf.yamlにroute53のリソースを記載していたりします。このことから既にリソースごとのCFn構成が崩壊していることがわかりますね 笑
CloudFormationの反映
最後にCFnのスタック反映について説明させてください。今回はCFnのファイルをAWSコンソールで手動で反映させます。
運用的に悪いことは承知しております。CFnの手動反映は、人間に反映を委ねているのでGitHubでCFnを管理していた場合、手動反映を忘れるとCFnのコードと実際のリソースに乖離が生じます。ベストはGithubに上げたタイミングでCFnをスタックに反映させる仕組みがあることです。ただ今回の趣旨とずれるので今回は手動で反映させ、なるべく初めてAWSに触れた人にも再現できるように、またCFnテンプレートの自分のメモ用に記載しました。
終わりに
今回は概要説明と言いながら言い訳をつらつらと書いてしまいました…
どのプロジェクトにも固執しない汎用的な構成にしたかったのでご了承ください。
CloudFormationのベストプラクティスや運用方法は、以下のクラスメソッドのYoutubeが参考になるかと思います。説明会というより座談会って感じですが
→ https://www.youtube.com/watch?v=SzrEG5BjnLM
以上でこの記事は終わりにしたいと思います。
次の記事から実際にリソースを作成していきたいと思います。