CloudFront Function を使ったBasic認証の設定

AWS,AWS-Security,CloudFront

概要

  • 今回担当した案件にて、初めて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 のサンプルが紹介されています。