🗝

CloudFront + S3 + CloudFront Functions で BASIC 認証をかける

2021/05/23に公開

はじめに

CloudFront + S3 で静的な Web サイトをホスティングしている。
ステージング環境として同様のサイトを作ったが、超簡単なアクセス制限をかけるために BASIC 認証をかけたい。
こういったケースでは Lambda@Edge を使うのが主流のようだが、最近リリースされた CloudFront Functions を使ってやってみた。

手順

CloudFront Functions のサイドバーに Functions メニューがあるので、そこから以下の内容で Functions を登録する。

function handler(event) {
  var request = event.request;
  var headers = request.headers;

  // echo -n user:pass | base64
  var authString = "Basic dXNlcjpwYXNz";

  if (
    typeof headers.authorization === "undefined" ||
    headers.authorization.value !== authString
  ) {
    return {
      statusCode: 401,
      statusDescription: "Unauthorized",
      headers: { "www-authenticate": { value: "Basic" } }
    };
  }

  return request;
}

その後、Publish タブから Publish をする。

最後に Associate タブから Distribution と Cache behavior を選んで Add association する。
この時、Event Type は Viewer Request を選ぶ。

しばらくまって、 CloudFront 経由でコンテンツにアクセスすると BASIC 認証が有効になっているはず。

ポイント

CloudFront Functions は 1ms 以内に処理を返さないといけないので、予め BASE64 エンコーディングをかけておくのがポイント。
このコードで authorization ヘッダーなしだと Compute utilization は 23 だった(この値が 100 を超えると CloudFront Functions では実行できないらしい)

まとめ

CloudFront Functions 便利〜。

Discussion