SvelteKit + amplify-adapter を使って AWS Amplify にデプロイしたアプリケーションで、画像ファイルのアップロード時に以下のエラーが発生していました。
Upload error: SvelteKitError: Content-length of 605227 exceeds limit of 524288 bytes.
566KB のファイルが 512KB (524,288 bytes) の制限でエラーになっていました。
通常の SvelteKit であれば、BODY_SIZE_LIMIT
環境変数で body size limit を設定できるはずでした。
# .env
BODY_SIZE_LIMIT=52428800 # 50MB
.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;
}
bodySizeLimit
オプションをサポートしていない.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 のファイルアップロードが成功しました!🎉
.env
ファイルが process.env
に自動的に読み込まれないpatches/env.js
を修正まとめ: SvelteKit + amplify-adapter 環境でのファイルアップロード制限は、adapter の内部実装を理解して直接修正することで解決できました。環境変数システムの違いを理解することの重要性を改めて実感しました。