# CloudFront と Route 53 を使った AWS でのサブディレクトリ設定

{% hint style="info" %}
このガイドでは、AWS CloudFront と Lambda\@Edge を使用してサブディレクトリを設定する方法を説明します。これは AWS ユーザー向けの一つの方法です。ロードバランサーと NGINX を実行している EC2 インスタンスのような別の AWS 構成をお使いの場合は、リバースプロキシを別の方法で設定する必要があるかもしれません。…に連絡してください [サポート](https://gitbook.com/docs/help-center/further-help/how-do-i-contact-support) 別の構成について案内が必要な場合。
{% endhint %}

{% stepper %}
{% step %}
**GitBookサイトの設定**

GitBook 組織で、サイドバーのドキュメントサイト名をクリックし、次に **サイトを管理** をクリックするか、 **設定** タブを開きます。 **ドメインとリダイレクト** セクションを開き、「Subdirectory」の下で **サブディレクトリを設定**.

ドキュメントをホストしたいURLを入力します。次に、ドキュメントへのアクセス用のサブディレクトリを指定します。例： `example.com/docs`、そして **設定**.

の下で **追加設定**をクリックすると、プロキシ URL が表示されます。これは次の手順で Lambda 関数を設定するときに使用します。クリップボードにコピーしてください。
{% endstep %}

{% step %}
**Lambda\@Edge 関数を作成する**

AWS コンソールにサインインして、 **Lambda**.

クリックして **関数の作成** ボタンをクリックしてください。

を選択します **一から作成**、そして次のようにします:

* 関数に説明的な名前を付けます。たとえば `gitbook-subpath-proxy。`
* 選択 **Node.js** をランタイムとして使用します（利用可能な最新バージョンを使用してください）。
* アーキテクチャとその他の設定はデフォルトのままにします。

クリック **関数の作成**.
{% endstep %}

{% step %}
**Lambda 関数コードを更新する**

Lambda 関数エディタで、デフォルトのコードを次の内容に置き換えます:

{% code lineNumbers="true" %}

```javascript
export const handler = async (event) => {
	const request = event.Records[0].cf.request;
	
	// サブディレクトリが /docs でない場合は更新してください
	const subdirectory = '/docs';
	
	// 下のプロキシ URL に更新してください
	const target = new URL('<GitBook から取得した proxy URL>');

	// rewrite: /docs* -> proxy.gitbook.site
	if (request.uri.startsWith(subdirectory)) {
		request.uri = target.pathname + request.uri.substring(subdirectory.length);

		// 末尾のスラッシュがあれば削除します
		if (request.uri.endsWith('/')) {
			request.uri = request.uri.slice(0, -1);
		}

		request.origin = {
			custom: {
				domainName: target.host,
				port: 443,
				protocol: 'https',
				path: '',
				sslProtocols: ['TLSv1.2'],
				readTimeout: 30,
				keepaliveTimeout: 5,
				customHeaders: {},
			},
		};

		request.headers['host'] = [{ key: 'host', value: target.host }];
		request.headers['x-forwarded-host'] = [{ key: 'x-forwarded-host', value: target.host }];
	}
    
	return request;
};
```

{% endcode %}

{% hint style="warning" %}
必ず `target` を 8 行目で、最初の手順で GitBook から取得したプロキシ URL に更新してください。これは次のようになります `https://proxy.gitbook.site/sites/site_XXXX`
{% endhint %}

{% hint style="warning" %}
また、 `subdirectory` も、別のサブディレクトリのパスを使っている場合は 5 行目で更新してください。 `/docs`.
{% endhint %}

クリック **デプロイ** して変更を保存します。
{% endstep %}

{% step %}
**Lambda\@Edge 用の Lambda 権限を設定する**

CloudFront で Lambda 関数を使用する前に、実行ロールが Lambda\@Edge に引き受けられるように設定する必要があります。

1. Lambda 関数で、 **設定** タブ
2. クリック **権限** を左サイドバーでクリックします
3. の下で **実行ロール**。IAM で開くためにロール名をクリックします
4. クリックして **信頼関係** タブ
5. クリック **信頼ポリシーを編集**
6. 信頼ポリシーを次の内容に置き換えます:

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "edgelambda.amazonaws.com",
                    "lambda.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

クリック **ポリシーを更新** して保存します。
{% endstep %}

{% step %}
**Lambda 関数を公開する**

Lambda\@Edge には公開済みのバージョンが必要です（ `$LATEST`).

1. ではなく） **アクション** Lambda 関数で、右上の
2. 選択 **ドロップダウンで**
3. 公開済みの新しいバージョン
4. クリック **公開**
5. **必要に応じて「CloudFront 用の初期バージョン」のような説明を追加します** 重要: `ページ上部に表示される公開済みバージョンの ARN をコピーします（末尾にバージョン番号が含まれます。たとえば`)

{% hint style="warning" %}
Lambda\@Edge 関数は **us-east-1** （N. Virginia）リージョンで作成する必要があります。別のリージョンで関数を作成した場合は、us-east-1 で再作成する必要があります。
{% endhint %}
{% endstep %}

{% step %}
**CloudFront ディストリビューションを作成する**

次へ移動します **CloudFront** を AWS コンソールで開き、 **ディストリビューションを作成**.

をクリックします。以下の設定を構成します。指定されていない設定は、デフォルトのままにしてください。

**オリジンを指定**

| 設定           | Value                               |
| ------------ | ----------------------------------- |
| **オリジンの種類**  | その他                                 |
| **カスタムオリジン** | メインの Web サイトのドメイン（例: `example.com`) |

**キャッシュ設定**

| 設定                | Value                     |
| ----------------- | ------------------------- |
| **キャッシュポリシー**     | CachingDisabled           |
| **オリジンリクエストポリシー** | AllViewerExceptHostHeader |

クリック **次に、** お好みのセキュリティ保護を選択し、 **次へ** をもう一度クリックします。

クリック **ディストリビューションを作成**.

ディストリビューションのデプロイを待ちます（ステータスは「処理中」から「有効」に変わります）。これには数分かかる場合があります。
{% endstep %}

{% step %}
**Lambda\@Edge を CloudFront に関連付ける**

CloudFront ディストリビューションがデプロイされたら:

1. ディストリビューション ID をクリックして設定を開きます
2. に移動します **ビヘイビア** タブ
3. デフォルトのビヘイビアを選択し、 **編集**
4. までスクロールして **関数の関連付け**
5. の下で **オリジンリクエスト**に移動し、 **Lambda\@Edge**
6. 内で、 **Lambda 関数 ARN** フィールドに、公開した Lambda 関数の ARN（手順 5 のもの）を貼り付けます
7. 確認する **本文を含める** 必要に応じて関数がリクエスト本文にアクセスできるようにします
8. クリック **変更を保存**
   {% endstep %}

{% step %}
**ドメインと DNS レコードを設定する**

1. CloudFront ディストリビューションのメインページで、 **一般** タブをクリックし、 **代替ドメイン名**の下で、 **ドメインを追加**
2. サブディレクトリを設定しているドメインを入力します。例: `example.com` をクリックし、 **次へ**
3. 既存の TLS 証明書を選択するか、必要に応じて新しいものを作成し、 **次へ** をもう一度クリックします
   {% endstep %}

{% step %}
**CloudFront から Route 53 の DNS レコードを設定する**

DNS に Route 53 を使用している場合は、DNS レコードを作成または更新して CloudFront ディストリビューションを指すようにする必要があります。

1. CloudFront ディストリビューションのメインページに留まり、 **一般** タブにいることを確認してから、で設定した URL の下の **代替ドメイン名** をクリックします **ドメインを CloudFront にルーティングします。**
2. 次をクリックします **ルーティングを自動的に設定** して、ドメイン用の A および AAAA DNS レコードを作成します

{% hint style="info" %}
Route 53 を使用していない場合は、DNS プロバイダーの設定を更新して、ドメインを CloudFront ディストリビューションのドメイン名に向ける必要があります。これは CloudFront ディストリビューションの詳細の「Distribution domain name」で確認できます。
{% endhint %}
{% endstep %}

{% step %}
**構成をテストする**

すべての変更が反映されたら（これには 10〜15 分かかることがあります）:

1. ブラウザを開き、サブディレクトリのパスを含めたドメインに移動します（例: `https://example.com/docs`)
2. GitBook のドキュメントサイトが表示されるはずです！

サイトがすぐに読み込まれない場合は、次を試してください:

* DNS の伝播を数分待つ
* ブラウザのキャッシュをクリアするか、シークレットウィンドウを試す
* を実行する `nslookup yourdomain.com` ターミナルで DNS が正しく解決されていることを確認します
* CloudFront ディストリビューションのステータスが「有効」であり、「処理中」ではないことを確認する

{% hint style="success" %}
おめでとうございます！これで GitBook のドキュメントはカスタムサブディレクトリ経由でアクセスできるようになりました。
{% endhint %}
{% endstep %}
{% endstepper %}

### トラブルシューティング

**Lambda 関数がトリガーされない:**

* Lambda 関数のバージョンを公開したことを確認してください（ `$LATEST`)
* Lambda 関数が us-east-1 リージョンにあることを確認します
* 信頼ポリシーに以下が含まれていることを確認します `edgelambda.amazonaws.com`

**DNS が解決されない:**

* DNS の変更は反映に時間がかかることがあります（最大 48 時間ですが、通常はもっと早く反映されます）
* Route 53 レコードが正しい CloudFront ディストリビューションを指していることを確認します
* 競合している古い DNS レコードを削除したことを確認します

**SSL 証明書エラー:**

* AWS Certificate Manager の SSL 証明書にカスタムドメインが含まれていることを確認します
* CloudFront 用の証明書は us-east-1 リージョンで作成する必要があります

**サブディレクトリが動作しない:**

* Lambda 関数内の `SUBDIRECTORY` の値が GitBook で設定した内容と一致していることを確認します
* Lambda 関数内の `target` が正しいことを確認してください
* CloudFront ログを確認して、リクエストがディストリビューションに到達しているか確認します
