CloudFrontとRoute 53を使ってAWSでサブディレクトリを設定する
AWS CloudFrontとRoute 53を使って、/docsサブディレクトリでドキュメントをホストします。
GitBookサイトの設定
GitBook の組織で、サイドバーのドキュメントサイト名をクリックし、次に サイトを管理 または 設定 タブを開いて ドメインとリダイレクト セクションを開き、「Subdirectory」の下で、クリック サブディレクトリを設定.
ドキュメントをホストしたいURLを入力してください。次に、ドキュメントにアクセスするためのサブディレクトリを指定します。例: example.com/docs、そして 設定.
次の項目の下で 追加設定すると、プロキシ URL が表示されます。次の手順で Lambda 関数を設定するときにこれを使用します。クリップボードにコピーしてください。
Lambda@Edge 関数を作成する
AWS コンソールにサインインし、 Lambda.
をクリックするか、 関数の作成 ボタン。
選択 一から作成、次に:
関数にわかりやすい名前を付けます。たとえば
gitbook-subpath-proxy。を選択します Node.js をランタイムとして使用します(利用可能な最新バージョンを使用してください)。
アーキテクチャとその他の設定はデフォルトのままにします。
クリックして 関数の作成.
Lambda 関数のコードを更新する
Lambda 関数エディタで、デフォルトのコードを次の内容に置き換えます:
export const handler = async (event) => {
const request = event.Records[0].cf.request;
// サブディレクトリが /docs でない場合は更新
const subdirectory = '/docs';
// 以下のプロキシ URL に更新
const target = new URL('<GitBook から取得した proxy URL>');
// 書き換え: /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;
};必ず target を 8 行目で、最初の手順で GitBook から取得したプロキシ URL に更新してください。これは次のようになります https://proxy.gitbook.site/sites/site_XXXX
また、 subdirectory を 5 行目で、次のパスではなく別のサブディレクトリパスを使っている場合は更新してください: /docs.
クリックして デプロイ して変更を保存します。
Lambda@Edge 用の Lambda 権限を設定する
CloudFront で Lambda 関数を使用する前に、Lambda@Edge がその関数を引き受けられるように実行ロールを設定する必要があります。
Lambda 関数で、 設定 タブ
クリックして 権限 を左側のサイドバーで
次の項目の下で 実行ロールをクリックして IAM で開きます
をクリックするか、 信頼関係 タブ
クリックして 信頼ポリシーを編集
信頼ポリシーを次の内容に置き換えます:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"edgelambda.amazonaws.com",
"lambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}クリックして ポリシーを更新 して保存します。
Lambda 関数を公開する
Lambda@Edge では公開済みのバージョンが必要です( $LATEST).
Lambda 関数で、 アクション 右上のドロップダウンをクリックし、
を選択します 新しいバージョンを公開
必要に応じて「CloudFront 用の初期バージョン」などの説明を追加します
クリックして 公開
重要: ページ上部に表示される公開済みバージョンの ARN をコピーしてください(末尾にバージョン番号が付く形式です。たとえば
arn:aws:lambda:us-east-1:123456789:function:gitbook-subpath-proxy:1)
Lambda@Edge 関数は us-east-1 (米国東部 1(バージニア北部))リージョンで作成する必要があります。別のリージョンで関数を作成した場合は、us-east-1 で作り直す必要があります。
CloudFront ディストリビューションを作成する
に移動します AWS コンソールで CloudFront を開き、 にクリック ディストリビューションを作成.
次の設定を構成します。指定がない設定はデフォルトのままにしてください。
オリジンを指定
オリジンの種類
その他
カスタムオリジン
メインの Web サイトのドメイン(例: example.com)
キャッシュ設定
キャッシュポリシー
CachingDisabled
オリジンリクエストポリシー
AllViewerExceptHostHeader
クリックして 次に、 お好みのセキュリティ保護を選択してから、 次へ をもう一度クリックします。
クリックして ディストリビューションを作成.
ディストリビューションのデプロイが完了するまで待ちます(ステータスは「In Progress」から「Enabled」に変わります)。数分かかる場合があります。
Lambda@Edge を CloudFront に関連付ける
CloudFront ディストリビューションがデプロイされたら:
ディストリビューション ID をクリックして設定を開きます
に移動し、 ビヘイビア タブ
デフォルトのビヘイビアを選択して、 編集
下にスクロールして 関数の関連付け
次の項目の下で オリジンリクエスト、次を選択します Lambda@Edge
次の場所で Lambda 関数 ARN フィールドに、公開した Lambda 関数の ARN を貼り付けます(手順 5 から)
確認してください 本文を含める 必要に応じて関数がリクエスト本文にアクセスできるようにするため
クリックして 変更を保存
ドメインと DNS レコードを設定する
CloudFront ディストリビューションのメインページで、 全般 タブをクリックし、 代替ドメイン名、をクリックします ドメインを追加
サブディレクトリを構成するドメインを入力します。例:
example.comに戻って 次へ既存の TLS 証明書を選択するか、必要に応じて新規作成し、 次へ をもう一度クリックします
CloudFront から Route 53 DNS レコードを設定する
DNS に Route 53 を使用している場合は、DNS レコードを作成または更新して CloudFront ディストリビューションを指すようにする必要があります。
CloudFront ディストリビューションのメインページのまま、 全般 タブを開き、その下の、で設定した URL の下に 代替ドメイン名、 をクリックします Route ドメインを CloudFront にルーティングします。
をクリックします ルーティングを自動的に設定 して、ドメインの A および AAAA の DNS レコードを作成します
設定をテストする
すべての変更が伝播したら(これには 10〜15 分かかることがあります):
ブラウザを開き、サブディレクトリのパス付きでドメインに移動します(例:
https://example.com/docs)GitBook のドキュメントサイトが表示されるはずです!
サイトがすぐに読み込まれない場合は、次を試してください:
DNS の伝播を待つために数分待つ
ブラウザのキャッシュをクリアするか、シークレットウィンドウを試す
実行
nslookup yourdomain.comをターミナルで実行して、DNS が正しく解決されているか確認するCloudFront ディストリビューションのステータスが「In Progress」ではなく「Enabled」になっているか確認する
おめでとうございます!GitBook のドキュメントがカスタムサブディレクトリ経由でアクセスできるようになりました。
トラブルシューティング
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 リージョンで作成する必要があります
サブディレクトリが機能しない:
確認してください
SUBDIRECTORYLambda 関数内の値が GitBook で設定した内容と一致していること確認してください
targetLambda 関数内のCloudFront ログを確認して、リクエストがディストリビューションに到達しているか見てください
最終更新
役に立ちましたか?