このトピックは、Discourse の設定に焦点を当てた別のトピックの補足です。ここでは、Discourse の前にリバースプロキシとして CloudFront ディストリビューションを設定する方法を説明します。
この組み合わせが必要なのは、メインのホスト名に対して既に CloudFront ディストリビューションが存在し、サブフォルダを Discourse フォーラムにプロキシしたい場合のみです。このガイドでは、読者が本番環境で CloudFront を使用した経験があることを前提としています。
トラフィックの流れ
ユーザーがサイトを読み込む際、2 つのネットワーク接続が関与します。それぞれ異なるホスト名を使用します:
- Web ブラウザは、パブリックホスト名に対して CloudFront にリクエストを送信します。
- その後、CloudFront はオリジンホスト名に対して Discourse サーバーにリクエストを送信します。
.───────. .───────. .─────────.
( browser )───▶( CF )───▶( discourse )
`───────' `───────' `─────────'
例として、Discourse サイトが https://www.example.com/forum/ から読み込まれると仮定します。使用するのは以下の通りです:
| 目的 | ホスト名 |
|---|---|
| パブリックホスト名 | www.example.com |
| オリジンホスト名 | discourse.example.com |
CloudFront の設定
これにより、少なくとも 2 つのオリジンが定義されます。1 つはメインサイト用のデフォルト、もう 1 つは Discourse サーバー用です。
また、各オリジンを指す少なくとも 2 つのビヘイビアも存在します。
デフォルトのビヘイビアとオリジンはここでは関係ありません。既に必要に応じて適切に設定されている必要があります。Discourse 固有のオリジンとビヘイビアは、以下のように設定してください。
オリジン
Discourse サーバー用の 2 つ目のオリジンは、オリジンホスト名を指すように設定します。
オリジンパスは設定しないでください。
プロトコルポリシーは HTTPS で、最小バージョンを TLSv1 に設定します。
ビヘイビア
パターンはサブフォルダに一致する必要があります。
上記のように設定されたオリジンにアタッチします。
HTTP から HTTPS へのリダイレクトを設定します。
すべての HTTP 動詞を許可します。
キャッシングを無効にします。
すべてのクライアントヘッダーを転送します。
Lambda@Edge の設定
共有ホスティング環境(discourse.org も含む)は SNI を使用します。これを CloudFront で動作させるには、Lambda@Edge を使用して、CloudFront が視聴者のリクエストからの Host ヘッダーではなく、オリジンホスト名を SNI として使用するようにする必要があります。
AWS Lambda ダッシュボードにアクセスし、新しい関数を作成します。Node.js ランタイム環境を使用し、「Basic Lambda@Edge 権限」を持つ新しいロールを作成します:
「Create Function」をクリックします。
コードエディタが表示されたら、以下のコードに置き換えます:
exports.handler = async (event, context) => {
const request = event.Records[0].cf.request;
request.headers['x-forwarded-host'] = [{
key: 'x-forwarded-host',
value: request.headers['host'][0]['value']
}];
request.headers["host"] = [{
key: 'host',
value: request.origin.custom.domainName
}];
return request;
};
「Deploy」をクリックします。
左上の「Actions」から「Deploy to Lambda@Edge」を選択します。
CloudFront ディストリビューションを選択し、リストから正しいビヘイビアを選択します:
何らかの理由で変更を加える必要がある場合は、「Deploy」した後、「バージョン」タブから「新しいバージョンを公開」し、その後、ディストリビューションを Lambda の新しいバージョンを使用するように更新してください。













