🪐
TerraformでEFS+ECS(Fargate)を試す
前置き
今回は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"
}
}
}
ContainerDefinition
コンテナ内のEFSマウントするパスを指定します。
nginx:latest
はusr/share/nginx/html
にドキュメントルートがあるため、そこを指定
sourceVolume
はaws_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でアクセス出来ているはずなので
個別にログを確認する
参考
Discussion