はじめに
最近よく耳にする IaC (Infrastructure as Code)であるCloudFormation を触る機会があったため、使用するにあたりベストプラクティスをまとめました。
CloudFormation概要
テンプレートを使用してAWSリソースの環境構築を行うサービスです。
テンプレート化しておけば、同じ環境構成を何度も作ることができます。
スタックとテンプレート
- テンプレート
- スタックを構成する AWS リソースの定義されたファイルをテンプレートと呼びます。
- スタック
IaCのメリットとデメリット
IaCのメリット
- 手動オペレーションによる人的ミスの削減
- 本番環境と同じ環境を手作業で作ると、ヒューマンエラーが起きるがIaCは確実に同じ構築ができる
- IaCをCl/CD化時に効果を発揮
- 不要なリソースができない
- 謎のEIPやSGなど
- 環境を即構築でき、工数削減
- 掃除が楽、作り直しが楽
- インフラ構築の手順書を作る現場だと、コンソール画面のuiは変更頻度が多いため、IaCで手順書を作成する方が手間が少ない
IaCのデメリット
- コード化するのに時間がかかる
- 部分的な修正でもテンプレートからスタックを作成して適用する必要があるため、手動で修正するよりも時間がかかる場合がある
- 理解が不十分だと意図せずリソースが削除される
ベストプラクティス
設計時、テンプレート作成時、運用時の観点からAWSのベストプラクティス等を参考にし、まとめます。
設計時
-
IaC使い方を設計時に決める
- 運用もIaCを使い続けるか、IaCを初期構築のみで使用するか
- 構築のみIaC:初期構築をIaCで構築し、その後は、プロジェクトごとにコンソールで構築
-
運用までIaC:設計だけでなくIaCのデプロイ方法まで考える(下記の1~3をするには、ハードル高い)
- IaCをgit管理し、プルリク時に複数人でチェックする
- IaCにCl/CDを導入し、自動デプロイ
- AWS環境をコンソールでリソースに対して、手動操作できないよう、IAMユーザー権限は、ReadOnlyにする。緊急時のみadmin権限使用する。
- 運用もIaCを使い続けるか、IaCを初期構築のみで使用するか
-
ライフサイクルと所有権を考慮し、スタックを整理する
テンプレート作成時
-
命名規則を決めておく
- スタック内のリソースの命名ルールを最初にちゃんと決めておく
-
「プロジェクト名 - AWSサービス名 - 環境名」
- 環境名は、prod や dev とつける
-
- スタック内のリソースの命名ルールを最初にちゃんと決めておく
-
複数環境を同じテンプレートで管理する
- 本番環境、開発環境など複数の環境を使用している場合に、環境ごとに別のテンプレートにせず、同じものを使うようにした方がします。
- テンプレートの数を減らして、管理が楽になります
- 同じテンプレートを使うことで、必ず同じ構築にすることができます。
- 本番環境、開発環境など複数の環境を使用している場合に、環境ごとに別のテンプレートにせず、同じものを使うようにした方がします。
-
ParameterやMappingを使用しすぎない
- 使いすぎると、実際にどのような設定がされているかテンプレートを見てもわからない
- 使用する判断基準
- Gitで管理しなくても運用上問題ない値であること
- 複数環境を1つのテンプレートで管理できるか
- OK:環境名やスペックをパラメータにすることで、本番環境、開発環境を1つのテンプレートで管理できる
- パラメータ入力値の制限をすると、なおよい。
AllowedValues: [ prod, stg, dev ]
- パラメータ入力値の制限をすると、なおよい。
- NG:RDSのスナップショットやメンテナンス時間は、プロジェクトによって変わることは考えくく、レビュー時に確認できた方がよいので固定値がよい。
- OK:環境名やスペックをパラメータにすることで、本番環境、開発環境を1つのテンプレートで管理できる
-
テンプレートを開発で役に立つツール
- VSCodeのプラグイン
-
cfn-lint
:CloudFormationの構文チェックツール
-
- Webサービス
-
former2
:作成済みのリソースからテンプレートが作成できるツール- IAMユーザーで認証情報とReadOnlyAccess権限必要
- former2はAWSで紹介されており、認証情報は、AWS APIのエンドポイント以外の外部サーバーには送信しない設計になっており安心
- Dockerでローカル環境でも実行可能
- IAMユーザーで認証情報とReadOnlyAccess権限必要
-
- VSCodeのプラグイン
テンプレート作成時に参考になる記事
運用時
-
スタック間のパラメーターの参照は、クロススタック参照を用いる
-
スタック間で機密情報の受け渡す場合、ダイナミック参照する
- パラメータを SSMのパラメータストア や Secrets Manager に出力し、スタックは、そこからパラメータを取得する
- 具体的な方法はこちら
-
スタックの更新は、 変更セット や ドリフト検出 を使用する
-
複数の環境に同時にスタックを作成する場合、Stack Setsを活用する
参考