はじめに
AWS CloudFront では HTTP Request / Response の加工などが可能で、Origin にアクセスせず Response を返すことも可能です。
この加工は別途用意した関数で処理されますが、関数の実行機構として新しく CloudFront Functions がデビューしたとのこと。
「S3 を使った転送と同等のことが CloudFront 単体で実現できる」ということだと解釈し、試してみました。
大まかな仕組み
- Viewer request に関連付けた CloudFront Functions 関数で転送する(Status Code 301 を返す Response を生成する)
- CloudFront の Alternate Domain Names 機能で名前付け、および、暗号化する
- DNS の CNAME or ANAME で(間接的に) IP Address 付けする
S3 を利用する場合と比べると、転送機能を担っているのが S3 から CloudFront に代わりますが、その他の名前付けなどは同じです。
手順概略
- ACM 証明書作成
- CloudFront Functions 関数作成
- CloudFront ディストリビューション作成
- DNS 設定
手順詳細
ACM 証明書作成
us-east-1 にて、転送元ドメインの証明書を作成。
CloudFront Functions 関数作成
サブメニューの Distributions の下あたりに新設された Functions リンクから関数作成を始めます。
転送用の関数の内容は、例えば下記。
function handler(event) {
var DEST_LOC_BASE = 'https://specify.destination.fqdn.here';
var response = {
statusCode: 301,
statusDescription: 'Moved Permanently',
headers: {
'location': { value: DEST_LOC_BASE + event.request.uri }
}
};
return response;
}
執筆時点で const は使えませんでした。
uri は "/" で始まるパス文字列です。
CloudFront ディストリビューション作成
Origin Domain Name は、転送先ドメインの FQDN を記入しておきました。ちょっとパラドックス感もありますが、必須項目につき空にできないので。
Function associations の Viewer request にて、作成した CloudFront Functions 関数を関連付け。
Alternate Domain Names に転送元ドメインの FQDN を記入。
SSL Certificate は Custom SSL Certificate を選択し、ACM で作っておいた証明書を選択。
DNS 設定
Route53 だったら CNAME じゃなくて A の Alias を使うのが正解でしょう。Zone Apex に対しても使えます。
おわりに
初見でもスムースに構築できました。test や publish など CloudFront Functions の UI はシンプルかつ強力です。
S3 を使うより断然良いと思います。
なお、前述の関数の Compute Utilization は 25 でした。上限が 100 とのことですが、転送目的なら十分に足りそうです。