🎉
TerraformでECS(Fargate)+ALBの構成を作る
前置き
client→ALB→ECSコンテナ(Fargate)
の構成をTerraform化しました。
構成図
main.tfを実行するとこちらの構成が出来上がります。
リポジトリ
tfファイルはこちら
ポイント
templatefile
タスク定義内で使用する設定をtemplatefile
で書くことで、main.tf
で定義した値を使用することが出来ます。
コンテナ名、コンテナイメージを定義し、
envs/dev/main.tf
module "app" {
source = "../../modules/app"
... 略 ...
container-name = "nginx"
container-image = "nginx:latest"
container_definitions.json
で使えるようにしています。
modules/app/container_definitions.json
[
{
"name": "${container-name}",
"image": "${container-image}",
ip
target_typeはターゲットグループのtarget_type
はFargateを使用する場合ip
とする必要があります。
ネットワークモードawsvpc
を使用しているためです。
modules/LB/main.tf
resource "aws_lb_target_group" "test_target_group" {
target_type = "ip"
}
ignore_changes
lifecycleのignore_changes
を使用し、タスク定義とタスク数の変化を無視します。
- 新リビジョンのタスク定義に更新される
- タスク数の変化に対応する
という理由からです。
modules/app/main.tf
resource "aws_ecs_service" "service" {
... 略 ...
lifecycle {
ignore_changes = [
task_definition,
desired_count,
]
}
課題
serviceの更新が手動
ignore_changes
を使っているため、terraform側でタスク定義を変更したら人力でServiceをアップデートする必要があります。
モジュールで変数が重複する
モジュールごとに変数を読み込んでしまっている。
共通化できないかね...
main.tf
module "network" {
source = "../../modules/network"
system_name = var.system_name #例えばこれ
... 略 ...
module "app" {
source = "../../modules/app"
system_name = var.system_name # 重複
参考
Discussion