---
slug: "sveltekit-amplify-body-size-limit"
title: "AWS Amplify Hosting + SvelteKit SSR でファイルアップロードの BODY_SIZE_LIMIT を解決した話"
description: "SvelteKit + amplify-adapter を使って AWS Amplify にデプロイしたアプリケーションで、Upload error: SvelteKitError: Content-length of 605227 exceeds limit of 524288 bytes. が発生していたのを解消しました。"
url: "https://www.ytyng.com/blog/sveltekit-amplify-body-size-limit"
publish_date: "2025-07-16T12:03:07Z"
created: "2025-07-16T12:03:07.617Z"
updated: "2026-02-27T08:47:11.124Z"
categories: ["AWS", "Svelte"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20250716/e4c76d80ff4f45c79b25ebb5e0f2aa5d.png.webp?width=768"
has_video: true
has_music: true
video_urls: ["https://media.ytyng.net/ytyng-blog/324/featured-video-1.mp4", "https://media.ytyng.net/ytyng-blog/324/featured-video-2.mp4", "https://media.ytyng.net/ytyng-blog/324/featured-video-3.mp4"]
music_urls: ["https://media.ytyng.net/ytyng-blog/324/featured-music-324-1.mp3", "https://media.ytyng.net/ytyng-blog/324/featured-music-324-2.mp3"]
lang: "ja"
---

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

## 問題の概要

SvelteKit + amplify-adapter を使って AWS Amplify Hosting にデプロイしたアプリケーションで、画像ファイルのアップロード時に以下のエラーが発生していました。

```
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 Hosting (SSR)
- Node.js Lambda 環境

## 調査過程

### 1. 最初の調査

通常の SvelteKit であれば、`BODY_SIZE_LIMIT` 環境変数で body size limit を設定できるはずでした。

```bash
# .env
BODY_SIZE_LIMIT=52428800  # 50MB
```

### 2. 環境変数の確認

- AWS Amplify の環境変数設定 ✅
- AWS Systems Manager Parameter Store ✅
- `.env` ファイル ✅

すべて正しく設定されているにも関わらず、Lambda 環境で `process.env.BODY_SIZE_LIMIT` が `undefined` になっていました。

### 3. SvelteKit の環境変数システムの理解

SvelteKit では環境変数が以下のように扱われます：

- `$env/static/private` - ビルド時に `.env` ファイルから読み込まれる
- `process.env` - 実行時の環境変数

調査の結果、`$env/static/private` では値が読み込まれるが、`process.env` では `undefined` になることが判明しました。

### 4. amplify-adapter の内部実装

amplify-adapter のソースコードを調査すると、`handler.js` で以下のように実装されていました：

```javascript
const body_size_limit = parseInt(env('BODY_SIZE_LIMIT', '524288'));
```

`env` 関数は `env.js` で定義されており、`process.env` から環境変数を読み込んでいました：

```javascript
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 に設定：

```javascript
/* 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` でビルド後にパッチファイルをコピー：

```bash
# コンピューティングに必要なアセットをコピーして、コンピューティング環境を構築する。
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. **シンプルな解決策**: 複雑なパッチよりも、直接的な修正の方が保守性が高い

## 今後の対応

- 他のサイズ制限が必要な場合は `patches/env.js` を修正
- amplify-adapter の更新時は再度パッチが必要
- 可能であれば amplify-adapter のコントリビューションを検討

## 参考リンク

- [amplify-adapter GitHub](https://github.com/gzimbron/amplify-adapter)
- [SvelteKit Environment Variables](https://kit.svelte.dev/docs/modules#$env-static-private)
- [AWS Amplify Documentation](https://docs.amplify.aws/)

---

**まとめ**: SvelteKit + amplify-adapter 環境でのファイルアップロード制限は、adapter の内部実装を理解して直接修正することで解決できました。環境変数システムの違いを理解することの重要性を改めて実感しました。
