前回の記事で「TerraformでAWSリソースをデプロイしてみる」を書きましたが、内容としては単にデプロイを目指すところまでの内容でした。なのでこの記事ではもう一歩踏み込んだ、Terraform環境を構築したところから、実際にコードを書き始める前に準備すべき(知っておくべき)ことを書いていきます
tfstateファイルの配置場所
Terraformではデプロイ時にこのtfstateファイルにデプロイの情報を記録しています。なので、複数人でデプロイする場合に個別で(ローカル)このファイルをもってしまうと、デプロイに不整合が起こります。そのため、複数人でデプロイをする場合は必ずこのtfstateファイルをS3に配置しましょう。
配置方法
①S3にバケットをバージョニングありで作成します。
②tfstate.tfを作成し、以下を記述します。
terraform {
backend "s3" {
bucket = "①で作成したバケット名-アカウントID"
key = "terraform.tfstate"
region = "ap-northeast-1"
profile = "AWSプロファイル名"
}
}
③terraform initを実行します。
terraform init
provider.tf
変数はこのファイルにかいてあげましょう。アカウント番号や環境名、VPCのCIDRあたりを中心にかいてあげるとよいです。
変数の記述(provider.tf)
locals{
env = "環境名"
account-id = "アカウントID"
}
iamrole.tf
resource "aws_iam_role" "IAMロール名" {
name = "${local.env}-IAMロール名"
}
jsonへの受け渡し(iampolicy.tf)
.tf→jsonへの受け渡しが可能です。こっちのパターンの方がよく使う印象です。
policy = templatefile("ディレクイトリ名/ポリシー名.json",{account-id ="${local.account-id}"})
モジュール間の値受け渡し(output.tf)
Terraformはソースコードをモジュール化(テンプレート化)させることができます。VPCIDなど一度生成しないと判別できない値を他モジュールに受け渡しをする場合にこの手法を使います。
output "vpcid" {
value = "${aws_vpc.vpc01.id}"
}
※モジュール参考
SecurityGroup.tf
vpc_id = aws_vpc.vpc01.id
ディレクトリ構造
実際にコーディングしてみないとわからない部分かと思いますが、プロジェクトの規模感からできる限り見通しをたてておくと良いです。このディレクトリ構造に関しては、自分なりに考えたり勉強したり経験したりして常にベストプラクティスを追求する必要がありそうです。
リソースごとのディレクトリ
環境の規模からくる記述量によります。小さい環境(=コード量が少ない)ならリソースごとのディレクトリは作成しなくてよいですが、セキュリティグループなど、コードが冗長になりやすいリソースは個別にディレクトリをきった方がコーディングしやすくなります。デプロイの時間短縮や個別化という意味でも役に立つ手法です。
また、ポリシーなどが記載されるjsonは増えやすいファイルなので、基本ディレクトリ切る前提で考えてよいです。
環境ごとのディレクトリ
具体的位には本番、ステージング、開発環境などの環境分をどうするかというところですが、 各環境に対してディレクトリをきるが一番安定かなと思います。変数が完璧に整えられ、各環境でコードが同一になるのであれば、新たにディレクトリは切らずに変数だけを変えるという選択肢もありますが、実際それで成立するケースは少ないだろうというのが理由です。
※こちらは以下の記事が参考になりました