はじめに
本記事では、ECSタスクにEFS(Elastic File System)をマウントし、非rootユーザーで操作できるように設定する方法を紹介します。特に、EFSアクセスポイントを活用して、実行ユーザーを www-data
とし、特定のディレクトリをマウント先とする構成をTerraformで管理します。
要件
- コンテナの実行ユーザーは
www-data
- ECSタスクにEFSをマウントする
- マウント先のEFSディレクトリの所有者を
www-data
とし、パーミッションは755
設計概要
EFSはアクセスポイントを使うことで、特定のパスをECSコンテナにマウントできます。さらに、EFSアクセスポイントの設定時に、オーナーのUID/GIDを指定することで、コンテナの非rootユーザーでも書き込みが可能です。
ディレクトリ構造
/efs
└── files
-
/efs
: EFSのルート(ルートディレクトリは権限変更できない) -
/efs/files
: アクセスポイントでマウントするディレクトリ
Terraform構成
以下、Terraformを使ったEFSの設定を行います。
1. EFSファイルシステムの作成
resource "aws_efs_file_system" "example" {
tags = {
Name = "sample-EFS"
}
}
2. EFSアクセスポイントの作成
アクセスポイントを作成し、/www/data
のオーナーを www-data
(UID: 33, GID: 33)に設定します。
resource "aws_efs_access_point" "example" {
file_system_id = aws_efs_file_system.example.id
posix_user {
uid = 33
gid = 33
}
root_directory {
# ルートディレクトリは権限変更できないので何か名前つける(何でもよい)
path = "/files"
creation_info {
owner_uid = 33
owner_gid = 33
permissions = "755"
}
}
}
3. EFSマウントターゲットの作成
resource "aws_efs_mount_target" "example" {
file_system_id = aws_efs_file_system.example.id
subnet_id = "subnet-12345678"
security_groups = ["sg-12345678"]
}
注意:
-
security_groups
を省略すると、デフォルトのSGが割り当てられるため注意が必要です。 - セキュリティグループはポート
2049
(NFS) を開ける必要があります。
4. ECSタスク定義の設定
resource "aws_ecs_task_definition" "example" {
family = "example-task"
network_mode = "awsvpc"
container_definitions = jsonencode([
{
name = "app",
image = "php:8.2-apache",
user = "33",
mountPoints = [
{
sourceVolume = "efs-storage",
containerPath = "/var/www/html/data", # EFSをマウントするコンテナ内のパス
readOnly = false
}
]
}
])
volume {
name = "efs-storage"
transit_encryption = "ENABLED" # ECSタスクにIAMロールをアタッチする場合はこちらも入れておきましょう
efs_volume_configuration {
file_system_id = aws_efs_file_system.example.id
transit_encryption = "ENABLED"
authorization_config {
access_point_id = aws_efs_access_point.example.id
iam = "ENABLED" # ECSタスクにIAMロールをアタッチする場合はこちらも入れておきましょう
}
}
}
}
注意点
-
EFSのルートディレクトリは権限変更ができない
EFSのルートディレクトリ (/
) の所有者変更やパーミッション変更はできないため、アクセスポイントでマウントするサブディレクトリを指定しています。 -
aws_efs_mount_target
のセキュリティグループ設定
aws_efs_mount_target
のsecurity_groups
を指定しない場合、適当なセキュリティグループが割り当てられることに注意してください。
→ セキュリティグループを明示的に設定することで、アクセス制御が正確に行えます。
まとめ
Terraformを使ってECSタスクにEFSをマウントする際、EFSアクセスポイントを活用することで、非rootユーザーでの操作が容易になります。また、ディレクトリの権限設定も柔軟に行えるため、セキュアなファイル操作が可能です。