🪐

TerraformでEFS+ECS(Fargate)を試す

2023/06/01に公開

前置き

今回はECS(Fargate)+EFS環境をTerraformで試してみました。
Fargate上のnginxがEFSを利用できればOKです。

以前作成したこちらの構成に付け足していきたいと思います。

構成図

必要なterraformリソースを追加する

EFS

なんてことはありません、test-efsというEFSを作成するだけです。
もちろんマウントターゲット用SGの2049ポート開放は忘れないよう。

## EFS
resource "aws_security_group" "efs_sg" {
  name   = "${var.system_name}_${var.environment}_efs-sg"
  vpc_id = var.vpcid

  ingress {
    from_port = 2049
    to_port   = 2049
    protocol  = "tcp"
    cidr_blocks = [
      "${var.public1_cidr}",
      "${var.public2_cidr}"
    ]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "${var.system_name}_${var.environment}_efs-sg"
  }
}

resource "aws_efs_file_system" "efs" {
  tags = {
    Name = "test-efs"
  }
}

resource "aws_efs_mount_target" "efs_public1" {
  file_system_id  = aws_efs_file_system.efs.id
  subnet_id       = var.public1
  security_groups = [aws_security_group.efs_sg.id]
}

resource "aws_efs_mount_target" "efs_public2" {
  file_system_id  = aws_efs_file_system.efs.id
  subnet_id       = var.public2
  security_groups = [aws_security_group.efs_sg.id]
}

TaskDefinition(追加箇所のみ)

EFSに関する設定はefs_volume_configurationで行います。
今回はEFSの/nginx/index.htmlを使わせるため、このような指定にしています

resource "aws_ecs_task_definition" "app" {
  volume {
    name = "fargate-efs"
 
    efs_volume_configuration {
      file_system_id = var.efs_id
      root_directory = "/nginx"
    }
  }
}

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition#efs_volume_configuration

ContainerDefinition

コンテナ内のEFSマウントするパスを指定します。
nginx:latestusr/share/nginx/htmlにドキュメントルートがあるため、そこを指定
sourceVolumeaws_ecs_task_definitionで定義したボリューム名をつけます

[
    {
      "mountPoints": [
        {
            "containerPath": "/usr/share/nginx/html",
            "sourceVolume": "fargate-efs"
        }
      ],

index.html

<h1>test</h1>
<h2>nginx</h2>

デフォルトではないことが確認できればOK

apply

$ terraform plan
$ terraform apply

動作確認

OK!
複数タスクがある場合は、それぞれALBでアクセス出来ているはずなので
個別にログを確認する

参考

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html
https://beyondjapan.com/blog/2020/04/fargate-supported-efs/

Discussion