CloudFront Function を使ったBasic認証の設定
概要
- 今回担当した案件にて、初めてCloudFront Function を使用しました。それでは、以下にCloudFront Function を使ったBasic認証の設定方法をまとめたいと思います。
 - Basic以外のサンプルは、こちらに記載があります。活用ください。
 
CloudFront を準備する
- 先ず、CloudFront を準備してください。ここでは、CloudFront およびオリジンを構築する方法は省略します。
 - 今回使用するCloudFront には、オリジンにAPI Gateway – Lambda を配置しており、curl を実行すると下記の様に 
"CloudFront Function is fun!!"が返ります。 
niikawa@niikawa1:~$ curl https://d1vmj58jrb59di.cloudfront.net/dev
"CloudFront Function is fun!!"
CloudFront Function を作る
- AWSマネジメントコンソールからCloudFrontを選択します。
 - 左メニューから関数を選択します。
 - 次に、「関数を作成」を選択します。
 - 関数の名前、関数の説明を入力します。
 
- 関数コードに下記コードを貼り付け、「変更を保存」を選択します。authUser, authPass は変更下さい。
 
var authUser = 'user1';
var authPass = 'password1';
function handler(event) {
    var request = event.request;
    var headers = request.headers;
    var authString = 'Basic ' + (authUser + ':' + authPass).toString('base64');
    if (
        typeof headers.authorization === 'undefined' ||
        headers.authorization.value !== authString
    ) {
        return {
            statusCode: 401,
            statusDescription: 'Unauthorized',
            headers: {
                'www-authenticate': {value: 'Basic'}
            }
        };
    }
    return request;
}
- 発行タブを選択、「関数を発行」を選択します。
 
- 関連付けられているディストリビューションにて、「関連付けを追加」を選択します。以下を指定します。
- ディストリビューションに作成済みのCloudFrontのディストリビューション名を選択
 - イベントタイプに「Viewer Request」を選択
 - キャッシュビヘイビアに対象のキャッシュビヘイビアを指定(追加のビヘイビアがなければ、Default(*)を選択)
 - 「関連付けを追加」を押す
 
 
- 関数が発行され、CloudFront のビヘイビアに関連付けされました。
 
- CloudFront のビヘイビアの設定からも関数の関連付けが確認可能です。(以下は、CloudFront のビヘイビア設定画面)
 
Basic 認証をテストする
ブラウザからアクセスする
- ブラウザからアクセスした場合、下記のログイン画面が表示されます。
 
- Basic認証後、無事に、"CloudFront Function is fun!!" が出力されました。
 
ターミナルから curl する
- ターミナルから curlコマンドで確認する場合は、先ず「authUser:authPass」をbase64コマンドでエンコードします。
 
niikawa@niikawa1:~$ echo -n "user1:password1" | base64
dXNlcjE6cGFzc3dvcmQx
- 次に、curl にAuthorizationヘッダにBasic認証を指定し、かつ認証のためのユーザー名とパスワードを付けてリクエストを行います。ユーザー名とパスワードは、先ほどのbase64コマンドでエンコードした値になります。
 
niikawa@niikawa1:~$ curl https://d1vmj58jrb59di.cloudfront.net/dev -H "Authorization:Basic dXNlcjE6cGFzc3dvcmQx"
"CloudFront Function is fun!!"
- 認証としては簡易となりますが、CloudFrontに簡単にBasic認証が設定できました。また、Lambda と異なり、CloudFront Functionで実装しているため動作が軽いです。
 
参考資料
- Introducing CloudFront Functions – Run Your Code at the Edge with Low Latency at Any Scale
 
- CloudFront Function のサンプルが紹介されています。
 
- Add a Cache-Control header to the response
 - Add a cross-origin resource sharing (CORS) header to the response
 - Add cross-origin resource sharing (CORS) header to the request
 - Add security headers to the response
 - Add a True-Client-IP header to the request
 - Redirect the viewer to a new URL
 - Add index.html to request URLs that don’t include a file name
 - Validate a simple token in the request