サブフォルダインストール用のCloudfrontリバースプロキシ設定

このトピックは、Discourse の設定に焦点を当てた別のトピックの補足です。ここでは、Discourse の前にリバースプロキシとして CloudFront ディストリビューションを設定する方法を説明します。

:warning: この組み合わせが必要なのは、メインのホスト名に対して既に 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 の新しいバージョンを使用するように更新してください。

「いいね!」 10