0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでECSタスクに権限付きでEFSをマウントする方法

Posted at

はじめに

本記事では、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ロールをアタッチする場合はこちらも入れておきましょう
      }
    }
  }
}

注意点

  1. EFSのルートディレクトリは権限変更ができない
    EFSのルートディレクトリ (/) の所有者変更やパーミッション変更はできないため、アクセスポイントでマウントするサブディレクトリを指定しています。

  2. aws_efs_mount_target のセキュリティグループ設定
    aws_efs_mount_targetsecurity_groups を指定しない場合、適当なセキュリティグループが割り当てられることに注意してください。
    → セキュリティグループを明示的に設定することで、アクセス制御が正確に行えます。


まとめ

Terraformを使ってECSタスクにEFSをマウントする際、EFSアクセスポイントを活用することで、非rootユーザーでの操作が容易になります。また、ディレクトリの権限設定も柔軟に行えるため、セキュアなファイル操作が可能です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?