前提

・ALBが作成されていること
・ALBのターゲットグループにテスト用WebサーバのEC2が登録されていること
・ALBのリスナールールが3つ登録されている場合の説明です。

※ALBの作成は下記の記事を参考
AWS CloudFormationでALBを作成してみました(CLI)

概要

・ALBのリスナールールで Authorization ヘッダーをチェックする
・Lambda で WWW-Authenticate: Basic を返す

Lambdaで認証処理の作成

・一から作成を選択
・関数名を入力(今回はKobayashi-Tyo-Lambda-BasicAuthとします)
・ランタイムはNode.js 14.xを選択
・実行ロールは基本的な Lambda アクセス権限で新しいロールを作成を選択
・詳細設定は特に何も選択しない
・関数の作成ボタンを押下

・index.jsに以下のコードを貼り付けて、Deployボタンを押下

exports.handler = async (event, context) => {
    const headers = event.headers || {};

    // ALB Health check
    if (headers['user-agent'] === 'ELB-HealthChecker/2.0') {
        return {
            statusCode: 200,
            statusDescription: '200 OK',
            isBase64Encoded: false,
            headers: {
                'Content-Type': 'text/html'
            }
        };
    }

    return {
        statusCode: 401,
        statusDescription: '401 Unauthorized',
        body: 'Unauthorized',
        isBase64Encoded: false,
        headers: {
            'WWW-Authenticate': 'Basic',
            'Content-Type': 'text/html'
        }
    };
};

ALBのターゲットグループ(Lambda)の作成

Lambda関数をターゲットとするターゲットグループを作成します。

・ターゲットタイプにLambda関数を選択
・ターゲットグループ名を入力(今回はbasic-authとします)
・ヘルスチェックの有効化をチェック
・次へボタンを押下


・先ほど作ったLambda関数を選択
・ターゲットグループの作成ボタンを押下

ALBのリスナールールの編集

・画面上部の編集ボタンを押下
・ルールの編集を押下
・既存ルール削除ボタンを押下
・IFの箇所で`HTTPヘッダーを選択
・ヘッダーにAuthorizationを入力
・値にBasic {ID:パスワードをBase64エンコードした値}を入力(Basicの次にスペースを入れること)
・Base64エンコード方法は以下を参照(IDがhogehoge, パスワードがfugafugaの場合)

$ echo -n 'hogehoge:fugafuga' | base64
aG9nZWhvZ2U6ZnVnYWZ1Z2E=

・既存の条件を削除


・新規条件を追加し、更新ボタンを押下

・リスナールール1が下記のように更新されます。

・同じ方法でリスナールール2が下記のように更新されます。

・最後のリスナールールの転送先をALBのターゲットグループ(Lambda)に変更する

ベーシック認証の動作確認

リスナールール1(ALBのターゲットに登録されているEC2のWeb画面)の動作確認

・ALBのDNS名+[/test.html]をアクセスすると、下記の認証画面が表示されます。


・「キャンセル」ボタンを押下する場合、認証失敗します。

・ユーザ名、パスワードを入力し、「キャンセル」ボタンを押下する場合、認証が成功します。(リスナールール1)

ALBのターゲットに登録されているEC2のWeb画面が表示されます。

リスナールール2(Sorryページ)の動作確認

・リスナールールの2の順番を一番上に上げます。

・アクセスすると、固定レスポンスのSorryページが表示されます。

Last modified: 2021-10-29

Author