こんにちは!技術4課のイーゴリです。
Lambda@Edgeを使ってS3 内コンテンツのBasic認証を作成してみたので、本件の記事ではご紹介致します。

前提条件
- ウェブサイトアクセスのアクセス許可の設定済みのS3バケット
- CloudFrontのディストリビューション
事前準備
今回はS3バケットの作成及びPublicアクセス権限の設定は省きますが、ご覧になりたい方は下記の公式ページをご参考ください。
S3バケットの作成
ウェブサイトアクセスのアクセス許可の設定
CloudFrontの設定
上記の結果でCloudFrontまでアクセスができました!

ここからやっと本題に参ります。
Lambda@Edgeの概要
Lambda@EdgeとはCloudFrontのエッジロケーションからコードを実行するLambda関数のことで、ユーザに近い場所でコードが実行されるので高速なコンテンツ配信が可能になる仕組みです。
CloudFrontに4つのタイプがあります。それぞれのリクエストに対してLambdaのコードを適用することが出来ます。
| タイプ | 説明 |
|---|---|
| ビューワーリクエスト (Viewer request) | CloudFrontがエンドユーザーからリクエストを貰う時 |
| オリジンリクエスト (Origin request) | CloudFrontからオリジンへリクエストを転送する時 |
| オリジンレスポンス (Origin response) | CloudFrontがオリジンからの応答を受ける時 |
| ビューワーレスポンス (Viewer response) | CloudFrontがエンドユーザーに応答する前 |

Lambda@Edge用のIAMロールの作成
[サービス]>[IAM]>[ロール]>[ロールを作成]をクリックします。
[Lambda]を選択し、[次へ]をクリックします。

[AWSLambdaBasicExecutionRole]ポリシーを追加し、次へ進みます。

IAMロール名を記載し、設定を完了します。

下記のURLに記載してある通り"edgelambda.amazonaws.com"を追加しないといけないため、信頼関係を編集します。
対象のIAMロールに入って、[信頼関係]で[編集]ボタンをクリックします。

下記の設定を入力し、保存します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"edgelambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}

Lambda関数の作成
Lambda@Edgeを作成するには必ずLambda関数をバージニア北部(us-east-1)のリージョンで作成しないといけませんので、ご注意ください。
重要
US-East-1 (バージニア北部) リージョン (us-east-1) にいることを確認します。Lambda@Edge 関数を作成するには、このリージョンに設定されている必要があります。
[サービス]>[Lambda]>[関数]>[関数の作成]をクリックします。

今回は記事のために、この記事にあるコードを使いまわしますので、[ランタイム]の画面でNode.jsを選択し、Lambda関数名を入力します。そして前回作成した「lambda-edge」のIAMロールを使いたいため、[既存のロールを使用する]を選択した上、「lambda-edge」を選択します。


[関数の作成]をクリックします。

Lambda関数が作成できました!下にある[index.js]をクリックし、デフォルトのコードの部分を変えます。

上記の画像にあるコードを消して、この記事のコードをコピーして貼り付けます。[Deploy]をクリックします。
※ authUser にユーザ名、 authPass にパスワードを記載します。

Lambda@Edge へのデプロイ
[アクション]>[Lambda@Edge へのデプロイ]をクリックします。

[Lambda@Edge へのデプロイ]の[キャッシュ動作]で「*」(すべて)のまま残し、[CloudFront イベント]で「ビューワーリクエスト」を選択します。


[Lambda@Edge へのデプロイを確認]にチェックを入れて、[デプロイ]をクリックします。

CloudFrontの[最終変更日]が「デプロイ」のステータスになっており、少し時間が立つと時刻が表示されますので、完了となります。


無事にLambda@EdgeをCloudFrontに紐付けることができました!

動作確認
CloudFrontのURLにアクセスしますと、下記のBasic認証の画面が表示されます!

適切な認証情報を入力し、[ログイン]をクリックしますと、無事にログインできました!


考慮事項
Lambda@Edgeを削除したい場合
Lambda@Edgeを削除したい時に、下記のようなエラーが発生しますので、下記の記事をご参考ください。

Lambda@Edge 関数の例
公式AWSページにLambda@Edge 関数の例がありますので、是非ご覧ください。
以上、御一読ありがとうございました。
本田 イーゴリ (記事一覧)
カスタマーサクセス部
・2024 Japan AWS Top Engineers (Security)
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE
趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽