Amazon S3 Files — 完全セットアップ & IaC ガイド
新しい Amazon S3 Files 機能(2026年4月7日 リリース)の実践的な Notion 対応リファレンス。その概要、動作原理、Terraform と AWS CDK (TypeScript) でのプロビジョニング方法、ターミナルからのマウント済みバケット検査方法、および監視用ダッシュボードについてカバーしています。 ステータス: 一般利用可能 · リージョン: すべての商用 AWS リージョン 最後に確認:2026年4月21日
目次
-
Amazon S3 Files とは
-
主な機能と数値
-
内部的な動作原理
-
アーキテクチャ図(概念モデル)
-
前提条件
-
AWS コンソールでのセットアップ(最速パス)
-
AWS CLI でのセットアップ(正式なコマンド)
-
Terraform でのセットアップ
-
AWS CDK (TypeScript) でのセットアップ
-
EC2、ECS、EKS、Lambda からのマウント
-
バケット・ファイルシステムを検査するためのターミナルコマンド
-
ダッシュボードと可視性 (CloudWatch、CloudTrail)
-
IAM とセキュリティモデル
-
S3 Files vs Mountpoint vs EFS vs FSx
-
制限事項と注意点
-
価格に関する注記
-
参考リンク
1. Amazon S3 Files とは
Amazon S3 Files は、通常の S3 汎用バケットの前に置かれた共有の POSIX 形式ファイルシステムであり、NFS v4.1+ 経由で任意の AWS コンピュート(EC2、ECS、EKS、Fargate、Lambda、Batch)からそのバケットにアクセス可能にします。データは重複しません。読み取りと書き込みは高性能キャッシュレイヤー(内部的に Amazon EFS 上に構築)と基礎となる S3 バケット間で流れ、ファイルシステムを介した変更は通常の S3 オブジェクトとして表示され、S3 での変更はファイルシステムに表示されます。 実際には:
-
アプリケーションは
/mnt/s3files/のようなマウントポイントに対してopen()、read()、write()、ls、cp、rmを実行します。 -
同じバイトは
s3://bucket-name/keyと S3 API を経由して同時にアクセス可能です。 -
最大 25,000 のコンピュートリソースが同じファイルシステムに一度にアタッチできます。
-
これはフル機能で高性能なネイティブファイルシステムインターフェースを備えた初のクラウドオブジェクトストアです。FUSE、カスタムコネクタ、アプリケーション向けの新しい API はありません。
2. 主な機能と数値
| 機能 | 値 |
| プロトコル | NFS v4.1+ |
| バッキングストレージ | EFS キャッシュレイヤー + S3 バケット(真実の源) |
| アクティブデータレイテンシ | ~1 ms |
| 集約読み取りスループット | 複数 TB/s(ローンチマテリアルで 4 TB/s+ が引用されている) |
| IOPS | バケットあたり 10M+ ファイルシステム IOPS |
| 同時コンピュートクライアント | 最大 25,000 |
| キャッシュ保持期間 | 1~365 日(デフォルト 30) |
| 大規模読み取り閾値 | ≥1 MiB 読み取りは S3 から直接ストリーミング |
| S3 → ファイルシステム同期 | 数秒(ときには ~1 分かかることもある) |
| ファイルシステム → S3 同期 | ~1 分以内 |
| 暗号化 | 転送中は TLS 1.3、保存時は SSE-S3 または SSE-KMS |
| 認証 | IAM(常に有効、無効にできない) |
| リージョン | すべての商用 AWS リージョン |
3. 内部的な動作原理
内部的には、S3 Files は Amazon EFS 上に構築されており、s3files という新しい NFS ファイルシステムタイプを導入します。これは Linux の mount コマンドが理解します(amazon-efs-utils パッケージ v3.0.0+ 経由)。
データフロー:
-
読み取りパス。 アプリケーションがファイルを読み取ると、S3 Files は遅延ロードでファイル(またはそのメタデータのみ)を高性能キャッシュ上に読み込みます。その後の読み取りはキャッシュから ~1 ms で来ます。≥1 MiB の読み取りは S3 から直接ストリーミングされ、標準 S3 GET 料金のみが発生します。ファイルシステムキャッシュコストはありません。
-
書き込みパス。 書き込みはまず高性能キャッシュにヒットし、バッチ処理され、その後 S3 に新しいオブジェクトまたは新しい S3 バージョンとしてフラッシュされます。このため、S3 バケットのバージョニングは 必須 です。
-
変更検出。 S3 Files は管理対象の EventBridge ルール(
DO-NOT-DELETE-S3-Files*という名前)を作成し、S3 API を通じた変更が検出され、ファイルシステムに反映されるようにします。 -
キャッシュ有効期限。 設定されたウィンドウ(1~365 日、デフォルト 30)内にアクセスされなかったファイルはキャッシュから期限切れになります。S3 に残り、次回アクセス時に再フェッチされます。
-
一貫性モデル。 NFS close-to-open 一貫性。つまり、あるクライアントがファイルをクローズすると、他のクライアントがそれをオープンするときに新しいバージョンを見ます。
4. アーキテクチャ図(概念モデル)
┌────────────────────────────────────────────┐
│ Your VPC │
│ │
│ ┌───────────┐ ┌──────────────────┐ │
│ │ EC2 / │ NFS │ Mount Target │ │
│ │ ECS / ├─────▶│ (one per AZ) │ │
│ │ EKS / │ 2049 │ │ │
│ │ Lambda │ └──────┬───────────┘ │
│ └───────────┘ │ │
└─────────────────────────────┼──────────────┘
│
▼
┌─────────────────────────┐
│ S3 File System │
│ (fs-xxxx, backed by │
│ EFS high-perf cache) │
└──────────┬──────────────┘
│ two-way sync
▼
┌─────────────────────────┐
│ S3 General Purpose │
│ Bucket (versioned, │
│ SSE-S3 or SSE-KMS) │
└─────────────────────────┘
3 つのリソースが順序で:ファイルシステム → マウントターゲット → mount コマンド。
5. 前提条件
AWS 前提条件ページから直接:
-
AWS アカウント。
-
コンピュートリソース(EC2/ECS/EKS/Lambda)と同じリージョンの S3 汎用バケット。
-
バケットで S3 バージョニングを有効化(同期に必須)。
-
バケット暗号化は SSE-S3 または SSE-KMS である必要があります。
-
EC2 インスタンスに
amazon-efs-utilsv3.0.0+ をインストール(EFS と S3 Files 用の共有クライアント)。 -
2 つの IAM ロール:
- S3 Files がバケットを読み取り/書き込みし、EventBridge ルールを管理するために想定される サービスロール。
AmazonS3FilesClientFullAccessまたはAmazonS3FilesClientReadOnlyAccessマネージドポリシーに加えて、直接s3:GetObject/s3:ListBucketを付与するインラインポリシーを持つ コンピュートロール(例えば EC2 インスタンスプロファイル)。
-
コンピュートセキュリティグループとマウントターゲットセキュリティグループの間で TCP 2049 を許可するセキュリティグループ。
ヒント。 AWS コンソール経由でファイルシステムを作成する場合、サービス IAM ロール、デフォルト VPC 内の AZ ごとに 1 つのマウントターゲット、およびファイルシステムの 1 つのアクセスポイントが自動作成されます。
6. AWS コンソールでのセットアップ(最速パス)
-
S3 コンソール → 汎用バケット → バケットを選択 → ファイルシステム タブ → ファイルシステムを作成。
-
VPC を確認します(テスト用のデフォルト VPC で問題ありません)。
-
作成 をクリックします。コンソールはファイルシステム、AZ ごとに 1 つのマウントターゲット、アクセスポイント、およびサービス IAM ロールをプロビジョニングします。
-
ファイルシステムの 概要 ページで、EC2 インスタンスにアタッチ の下の アタッチ を選択し、EC2 インスタンスを選択してマウントパス(例えば
/mnt/s3files/)を入力し、CloudShell で生成されたマウントコマンドに従います。 -
マネージドポリシー
AmazonS3FilesClientFullAccessを EC2 インスタンスの IAM ロールにアタッチします。
7. AWS CLI でのセットアップ(正式なコマンド)
これらは正確な AWS ドキュメント化されたコマンドです。プレースホルダを置き換えます。
7.1 ファイルシステムを作成
aws s3files create-file-system \
--region <aws-region> \
--bucket <bucket-arn> \
--role-arn <iam-role-arn>
-
<bucket-arn>— 例えばarn:aws:s3:::my-bucket -
<iam-role-arn>— S3 Files が想定する サービスロール(§13 を参照) レスポンスは ファイルシステム ID(fs-xxxxxxxx…)を含む JSON 説明を返します。保存してください。
7.2 マウントターゲットを作成(AZ ごとに 1 つ)
マウントターゲットは VPC 内に存在し、ファイルシステムをクライアントに公開する ENI です。使用する AZ ごとに 1 つ作成します。
aws s3files create-mount-target \
--region <aws-region> \
--file-system-id <fs-id> \
--subnet-id <subnet-id>
作成には最大 ~5 分かかります。
7.3 説明 / 確認
# ファイルシステムを検索
aws s3files get-file-system \
--region <aws-region> \
--file-system-id <fs-id>
# リージョン内のすべてのファイルシステムをリスト
aws s3files list-file-systems --region <aws-region>
# ファイルシステムのマウントターゲットをリスト
aws s3files describe-mount-targets \
--region <aws-region> \
--file-system-id <fs-id>
7.4 EC2 シェルからマウント
sudo mkdir -p /mnt/s3files
sudo mount -t s3files <fs-id>:/ /mnt/s3files
ファイルシステムチェックの完全な例は §11 にあります。
7.5 破棄
# まずアンマウント
sudo umount /mnt/s3files
# マウントターゲットを削除(fs を削除する前に必須)
aws s3files delete-mount-target --mount-target-id <mt-id>
# ファイルシステムを削除
aws s3files delete-file-system --file-system-id <fs-id>
8. Terraform でのセットアップ
2026年4月21日時点での重要な注意: HashiCorp はネイティブ Terraform サポートのトラッキングイシュー(GitHub #47324)を持っており、aws_s3files_file_system と aws_s3files_mount_target リソースが追加されており、AWS プロバイダ v6.40.0 をターゲットにしています。そのリリースがあなたの state に到達するまで、コミュニティ推奨パターンは terraform_data + local-exec で AWS CLI を呼び出す ことです。以下に両方の記法があります。
8.1 変数とプロバイダ
terraform {
required_version = ">= 1.6.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.80, < 7.0"
}
}
}
provider "aws" {
region = var.aws_region
}
variable "aws_region" { type = string default = "us-east-1" }
variable "bucket_name" { type = string default = "my-s3files-bucket" }
variable "subnet_ids" { type = list(string) } # カバーしたい AZ ごとに 1 つ
8.2 バケット前提条件(バージョニング + 暗号化)
resource "aws_s3_bucket" "data" {
bucket = var.bucket_name
}
resource "aws_s3_bucket_versioning" "data" {
bucket = aws_s3_bucket.data.id
versioning_configuration { status = "Enabled" }
}
resource "aws_s3_bucket_server_side_encryption_configuration" "data" {
bucket = aws_s3_bucket.data.id
rule {
apply_server_side_encryption_by_default { sse_algorithm = "AES256" }
}
}
8.3 サービス IAM ロール(S3 Files が想定するもの)
data "aws_caller_identity" "current" {}
locals {
account_id = data.aws_caller_identity.current.account_id
region = var.aws_region
}
resource "aws_iam_role" "s3files_service" {
name = "S3FilesServiceRole-${var.bucket_name}"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Sid = "AllowS3FilesAssumeRole"
Effect = "Allow"
Principal = { Service = "elasticfilesystem.amazonaws.com" }
Action = "sts:AssumeRole"
Condition = {
StringEquals = { "aws:SourceAccount" = local.account_id }
ArnLike = { "aws:SourceArn" = "arn:aws:s3files:${local.region}:${local.account_id}:file-system/*" }
}
}]
})
}
resource "aws_iam_role_policy" "s3files_service" {
role = aws_iam_role.s3files_service.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "S3BucketPermissions"
Effect = "Allow"
Action = ["s3:ListBucket", "s3:ListBucketVersions"]
Resource = aws_s3_bucket.data.arn
Condition = { StringEquals = { "aws:ResourceAccount" = local.account_id } }
},
{
Sid = "S3ObjectPermissions"
Effect = "Allow"
Action = [
"s3:AbortMultipartUpload",
"s3:DeleteObject*",
"s3:GetObject*",
"s3:List*",
"s3:PutObject*"
]
Resource = "${aws_s3_bucket.data.arn}/*"
Condition = { StringEquals = { "aws:ResourceAccount" = local.account_id } }
},
{
Sid = "EventBridgeManage"
Effect = "Allow"
Action = [
"events:DeleteRule", "events:DisableRule", "events:EnableRule",
"events:PutRule", "events:PutTargets", "events:RemoveTargets"
]
Condition = { StringEquals = { "events:ManagedBy" = "elasticfilesystem.amazonaws.com" } }
Resource = ["arn:aws:events:*:*:rule/DO-NOT-DELETE-S3-Files*"]
},
{
Sid = "EventBridgeRead"
Effect = "Allow"
Action = [
"events:DescribeRule", "events:ListRuleNamesByTarget",
"events:ListRules", "events:ListTargetsByRule"
]
Resource = ["arn:aws:events:*:*:rule/*"]
}
]
})
}
8.4 マウントターゲット用セキュリティグループ
resource "aws_security_group" "s3files_mt" {
name = "s3files-mount-target"
description = "Allow NFS 2049 from app compute"
vpc_id = var.vpc_id
}
resource "aws_vpc_security_group_ingress_rule" "nfs_in" {
security_group_id = aws_security_group.s3files_mt.id
referenced_security_group_id = var.app_sg_id
from_port = 2049
to_port = 2049
ip_protocol = "tcp"
}
8.5 ファイルシステム + マウントターゲット — ネイティブリソース(v6.40.0 が出たとき)
# v6.40.0 が出されたときの期待される形状。プロバイダ CHANGELOG で
# arg 名を確認してから apply してください。
resource "aws_s3files_file_system" "this" {
bucket = aws_s3_bucket.data.arn
role_arn = aws_iam_role.s3files_service.arn
}
resource "aws_s3files_mount_target" "per_az" {
for_each = toset(var.subnet_ids)
file_system_id = aws_s3files_file_system.this.id
subnet_id = each.value
security_group_ids = [aws_security_group.s3files_mt.id]
}
output "file_system_id" {
value = aws_s3files_file_system.this.id
}
8.6 ファイルシステム + マウントターゲット — フォールバック(terraform_data + AWS CLI)
プロバイダ v6.40.0 が到達するまで これを使用してください。§7 でセットアップした AWS CLI を呼び出します。
resource "terraform_data" "s3files_fs" {
input = {
region = var.aws_region
bucket_arn = aws_s3_bucket.data.arn
role_arn = aws_iam_role.s3files_service.arn
}
provisioner "local-exec" {
command = <<-EOT
set -euo pipefail
FS_ID=$(aws s3files create-file-system \
--region ${self.input.region} \
--bucket ${self.input.bucket_arn} \
--role-arn ${self.input.role_arn} \
--query FileSystemId --output text)
echo "$FS_ID" > ${path.module}/.s3files-fs-id
EOT
}
provisioner "local-exec" {
when = destroy
command = <<-EOT
FS_ID=$(cat ${path.module}/.s3files-fs-id)
# まずすべてのマウントターゲットを破棄してから fs を削除
for MT in $(aws s3files describe-mount-targets --file-system-id $FS_ID \
--query 'MountTargets[].MountTargetId' --output text); do
aws s3files delete-mount-target --mount-target-id $MT
done
aws s3files delete-file-system --file-system-id $FS_ID
EOT
}
}
data "local_file" "fs_id" {
depends_on = [terraform_data.s3files_fs]
filename = "${path.module}/.s3files-fs-id"
}
resource "terraform_data" "mount_targets" {
for_each = toset(var.subnet_ids)
input = { fs_id = trimspace(data.local_file.fs_id.content), subnet_id = each.value }
provisioner "local-exec" {
command = <<-EOT
aws s3files create-mount-target \
--region ${var.aws_region} \
--file-system-id ${self.input.fs_id} \
--subnet-id ${self.input.subnet_id}
EOT
}
}
8.7 コンピュート側 IAM(EC2 インスタンスプロファイル)
resource "aws_iam_role" "app_ec2" {
name = "S3FilesEC2Role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "ec2.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "client_full" {
role = aws_iam_role.app_ec2.name
policy_arn = "arn:aws:iam::aws:policy/AmazonS3FilesClientFullAccess"
}
resource "aws_iam_role_policy" "app_s3_read" {
role = aws_iam_role.app_ec2.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{ Effect = "Allow", Action = ["s3:GetObject", "s3:GetObjectVersion"], Resource = "${aws_s3_bucket.data.arn}/*" },
{ Effect = "Allow", Action = "s3:ListBucket", Resource = aws_s3_bucket.data.arn }
]
})
}
resource "aws_iam_instance_profile" "app_ec2" {
name = "S3FilesEC2Profile"
role = aws_iam_role.app_ec2.name
}
9. AWS CDK (TypeScript) でのセットアップ
S3 Files 用の AWS CDK L2 コンストラクトはまだロールアウト中です(機能は 2026 年 4 月 7 日にシップされました)。@aws-cdk/aws-s3files-alpha が安定するまで、AwsCustomResource が必要な場所で L1 / L2 コンストラクトのミックスを使用してください。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId } from 'aws-cdk-lib/custom-resources';
export class S3FilesStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: cdk.StackProps & { vpc: ec2.IVpc }) {
super(scope, id, props);
// 1. 必須設定を持つバケット
const bucket = new s3.Bucket(this, 'DataBucket', {
bucketName: 'my-s3files-bucket',
versioned: true, // S3 Files に必須
encryption: s3.BucketEncryption.S3_MANAGED, // SSE-S3(または KMS_MANAGED / KMS)
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
enforceSSL: true,
});
// 2. S3 Files が想定するサービスロール
const serviceRole = new iam.Role(this, 'S3FilesServiceRole', {
assumedBy: new iam.ServicePrincipal('elasticfilesystem.amazonaws.com', {
conditions: {
StringEquals: { 'aws:SourceAccount': this.account },
ArnLike: { 'aws:SourceArn': `arn:aws:s3files:${this.region}:${this.account}:file-system/*` },
},
}),
});
bucket.grantReadWrite(serviceRole);
serviceRole.addToPolicy(new iam.PolicyStatement({
actions: ['s3:ListBucket', 's3:ListBucketVersions'],
resources: [bucket.bucketArn],
conditions: { StringEquals: { 'aws:ResourceAccount': this.account } },
}));
serviceRole.addToPolicy(new iam.PolicyStatement({
actions: [
'events:PutRule', 'events:DeleteRule', 'events:EnableRule', 'events:DisableRule',
'events:PutTargets', 'events:RemoveTargets',
],
resources: ['arn:aws:events:*:*:rule/DO-NOT-DELETE-S3-Files*'],
conditions: { StringEquals: { 'events:ManagedBy': 'elasticfilesystem.amazonaws.com' } },
}));
serviceRole.addToPolicy(new iam.PolicyStatement({
actions: ['events:DescribeRule', 'events:ListRules', 'events:ListRuleNamesByTarget', 'events:ListTargetsByRule'],
resources: ['arn:aws:events:*:*:rule/*'],
}));
// 3. マウントターゲット用セキュリティグループ
const mtSg = new ec2.SecurityGroup(this, 'S3FilesMountTargetSg', {
vpc: props.vpc,
description: 'NFS 2049 inbound for S3 Files mount target',
});
// 4. AwsCustomResource 経由でファイルシステムを作成(L2 が出されるまで)
const fileSystem = new AwsCustomResource(this, 'S3FilesFileSystem', {
onCreate: {
service: 's3files',
action: 'createFileSystem',
parameters: { Bucket: bucket.bucketArn, RoleArn: serviceRole.roleArn },
physicalResourceId: PhysicalResourceId.fromResponse('FileSystemId'),
},
onDelete: {
service: 's3files',
action: 'deleteFileSystem',
parameters: { FileSystemId: new cdk.PhysicalName('FileSystemId').toString() },
},
policy: AwsCustomResourcePolicy.fromStatements([
new iam.PolicyStatement({
actions: ['s3files:CreateFileSystem', 's3files:DeleteFileSystem', 'iam:PassRole'],
resources: ['*'],
}),
]),
});
const fsId = fileSystem.getResponseField('FileSystemId');
// 5. プライベートサブネットごとに 1 つのマウントターゲット
props.vpc.privateSubnets.forEach((subnet, i) => {
new AwsCustomResource(this, `S3FilesMountTarget${i}`, {
onCreate: {
service: 's3files',
action: 'createMountTarget',
parameters: {
FileSystemId: fsId,
SubnetId: subnet.subnetId,
SecurityGroups: [mtSg.securityGroupId],
},
physicalResourceId: PhysicalResourceId.fromResponse('MountTargetId'),
},
policy: AwsCustomResourcePolicy.fromStatements([
new iam.PolicyStatement({ actions: ['s3files:CreateMountTarget'], resources: ['*'] }),
]),
});
});
// 6. コンピュート側 IAM:マウント + バケット読み取り可能な EC2 ロール
const ec2Role = new iam.Role(this, 'AppEc2Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonS3FilesClientFullAccess')],
});
bucket.grantRead(ec2Role);
new cdk.CfnOutput(this, 'FileSystemId', { value: fsId });
}
}
ネイティブ CDK L2 コンストラクトが到達したら(
@aws-cdk/aws-s3files-alphaを追跡)、AwsCustomResourceブロックをnew s3files.FileSystem(...)とfileSystem.addMountTarget(...)に折りたたみます。
10. EC2、ECS、EKS、Lambda からのマウント
10.1 EC2 — ワンショット
# クライアントをインストール(Amazon Linux)
sudo yum -y install amazon-efs-utils
# または、他のディストロ上で:
curl https://amazon-efs-utils.aws.com/efs-utils-installer.sh | sudo sh -s -- --install
# マウント
sudo mkdir -p /mnt/s3files
sudo mount -t s3files fs-0123456789abcdef0:/ /mnt/s3files
マウントヘルパーは自動的に TLS 1.2+ と IAM 認証を強制します。これらを無効にすることはできません。そのデフォルトは nfsvers=4.2, rsize=1048576, wsize=1048576, hard, timeo=600, retrans=2, noresvport, tls, iam です。
10.2 EC2 — /etc/fstab 経由でのブート時の自動マウント
fs-0123456789abcdef0:/ /mnt/s3files s3files _netdev,nofail 0 0
-
_netdevは 必須(ネットワーク依存マウント)。これなしでは、インスタンスはブート時にハング可能性があります。 -
nofailは推奨されているため、マウントが失敗してもインスタンスはまだブートします。 特定のアクセスポイントにピン留めするには:
fs-xxxx:/ /mnt/s3files s3files _netdev,accesspoint=fsap-xxxx 0 0
sudo mount -a でテストしてから findmnt -T /mnt/s3files を実行してください。
10.3 ECS / Fargate / EKS コンテナ
標準 EFS/NFS ボリュームプランバイアを使用してファイルシステムをボリュームとしてアタッチします。ECS タスク定義と EKS PersistentVolume 仕様は S3 Files fs-xxxx ID と同じ方法で受け入れます。タスクロールには AmazonS3FilesClientFullAccess(または読み取り専用同等)と同じインライン s3:GetObject/s3:ListBucket 付与が必要です。
10.4 AWS Lambda
Lambda 関数は関数のファイルシステム設定を通じて /mnt/s3files のようなパスでファイルシステムをマウントします。関数の実行ロールには EC2 と同じコンピュート側 IAM が必要です。
10.5 クロス VPC / クロスリージョンマウント
ピアリング VPC または Transit Gateway から、DNS をバイパスしてマウントターゲットの IP を明示的に渡します:
sudo mount -t s3files \
-o mounttargetip=10.0.12.34 \
fs-0123456789abcdef0 /mnt/s3files
クロスリージョンの場合、また /etc/amazon/efs/s3files-utils.conf を編集してコメントアウト解除します。region = <source-region> 行。
10.6 アンマウント
sudo umount /mnt/s3files
findmnt -T /mnt/s3files # クリーンな場合は出力がないはず
11. バケット・ファイルシステムを検査するためのターミナルコマンド
これはあなたが求めたリストです。マウントを確認し、ファイルシステム ↔ S3 ビューを比較するための有用なシェルコマンドすべて。
11.1 マウントされていますか? どのオプション?
# マウントはカーネルでリストされていますか?
findmnt -T /mnt/s3files
# 空き容量 / 使用容量(exabyte スケールの疑似サイズを表示)
df -h /mnt/s3files
# ボックス上のすべての NFS マウント
mount | grep s3files
# s3files ファイルシステムタイプは利用可能ですか?
cat /proc/filesystems | grep nfs
期待される df -h 出力:
Filesystem Size Used Avail Use% Mounted on
fs-xxx.xxx... 8.0E 129M 8.0E 1% /mnt/s3files
11.2 ファイルシステム経由でバケットを参照
cd /mnt/s3files
# すべてをリスト(S3 プレフィックスをディレクトリとして尊重)
ls -la
# サイズ付きの再帰的リスト
ls -lhR | head -n 50
# ツリービュー(tree がインストールされている場合)
sudo yum -y install tree && tree -L 3 /mnt/s3files
# 深いサーチ
find /mnt/s3files -type f -name "*.parquet" | head
# ファイルをカウント、ログをストリーム、何でも
wc -l /mnt/s3files/logs/2026-04-21.log
tail -f /mnt/s3files/logs/app.log
11.3 ファイルを書き込んで S3 に具現化することを確認
echo "Hello S3 Files" > /mnt/s3files/hello.txt
# ~1 分以内に、同じキーが S3 に表示されます
aws s3 ls s3://my-s3files-bucket/hello.txt
aws s3api list-object-versions \
--bucket my-s3files-bucket \
--prefix hello.txt
# S3 API 経由でそれを取得
aws s3 cp s3://my-s3files-bucket/hello.txt - | cat
11.4 クロスチェック:両方のインターフェース経由で同じバイト?
# ファイルシステム経由で合計
sha256sum /mnt/s3files/data/big.parquet
# S3 API 経由で合計
aws s3 cp s3://my-s3files-bucket/data/big.parquet - | sha256sum
11.5 CLI から S3 Files インフラストラクチャを検査
# このリージョン内のファイルシステム
aws s3files list-file-systems --region us-east-1
# 1 つの詳細
aws s3files get-file-system --file-system-id fs-xxx
# マウントターゲット
aws s3files describe-mount-targets --file-system-id fs-xxx
# 特定のマウントターゲットが使用している IP
aws s3files describe-mount-targets \
--file-system-id fs-xxx \
--query 'MountTargets[*].[MountTargetId,SubnetId,IpAddress,AvailabilityZoneName]' \
--output table
# ファイルシステムにアタッチされたアクセスポイント
aws s3files describe-access-points --file-system-id fs-xxx
11.6 クイックヘルスチェックスクリプト
#!/usr/bin/env bash
set -euo pipefail
FS_ID="${1:?usage: $0 <fs-id> <mount-dir>}"
MNT="${2:?}"
echo "== mount status =="
findmnt -T "$MNT" || { echo "NOT MOUNTED"; exit 1; }
echo "== df =="
df -hT "$MNT"
echo "== round-trip write test =="
STAMP="health-$(date +%s).txt"
echo "ok" > "$MNT/$STAMP"
sleep 70
aws s3api head-object --bucket "$(aws s3files get-file-system \
--file-system-id "$FS_ID" --query Bucket --output text | sed 's|^arn:aws:s3:::||')" \
--key "$STAMP" && echo "✔ object visible in S3"
rm "$MNT/$STAMP"
12. ダッシュボードと可視性
はい。マウントされたディレクトリだけではなく、実際の可視性サーフェスを取得します。
12.1 ビルトイン AWS コンソールダッシュボード
バケットの S3 コンソールの ファイルシステム タブは次を提供します:
-
AZ ごとのマウントターゲットステータス。
-
アタッチされたアクセスポイント。
-
現在のクライアント接続数。
-
高性能キャッシュレイヤーに保持されているストレージ。
-
ファイルシステムごとの CloudWatch ウィジェット。
12.2 CloudWatch メトリクス(名前空間ヒント)
S3 Files は AWS/S3Files 名前空間の CloudWatch を通じてメトリクスを公開します(EFS アンダーピニングと共有されたメトリクス)。有用なもの:
| メトリクス | 意味 |
StorageBytes | 高性能キャッシュレイヤーに保持されているバイト |
ClientConnections | 現在マウントされている NFS クライアント数 |
DataReadIOBytes / DataWriteIOBytes | I/O スループット |
TotalIOBytes | 集約 I/O |
PercentIOLimit | 飽和にどれだけ近いか |
PermittedThroughput / MeteredIOBytes | 容量対使用 |
SyncErrors(カスタムディメンション) | 失敗した S3 ↔ FS 同期イベント |
ダッシュボードを構築します:
aws cloudwatch put-dashboard \
--dashboard-name S3FilesOverview \
--dashboard-body file://dashboard.json
最小限の dashboard.json:
{
"widgets": [
{
"type": "metric",
"properties": {
"metrics": [
[ "AWS/S3Files", "StorageBytes", "FileSystemId", "fs-xxx" ],
[ ".", "ClientConnections", ".", "." ],
[ ".", "TotalIOBytes", ".", "." ]
],
"view": "timeSeries",
"stat": "Average",
"period": 60,
"title": "S3 Files — fs-xxx"
}
}
]
}
12.3 CloudWatch アラーム
aws cloudwatch put-metric-alarm \
--alarm-name S3Files-HighClientConnections \
--metric-name ClientConnections \
--namespace AWS/S3Files \
--statistic Average --period 60 \
--threshold 20000 --comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=FileSystemId,Value=fs-xxx \
--alarm-actions arn:aws:sns:us-east-1:123456789012:oncall
12.4 CloudTrail
すべての管理プレーンコール(CreateFileSystem、CreateMountTarget、DeleteFileSystem など)は CloudTrail に s3files.amazonaws.com サービスからのイベントとして着地します。Athena またはコンソールのイベント履歴でクエリします。
12.5 マウントヘルパーログ
各 EC2 クライアント上で、マウントヘルパーとそのウォッチドッグは NFS / TLS ヒックアップをデバッグするために有用な診断ログを書き込みます:
sudo journalctl -u amazon-efs-mount-watchdog -f
sudo ls /var/log/amazon/efs/
12.6 サードパーティダッシュボード
-
Grafana CloudWatch データソース —
AWS/S3Files名前空間を指し、任意の EFS ダッシュボードテンプレートが軽く再寸法化されて機能します。 -
Datadog — その AWS 統合は S3 Files メトリクスを自動的に取得します。
13. IAM とセキュリティモデル
プレイで 2 つの IAM ロールがあります。それらを混同しないでください。
13.1 サービスロール(S3 Files → バケット)
elasticfilesystem.amazonaws.com サービスプリンシパル(S3 Files は EFS 内部にレイヤーされています)により使用されます。S3 読み取り/書き込み、KMS 使用(SSE-KMS の場合)、および DO-NOT-DELETE-S3-Files* という名前のルールに限定された EventBridge 管理が必要です。
公式ポリシー(§8.3 で Terraform として再現)— サマリー:
-
バケット上の
s3:ListBucket、s3:ListBucketVersions。 -
オブジェクト上の
s3:AbortMultipartUpload、s3:DeleteObject*、s3:GetObject*、s3:List*、s3:PutObject*。 -
kms:ViaService = s3.<region>.amazonaws.com経由でスコープされたkms:GenerateDataKey、kms:Encrypt、kms:Decrypt、kms:ReEncryptFrom、kms:ReEncryptTo。 -
スコープ EventBridge 管理 + 広い EventBridge 読み取り。
-
信頼ポリシー:プリンシパル
elasticfilesystem.amazonaws.com、aws:SourceAccountとaws:SourceArn=arn:aws:s3files:<region>:<account>:file-system/*で条件付け。
13.2 コンピュートロール(EC2/Lambda/task → S3 Files)
1 つの マネージドポリシーとインライン S3 読み取りポリシーをアタッチします:
-
AmazonS3FilesClientFullAccess— マウント経由で読み取り + 書き込み。 -
AmazonS3FilesClientReadOnlyAccess— 読み取り専用。 -
AmazonElasticFileSystemUtils— マウントヘルパーが CloudWatch メトリクスを発行できるようにします。 インライン S3 読み取りポリシー(大規模読み取りをキャッシュをバイパスして高速化):
{
"Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow",
"Action": ["s3:GetObject", "s3:GetObjectVersion"],
"Resource": "arn:aws:s3:::<bucket>/*" },
{ "Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<bucket>" }
]
}
マネージドポリシーの代わりに細粒度 IAM アクション:s3files:ClientMount、s3files:ClientWrite、s3files:ClientRootAccess。
13.3 暗号化
-
転送中: TLS 1.3、必須。マウントヘルパーは常に
tlsとiamを追加します。 -
保存中: SSE-S3 または SSE-KMS(バケットにマッチ)。
-
FIPS モード:
/etc/amazon/efs/s3files-utils.confでfips_mode_enabled = trueをフリップします。
13.4 POSIX パーミッション
S3 Files は UID/GID とファイルモードビットを S3 オブジェクトメタデータとして保存します。ファイルシステムは IAM の上に標準的な POSIX アクセスチェックを強制します。両方とも合格する必要があります。
14. S3 Files vs Mountpoint vs EFS vs FSx
| S3 Files | Mountpoint for S3 | EFS | FSx | |
| アクセスパターン | 共有読み取り/書き込み NFS | FUSE クライアント、読み取り集約 | 共有 NFS | 共有(Lustre / ONTAP / OpenZFS / Windows) |
| 真実の源 | S3 バケット | S3 バケット | EFS | FSx |
| POSIX セマンティクス | 完全 | 部分的(名前変更、ランダム書き込みなし) | 完全 | 完全 |
| 最大クライアント | 25,000 | N/A(クライアント側) | 数千 | 様々 |
| レイテンシ | ~1 ms(キャッシュ) | ネットワーク + S3 | サブ ms | サブ ms |
| S3 にデータがありますか? | はい、常に | はい、常に | いいえ | いいえ(ティアリング除く) |
| 最適な用途 | エージェント、ML トレーニング、コラボレーション | 大規模シーケンシャル読み取り、ETL | 汎用 NAS | HPC、Windows、NetApp ネイティブ |
| コストモデル | キャッシュ + S3 リクエストに対して支払い | S3 リクエストのみに対して支払い | GB/月階層化 | プロビジョニング |
経験則:読み取り集約でシーケンシャル → Mountpoint。インタラクティブ / 共有 / 書き込み → S3 Files。
15. 制限事項と注意点
-
S3 汎用バケットのみ。 ディレクトリバケット、ベクトルバケット、または S3 テーブルバケットではありません。
-
バージョニングはオンである必要があります。 必須。そうでなければ作成を拒否します。
-
暗号化は SSE-S3 または SSE-KMS である必要があります。
-
VPC ごとに AZ ごとに 1 つのマウントターゲット。 さらに多くの AZ が必要な場合、明示的にカバーしてください。
-
マウントヘルパーは Linux のみです。 Windows クライアントはサポートされていません。
-
_netdevは必須です/etc/fstabで。これなしでは、インスタンスはブート時にハング可能性があります。 -
同期は即座ではありません。 S3 → FS から数秒、FS → S3 から ~1 分が予想されます。
-
管理対象の EventBridge ルールに触れないでください
DO-NOT-DELETE-S3-Files*という名前。サービスが必要とします。 -
Terraform ネイティブサポートは保留中です(プロバイダ v6.40.0)。その後まで CLI フォールバックを使用してください。
-
プロバイダ固有の API フィールドはプレビューと GA CDK/Terraform リソース間で若干シフト可能性があります — 本番環境 apply の前に常に最新の CHANGELOG で arg 名をクロスチェックしてください。
-
すべてのエッジケースで POSIX ファイルシステムではありません — これは close-to-open 一貫(NFS セマンティクス)、厳密なロックではありません。
16. 価格に関する注記
従量課金制、最小コミットメントなし:
-
高性能キャッシュレイヤー上のアクティブワーキングセットストレージ(GB 月)。
-
小ファイル読み取りとファイルシステム経由のすべての書き込み(メータリング操作)。
-
基礎となる S3 リクエスト料金 同期中(標準 GET/PUT 価格)。
-
大規模読み取り(≥1 MiB) S3 から直接ストリーミングされ、S3 GET コストのみが発生します。ファイルシステム操作チャージはありません。
-
キャッシュ保持 1~365 日(デフォルト 30)は、データが期限切れになる前に「ウォーム」のままかを決めます。保持が長い = キャッシュストレージ請求が高い。 AWS からのヘッドラインクレーム:S3 と個別のファイルシステム間でデータを循環させるより 最大 90% 安い。正確な per-region GB 月およびリクエストレートについては S3 価格ページを確認してください。
17. 参考リンク
-
ローンチブログ — https://aws.amazon.com/blogs/aws/launching-s3-files-making-s3-buckets-accessible-as-file-systems/
-
What's New — https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-s3-files/
-
ユーザーガイド(S3 Files セクション) — https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files.html
-
前提条件 — https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files-prereq-policies.html
-
開始ガイド(CLI) — https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files-getting-started.html
-
EC2 上のマウント — https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files-mounting.html
-
Terraform トラッキングイシュー — https://github.com/hashicorp/terraform-provider-aws/issues/47324
-
amazon-efs-utils(クライアント) — https://github.com/aws/efs-utils