SvelteKit + amplify-adapter を使って AWS Amplify にデプロイしたアプリケーションで、画像ファイルのアップロード時に以下のエラーが発生していました。
Upload error: SvelteKitError: Content-length of 605227 exceeds limit of 524288 bytes.
566KB のファイルが 512KB (524,288 bytes) の制限でエラーになっていました。
- SvelteKit
- amplify-adapter 0.2.0
- AWS Amplify Gen2 (SSR)
- Node.js Lambda 環境
通常の SvelteKit であれば、BODY_SIZE_LIMIT
環境変数で body size limit を設定できるはずでした。
# .env
BODY_SIZE_LIMIT=52428800 # 50MB
- AWS Amplify の環境変数設定 ✅
- AWS Systems Manager Parameter Store ✅
.env
ファイル ✅
すべて正しく設定されているにも関わらず、Lambda 環境で process.env.BODY_SIZE_LIMIT
が undefined
になっていました。
SvelteKit では環境変数が以下のように扱われます:
$env/static/private
- ビルド時に.env
ファイルから読み込まれるprocess.env
- 実行時の環境変数
調査の結果、$env/static/private
では値が読み込まれるが、process.env
では undefined
になることが判明しました。
amplify-adapter のソースコードを調査すると、handler.js
で以下のように実装されていました:
const body_size_limit = parseInt(env('BODY_SIZE_LIMIT', '524288'));
env
関数は env.js
で定義されており、process.env
から環境変数を読み込んでいました:
function env(name, fallback) {
const prefixed = "" + name;
return prefixed in process.env ? process.env[prefixed] : fallback;
}
- svelte.config.js でのオプション設定 - amplify-adapter は
bodySizeLimit
オプションをサポートしていない - hooks.server.ts での独自実装 - SvelteKit の内部的な制限の前に止まってしまう
- dotenv の使用 - Lambda 環境での
.env
ファイル読み込みの複雑さ
amplify-adapter の env.js
を直接修正することにしました。
patches/env.js
を作成し、BODY_SIZE_LIMIT
を強制的に 50MB に設定:
/* global "" */
const expected = new Set([
'SOCKET_PATH',
'HOST',
'PORT',
'ORIGIN',
'XFF_DEPTH',
'ADDRESS_HEADER',
'PROTOCOL_HEADER',
'HOST_HEADER',
'BODY_SIZE_LIMIT',
]);
if ("") {
for (const name in process.env) {
if (name.startsWith("")) {
const unprefixed = name.slice("".length);
if (!expected.has(unprefixed)) {
throw new Error(
`You should change envPrefix (${""}) to avoid conflicts with existing environment variables — unexpectedly saw ${name}`
);
}
}
}
}
/**
* @param {string} name
* @param {any} fallback
*/
function env(name, fallback) {
// BODY_SIZE_LIMIT は強制的に 50MB (52428800 bytes) を返す
if (name === 'BODY_SIZE_LIMIT') {
return '52428800';
}
const prefixed = "" + name;
return prefixed in process.env ? process.env[prefixed] : fallback;
}
export { env };
sh/build-for-amplify.sh
でビルド後にパッチファイルをコピー:
# コンピューティングに必要なアセットをコピーして、コンピューティング環境を構築する。
cp .env build/compute/default/.env
cd build/compute/default/
npm i --production
cd -
# BODY_SIZE_LIMIT を 50MB に固定した env.js をコピー
cp patches/env.js build/compute/default/env.js
echo "✅ env.js patched with BODY_SIZE_LIMIT=52428800 (50MB)"
修正後、605KB のファイルアップロードが成功しました!🎉
- amplify-adapter の制約: 標準的な SvelteKit の環境変数システムと異なる動作をする
- Lambda 環境での環境変数:
.env
ファイルがprocess.env
に自動的に読み込まれない - adapter の内部実装: 問題解決のためには adapter の内部実装を理解する必要がある
- シンプルな解決策: 複雑なパッチよりも、直接的な修正の方が保守性が高い
- 他のサイズ制限が必要な場合は
patches/env.js
を修正 - amplify-adapter の更新時は再度パッチが必要
- 可能であれば amplify-adapter のコントリビューションを検討
まとめ: SvelteKit + amplify-adapter 環境でのファイルアップロード制限は、adapter の内部実装を理解して直接修正することで解決できました。環境変数システムの違いを理解することの重要性を改めて実感しました。