- 公開日
- 最終更新日
Lambda + S3 の構成と注意
この記事を共有する
目次
はじめに
2026年4月7日にS3 Filesの提供開始となり、2026年4月21日にLambdaでS3 Filesの利用が可能になりましたので、Lambda + S3の基本的な設定と利用にあたっての注意点をまとめてみました。
構成
動作の確認のため、Lambda + S3の最小構成です。
S3 Filesを作成すると自動的にMount TargetとAccess Pointが作成されます。

設定
VPCの設定
1.VPCを作成します。
2.defaultのセキュリティグループの設定を行います。インバウンド、アウトバウンドのNFS(2049)を許可します。


S3 Filesの設定
1.S3バケットを作成して、ファイルシステム-新規タブをクリックします。
2.ファイルシステムを作成をクリックします。

3.バケットとファイルシステムを配置するVPCを選択して、ファイルシステムを作成をクリックします。

4.ファイルシステムが作成されて、ステータスが利用可能であることを確認します。
5.作成したファイルシステムIDのリンクをクリックします。

6.マウントターゲットタブをクリックして、作成されたターゲットを確認します。

7.アクセスポイントタブをクリックします。
8.アクセスポイントIDをクリックします。

自動で作成されるアクセスポイントは、以下の内容で作成されていることを確認します。
・ルートディレクトリパス:/lambda
・POSIXユーザー
・ユーザーID:1000
・グループID:1000
・ルートディレクトリ作成のアクセス許可
・所有者ユーザーID:1000
・所有者グループID:1000
・アクセス許可:755

Lambdaの設定
1.Lambda関数に以下のサンプルコードを貼り付けます。
本サンプルコードは、S3 Files を経由してファイル一覧の取得、ファイルの読み込み、ファイルの書き込みを行う処理の動作を確認するためのものです。
import os
import json
from datetime import datetime
# S3 Files のマウントポイント
MOUNT_PATH = "/mnt/s3"
def lambda_handler(event, context):
action = event.get("action", "list")
# ---- ファイル一覧 ----
if action == "list":
files = os.listdir(MOUNT_PATH)
return {
"statusCode": 200,
"body": {
"action": "list",
"mount_path": MOUNT_PATH,
"files": files
}
}
# ---- ファイル読み込み ----
elif action == "read":
file_path = os.path.join(MOUNT_PATH, event.get("file", "hello.txt"))
try:
with open(file_path, "r") as f:
content = f.read()
return {
"statusCode": 200,
"body": {
"action": "read",
"file": file_path,
"content": content
}
}
except FileNotFoundError:
return {
"statusCode": 404,
"body": f"{file_path} が見つかりません"
}
# ---- ファイル書き込み ----
elif action == "write":
filename = event.get(
"file",
f"output_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
)
content = event.get("content", "テスト書き込み")
file_path = os.path.join(MOUNT_PATH, filename)
with open(file_path, "w") as f:
f.write(content)
f.write(f"\n書き込み日時: {datetime.now().isoformat()}")
return {
"statusCode": 200,
"body": {
"action": "write",
"file": file_path,
"message": "S3 に直接書き込みました"
}
}
else:
return {
"statusCode": 400,
"body": "action は list / read / write を指定してください"
}
2.設定のアクセス権限で以下のマネージドポリシーを含むロールを作成して適用します。
・AmazonElasticFileSystemClientFullAccess
・AmazonS3FullAccess
・AWSLambdaBasicExecutionRole
・AWSLambdaVPCAccessExecutionRole
3.設定のVPCで、ファイルシステムを配置しているVPCを指定してLambdaを設定します。

4.設定のファイルシステムで、作成したファイルシステムIDとアクセスポイントIDを設定します。

動作確認
ファイル一覧
1.テストタブをクリックして、以下の内容をイベントJSONに入力してテストを実行します。
{
"action": "list"
}
2.結果は、ファイルが無いことが確認できます。
{
"statusCode": 200,
"body": {
"action": "list",
"mount_path": "/mnt/s3",
"files": []
}
- EC2にファイルシステムをマウントすると以下のように確認できます。
一覧を実行することにより、アクセスポイントで設定した/lambdaのフォルダが自動的に作成されます。 アクセスポイントでUID/GID:1000で設定していますので、権限755、オーナーがec2-userで作成されることが確認できます。

書き込み
1.次に書き込みのテストを行うために、以下の内容をイベントJSONに入力してテストを実行します。
{
"action": "write",
"file": "lambda-wrote-this.txt",
"content": "Lambda から S3 Files 経由で直接書き込みました!"
}
2.結果は/mnt/s3/に、ファイルが作成されることが確認できます。
{
"statusCode": 200,
"body": {
"action": "write",
"file": "/mnt/s3/lambda-wrote-this.txt",
"message": "S3 に直接書き込みました"
}
}
- ファイルが、権限664、オーナーがec2-userで作成されることが確認できます。

読み込み
1.次に読み込みのテストを行うために、以下の内容をイベントJSONに入力してテストを実行します。
{
"action": "read",
"file": "lambda-wrote-this.txt"
}
2.結果はファイル内容を読み込めることが確認できます。
{
"statusCode": 200,
"body": {
"action": "read",
"file": "/mnt/s3/lambda-wrote-this.txt",
"content": "Lambda から S3 Files 経由で直接書き込みました!\n書き込み日時: 2026-05-08T06:14:12.962908"
}
}
本動作確認では、一覧→書き込み→読み込みの順番で実施しましたが、一覧、書き込み、読み込みのいずれを実施した場合でも初回であれば、アクセスポイントで設定したルートディレクトリが作成されます。
注意点
S3バケットでディレクトリを作成する場合
ディレクトリを事前にAWSコンソールで作成する場合は、root権限で作成されますので注意が必要になります。

デフォルトのアクセスポイントをそのまま利用している場合、一覧、読み込みは問題ありませんが、書き込みで権限不足エラーが発生します。
{
"errorMessage": "[Errno 13] Permission denied: '/mnt/s3/lambda-wrote-this.txt'",
"errorType": "PermissionError",
"requestId": "7aa4c5a1-30b4-45bb-a3f3-22aee74ce1fc",
"stackTrace": [
" File \"/var/task/lambdafunction.py\", line 52, in lambdahandler\n with open(file_path, \"w\") as f:\n"
]
}
回避方法1
EC2にマウントして、オーナー、グループをec2-userに変更する。
オーナー、グループをec2-userに変更することにより、アクセスポイントの権限で書き込みを行うことができるようになります。

回避方法2
EC2にマウントして、ディレクトリの権限を757および777に変更する。
これにより他のユーザーに書き込み権限が付与されますので、書き込みを行うことができるようになります。

回避方法3
アクセスポイントのUID/GIDをroot(0)に変更する。
POSIXユーザーのUID/GIDをroot(0)に変更します。これによりroot権限で操作が可能になりますので、書き込みを行うことができるようになります。

自動的に作成されるアクセスポイントの問題
自動的に作成されるアクセスポイントを利用した場合、マウントエラーが発生する場合が確認されています。
ファイルシステムポリシーを設定しましたが、エラーが出ました。
API アクションの呼び出しに失敗しました。
エラーメッセージ: The function couldn't mount the Amazon S3 Files file system with access point arn:aws:s3files:ap-northeast-1:533267418719:file-system/fs-0f4de52f193029665/access-point/fsap-01e74f75cc19381e8.
回避方法は、アクセスポイントを再作成することにより問題が解決します。
利用料金
- S3 Filesの料金は以下のようになっています。(東京リージョン)
- 高性能ストレージ USD 0.36/GB-月
- 高性能ストレージからのファイルの読み取り USD 0.04/GB
- S3 バケットからの直接的なファイルの読み取り(128KiB以上) 無料
- ファイルの書き込み USD 0.07/GB
わかりにくいため模式図で表すと、S3 Files への書き込みでは「Lambda → S3 Files への書き込み」と「S3 Files → S3 への同期(書き込み)」の 2 つの料金が発生します。
また、S3 Files → Lambda の読み込みの場合(128 KiB 未満)は、「S3 → S3 Files への読み込み」と「S3 Files → Lambda の読み込み」の料金が発生します。128 KiB 以上の読み込みは S3 から直接ストリーミングされるため無料です。
これは、S3 Files と S3 が別のストレージであり、両者の間で同期を行う仕組みになっているため、このような料金体系になります。

例えば10GBのデータの書き込み、読み込みの場合、単純にストレージとして比較するとEFSより割高になります。
・S3 Filesの場合(読み取り128KiB以下)
- ストレージ料金:0.36 x 10 = 3.6USD
- S3ストレージ料金:0.025 x 10 = 0.25USD
- 書き込み料金:(0.07+0.04) x 10 = 1.1USD
- 読み込み料金:(0.04+0.07) x 10 = 1.1USD
- 合計:6.05USD
・S3 Filesの場合(読み取り128KiB以上)
- ストレージ料金:0.36 x 10 = 3.6USD
- S3ストレージ料金:0.025 x 10 = 0.25USD
- 書き込み料金:(0.07+0.04) x 10 = 1.1USD
- 読み込み料金:(0+0) x 10 = 0.0USD
- 合計:4.95USD
・EFSの場合
- ストレージ料金:0.36 x 10 = 3.6USD
- 書き込み料金:0.07 x 10 = 0.7USD
- 読み込み料金:0.04 x 10 = 0.4USD
-合計:4.7USD
まとめ
S3 Files の登場により、オブジェクトストレージである Amazon S3 を、EC2 や Lambda からファイルストレージのように扱えるようになりました。これにより、既存アプリケーションの移行や一時的なファイル操作など、利用シーンの幅は確かに広がっています。
ただし、S3 は本質的にはオブジェクトストレージであり、S3 Files も内部的には「オブジェクトの再アップロードによる擬似的なファイル操作」を行っています。そのため、性能やコストの観点では、従来どおり S3 をオブジェクトストレージとして利用することが主軸となり、S3 Files は EC2 や Lambda との連携で "補助的にファイルストレージ的な操作が必要な場面" に限定して使うのが現実的と考えられます。
また、設定においては、Lambda でフォルダを作成する際、方法によっては権限エラーが発生する可能性があるため注意が必要です。
この記事は私が書きました
中島
記事一覧渡世人