AWS Batch の Fargate 起動タイプで S3 Files をマウントして動作確認してみた

AWS Batch の Fargate 起動タイプで S3 Files をマウントして動作確認してみた

2026.05.05

はじめに

2026 年 4 月の Amazon S3 Files GA に合わせ、AWS Batch の Fargate ジョブからも S3 Files volume をマウントできるようになりました。

AWS Batch の Fargate ジョブから S3 Files volume をマウントし、NFS 経由でファイルの読み書きができることを最小構成で確認しました。AWS Batch 構成に S3 Files マウントのために何の設定が必要なのか を整理しました。

確認結果

  • Fargate 起動タイプのジョブから /mnt/data にマウントした S3 Files への読み書きが成功した
  • ジョブ定義は ecsProperties.taskProperties[].volumes[]s3filesVolumeConfiguration を指定する形式で一言でまとめられないので本文を確認してもらいたい
  • ジョブロールは s3files:ClientMounts3files:ClientWrite の 2 つの許可と、S3 バケットに対する読み取り権限が必要

検証構成

AWS Batch の Fargate 起動の実行環境を用意します。

項目
リージョン ap-northeast-1
AZ ap-northeast-1a(単一 AZ)
起動タイプ Fargate
コンテナイメージ public.ecr.aws/amazonlinux/amazonlinux:2023

S3 Files を AWS Batch から使うために必要な要素

Fargate ジョブで S3 Files volume を有効化するために、AWS Batch の構成に必要な要素は以下のとおりでした。

要素 設定先 S3 Files マウントのために必要なこと
起動タイプ platformCapabilities FARGATE 必須(EC2 未対応)
ジョブ定義のストレージ指定 ecsProperties.taskProperties[]volumesmountPoints volumes 配下に s3filesVolumeConfiguration を 1 つ追加
ジョブロール(taskRoleArn) インラインポリシー s3files:ClientMount + s3files:ClientWrite を追加
マウントターゲット S3 Files ファイルシステム コンピュート環境のサブネットと同一 VPC・同一 AZ に作成
セキュリティグループ タスク SG / マウントターゲット SG タスク SG に Egress 2049、マウントターゲット SG に Ingress 2049 を設定

実行ロール(executionRoleArn)と AWS Batch サービスロールには S3 Files 固有の追加権限は不要です。AWS マネージドポリシー(AmazonECSTaskExecutionRolePolicyAWSBatchServiceRole)のままで動きます。

検証環境の AWS リソースを見ていく

S3 バケットは バージョニング有効暗号化(SSE-S3 か SSE-KMS) が必須です。詳細は以下の記事を参照ください。

https://dev.classmethod.jp/articles/2026-04-13-s3-files-lambda/

IAM ロール

AWS Batch の IAM ロール体系については以下の記事を参照してください。サンプルとして今回作成したリソース名を併記します。

https://dev.classmethod.jp/articles/understanding-aws-batch-iam-roles-through-illustrations/

S3 Files を AWS Batch から使う構成では、3 つのロールが登場します。

ロール この記事のロール名(サンプル) S3 Files 用に追加で必要な権限
AWS Batch サービスロール s3files-batch-demo-batch-service なし(AWSBatchServiceRole のみ)
実行ロール(executionRoleArn) s3files-batch-demo-ecs-exec なし(AmazonECSTaskExecutionRolePolicy のみ)
ジョブロール(taskRoleArn) s3files-batch-demo-batch-job s3files:ClientMounts3files:ClientWrite + S3 のリード権限

ジョブロール(taskRoleArn)

コンテナ内のアプリが S3 Files をマウント・操作するためのロールです。最小権限の組み合わせは次の 3 ステートメントです。

  • S3FilesMount: NFS マウントとファイルシステムへの書き込み許可。S3 Files volume を使う場合の必須権限
    • 読み取り専用ジョブは s3files:ClientWrite も省略可
  • S3BucketRead: S3 から対象オブジェクトを直接読み取るために必要
  • CloudWatchLogs: コンテナの stdout/stderr を CloudWatch Logs に出力するための書き込み権限
    • S3 Files の設定とは無関係だけどログ出力には必要
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3FilesMount",
            "Effect": "Allow",
            "Action": ["s3files:ClientMount", "s3files:ClientWrite"],
            "Resource": "arn:aws:s3files:ap-northeast-1:123456789012:file-system/fs-037a637e702d75854"
        },
        {
            "Sid": "S3BucketRead",
            "Effect": "Allow",
            "Action": ["s3:GetObject", "s3:GetObjectVersion", "s3:ListBucket"],
            "Resource": [
                "arn:aws:s3:::s3files-batch-demo-123456789012",
                "arn:aws:s3:::s3files-batch-demo-123456789012/*"
            ]
        },
        {
            "Sid": "CloudWatchLogs",
            "Effect": "Allow",
            "Action": ["logs:PutLogEvents", "logs:CreateLogStream", "logs:CreateLogGroup"],
            "Resource": "arn:aws:logs:ap-northeast-1:123456789012:*"
        }
    ]
}

セキュリティグループ

2049 ポート受発信さえ間違えなければ特に問題ないです。

セキュリティグループ ルールタイプ プロトコル ポート 出発地/目的地
sg-01b87d6ce68206464(Batch タスク用) Egress TCP 2049 sg-070cb57e3d955e7ec(マウントターゲット用 SG)
sg-070cb57e3d955e7ec(マウントターゲット用) Ingress TCP 2049 sg-01b87d6ce68206464(Batch タスク用 SG)
sg-01b87d6ce68206464(Batch タスク用) Egress TCP 443 0.0.0.0/0(ECR pull, S3 API, CloudWatch Logs 用)

参考: Prerequisites for S3 Files - Security groups

Batch ジョブ定義

describe-job-definitions の出力から S3 Files 関連部分のみ抜粋します。

json
{
    "ecsProperties": {
        "taskProperties": [{
            "executionRoleArn": "arn:aws:iam::123456789012:role/s3files-batch-demo-ecs-exec",
            "taskRoleArn": "arn:aws:iam::123456789012:role/s3files-batch-demo-batch-job",
            "platformVersion": "LATEST",
            "networkConfiguration": {"assignPublicIp": "ENABLED"},
            "containers": [{
                "name": "main",
                "image": "public.ecr.aws/amazonlinux/amazonlinux:2023",
+                "mountPoints": [{
+                    "sourceVolume": "s3data",
+                    "containerPath": "/mnt/data",
+                    "readOnly": false
                }]
            }],
            "volumes": [{
+                "name": "s3data",
+                "s3filesVolumeConfiguration": {
+                    "fileSystemArn": "arn:aws:s3files:ap-northeast-1:123456789012:file-system/fs-037a637e702d75854"
                }
            }]
        }]
    }
}

ジョブ定義に 2 箇所設定を追加すれば S3 Files マウントが有効になります。今回一番のポイントは、volumes[].namemountPoints[].sourceVolume の文字列一致が紐付けのキーとなります。

  1. タスクレベルの volumes[] にマウントするファイルシステムを宣言する
    • name: ボリューム識別子(任意の文字列)
    • s3filesVolumeConfiguration.fileSystemArn: マウント対象の S3 Files ファイルシステム ARN(必須)
  2. コンテナレベルの mountPoints[] にコンテナ内のマウント先を指定する
    • sourceVolume: 上で宣言した volumes[].name と一致させる
    • containerPath: コンテナ内のマウントパス(例: /mnt/data
    • readOnly: 読み取り専用にするか(true / false)

s3files-batch-demo-job___詳細___…定義___Batch___ap-northeast-1_🔊.png

ジョブの動作確認

S3 Files を使って読み書きできるか動作確認します。

ジョブのサブミット

読み書きテストジョブをサブミットしました。

JOB_QUEUE=arn:aws:batch:ap-northeast-1:123456789012:job-queue/s3files-batch-demo-queue
JOB_DEFINITION=arn:aws:batch:ap-northeast-1:123456789012:job-definition/s3files-batch-demo-job:1

aws batch submit-job \
  --job-name s3files-test-1 \
  --job-queue "$JOB_QUEUE" \
  --job-definition "$JOB_DEFINITION"
実行結果
{
    "jobArn": "arn:aws:batch:ap-northeast-1:123456789012:job/341cfdf4-7f42-474e-a9a3-e1f57e8bdfa3",
    "jobName": "s3files-test-1",
    "jobId": "341cfdf4-7f42-474e-a9a3-e1f57e8bdfa3"
}

コンテナ実行時間は 27 秒でした。Fargate のコールドスタート分を含めても 1 分程度で完了しています。

Batch___ap-northeast-1_🔊.png

コンテナの出力(CloudWatch Logs)

aws logs get-log-events \
  --log-group-name /aws/batch/s3files-batch-demo \
  --log-stream-name "s3files-demo/main/49fe71a555034164beefd2e2908cdcf8" \
  --start-from-head \
  --query 'events[*].message' --output text
実行結果
=== mount status ===
Filesystem      Size  Used Avail Use% Mounted on
127.0.0.1:/     8.0E     0  8.0E   0% /mnt/data
=== existing files ===
total 16
drwxr-xr-x. 3 root root 10240 May  4 02:19 .
drwxr-xr-x. 1 root root  4096 May  4 02:25 ..
drwx------. 2 root root 10240 May  4 02:19 .s3files-lost+found-fs-037a637e702d75854
=== write test ===
hello from batch 20260504T022524Z
=== list again ===
total 20
drwxr-xr-x. 3 root root 10240 May  4 02:25 .
drwxr-xr-x. 1 root root  4096 May  4 02:25 ..
drwx------. 2 root root 10240 May  4 02:19 .s3files-lost+found-fs-037a637e702d75854
-rw-r--r--. 1 root root    34 May  4 02:25 from-batch-20260504T022524Z.txt

出力から確認できる点を補足します。

.s3files-lost+found-fs-037a637e702d75854/ ディレクトリ

S3 Files が同期競合時の退避領域として自動生成されるディレクトリです。ファイルシステム側の未同期データと S3 側の更新が衝突した場合、ファイルシステム側の変更がここに移されます。S3 を source of truth として扱う設計となっています。

書き込み直後の ls -la 表示

書き込んだ from-batch-20260504T022524Z.txt(34 bytes)がすぐに読み取れていますが、S3 へ保存されるのは 60 秒間隔です。

S3 バケットを確認

aws s3 ls s3://s3files-batch-demo-123456789012/
2026-05-04 11:26:30         34 from-batch-20260504T022524Z.txt

ファイルシステム上の書き込み時刻 02:25:24 UTC に対し、S3 バケット側の LastModified は 02:26:30 UTC。約 66 秒後に反映されました。最大 60 秒の集約ウィンドウ + 数秒は転送にかかった時間でしょうか。はっきりとはしませんが 60 秒遅れは想定どおりの動きです。

s3files-batch-demo-060238338…ケット___S3___ap-northeast-1_🔊.png

まとめ

AWS Batch の Fargate ジョブから S3 Files volume をマウントし、NFS 経由で読み書きできることを確認しました。

AWS Batch 側で追加が必要な設定は、ジョブ定義の volumesmountPoints の 2 箇所、そしてジョブロールへの s3files:ClientMounts3files:ClientWrite の付与がポイントでした。実行ロールと AWS Batch サービスロールはマネージドポリシーのままで動作しました。

一方で AWS Batch 以外の S3 バケットのバージョニング有効化と暗号化、コンピュート環境と同一 AZ のマウントターゲット作成、タスクのセキュリティグループと、マウントターゲットグループの 2049 ポートの許可いった前提条件が並びます。初回構築時の手間はむしろこちらの方が多かったです。あと、大事なことは現時点では Fargate 起動タイプのみ対応 で、EC2 コンピュート環境では起動できない点も押さえておいてください。

さいごに

地味に準備が大変で VPC レスの AWS Batch の様な HPC マネージドサービスが欲しくなりました。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事