前提
全体の概略はこちらから
このページの概略
Terraform とClloudFormationによるImportで既存のインフラをIaC化する際の設計思想等々を記載します。
Terraform, CloudFormation共通
for_eacの採用
このように
- NoProdアカウントにはdev, test, stage環境のリソースがある
- Prodアカウントにはprod環境のリソースがある
- 高価なリソースや一部のリソースは
- NoProdアカウントにdev, test, stage環境を兼ねるリソースがある
- Prodアカウントにprod環境のリソースがある
加えて、
- dev, test, stage, prod環境がすべて同じコードで構築される
- コードを格納しているフォルダとAWSアカウントの対応が分かりやすくする
- (terraformに限りますが)tfstateファイルとAWSアカウントが1:1対応する
という条件を満たすため、環境ごとにfor_eachによるリソースの繰り返しを用いて対応しています。
環境の差分はmain.tf(ルートスタック)のみに記載されるようにする
上記に加えて、他プロジェクトへの転用も用意し塗るべく、AWSアカウント後ごとに分けたmain.tfとvariable.tfにのみ環境差分(リソース名, etc)が記載されるように設定しました。
※cloudformationのばあいはルートスタック
CloudFormationの注意点
一部リソースが対応していない
こちらの公式Doc.でImportしたいリソースが対応しているのか要確認です。
import時のリソースIDの種類と取得
コンソールからimportを行う場合、リソースの識別子を入力する必要があります。必要な識別子はARN, リソース名とまちまちなため要確認です。
さらにSubnetとRouteTableの関連付けIDなどはコンソールに表示されないため、aws-cliで確認が必要になります。
ネスト化された子スタックにImportは不可!
こちらの公式Doc.に以下の記載があり、3階層以上のネスト化されたスタックにImportするのは不可なようです
AWS CloudFormation は、resource import を使用して 1 つのレベルのネスト化のみをサポートします。つまり、子スタックにスタックをインポートしたり、子を持つスタックをインポートしたりすることはできません。