概要

CloudFrontで検証サイトを配信する場合、簡易的な認証として、Basic認証をかけたい時があると思います。
ここではその手順について説明します。
なおIaC的な仕組みは使わず、ブラウザ操作で進める場合の内容になっています。

構成

  • S3
  • CloudFront
  • CloudFront Functions

Basic認証用の文字列を作る

Basic認証に用いるユーザー名/パスワードを準備します。
色々なやり方があると思いますが、コマンドラインで作るなら、次のように作成できます。

echo -n "test:hoge" | base64
# dGVzdDpob2dl

パスワード生成のWebサービス等もありますが、漏洩リスクとなるためあまりお勧めできません。

CloudFront Functionsを作成する

CloudFront Functionsは、AWS CloudFrontサービスの「Functions」ないし「関数」です。
JavaScriptコードを実行することができるので、ここでBasic認証の処理を行います。
「関数」->「関数を作成」から作成し、コードを貼り付けます。

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

    var authResponse = basicAuth(request);
    if (authResponse) {
      return authResponse;
    }

    return rewriteIndexHtml(request);
}

function basicAuth(request) {
    var expected = 'Basic dGVzdDpob2dl'; // 上で生成したダミー値
    var headers = request.headers;

    if (headers.authorization && headers.authorization.value === expected) {
      return null;
    }

    return {
      statusCode: 401,
      statusDescription: 'Unauthorized',
      headers: {
        'www-authenticate': { value: 'Basic' },
        'cache-control': { value: 'no-store' }
      },
      body: 'Unauthorized'
    };
}

function rewriteIndexHtml(request) {
    var uri = request.uri;

    if (uri.endsWith('/')) {
      request.uri = uri + 'index.html';
    } else if (!uri.includes('.')) {
      request.uri = uri + '/index.html';
    }

    return request;
}

Jekyllの構成では、リクエストURIを index.html に書き換える必要があるため、rewriteIndexHtml部分で一手間かけています。

FunctionをCloudFrontのディストリビューションに関連づける

あとは「発行」メニューから、ディストリビューションのビューワーリクエストと関連づければ完了です。

動作確認

ブラウザでアクセスし、Basic認証が表示されればOKです。
念の為トップ以外のページが問題なく開けるかもよく確認しておきましょう。