前提
・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ページが表示されます。