AWS Amplify Gen2 + SvelteKit SSR でファイルアップロードの BODY_SIZE_LIMIT を解決した話

AWS Svelte
2025-07-16 21:03 (27時間前) ytyng
View in English

問題の概要

SvelteKit + amplify-adapter を使って AWS Amplify にデプロイしたアプリケーションで、画像ファイルのアップロード時に以下のエラーが発生していました。

Upload error: SvelteKitError: Content-length of 605227 exceeds limit of 524288 bytes.

566KB のファイルが 512KB (524,288 bytes) の制限でエラーになっていました。

環境

調査過程

1. 最初の調査

通常の SvelteKit であれば、BODY_SIZE_LIMIT 環境変数で body size limit を設定できるはずでした。

# .env
BODY_SIZE_LIMIT=52428800  # 50MB

2. 環境変数の確認

すべて正しく設定されているにも関わらず、Lambda 環境で process.env.BODY_SIZE_LIMITundefined になっていました。

3. SvelteKit の環境変数システムの理解

SvelteKit では環境変数が以下のように扱われます:

調査の結果、$env/static/private では値が読み込まれるが、process.env では undefined になることが判明しました。

4. amplify-adapter の内部実装

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;
}

解決策

試行錯誤した方法

  1. svelte.config.js でのオプション設定 - amplify-adapter は bodySizeLimit オプションをサポートしていない
  2. hooks.server.ts での独自実装 - SvelteKit の内部的な制限の前に止まってしまう
  3. dotenv の使用 - Lambda 環境での .env ファイル読み込みの複雑さ

最終的な解決策

amplify-adapter の env.js を直接修正することにしました。

1. パッチファイルの作成

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 };

2. ビルドスクリプトの修正

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 のファイルアップロードが成功しました!🎉

学んだこと

  1. amplify-adapter の制約: 標準的な SvelteKit の環境変数システムと異なる動作をする
  2. Lambda 環境での環境変数: .env ファイルが process.env に自動的に読み込まれない
  3. adapter の内部実装: 問題解決のためには adapter の内部実装を理解する必要がある
  4. シンプルな解決策: 複雑なパッチよりも、直接的な修正の方が保守性が高い

今後の対応

参考リンク


まとめ: SvelteKit + amplify-adapter 環境でのファイルアップロード制限は、adapter の内部実装を理解して直接修正することで解決できました。環境変数システムの違いを理解することの重要性を改めて実感しました。

現在未評価
タイトルとURLをコピー
著者は、アプリケーション開発会社 Cyberneura を運営しています。
開発相談をお待ちしています。

アーカイブ

2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011