【Amazon CloudFront】Lambda@Edgeを使ってS3 内コンテンツのBasic認証を作成してみた

記事タイトルとURLをコピーする

こんにちは!技術4課のイーゴリです。

Lambda@Edgeを使ってS3 内コンテンツのBasic認証を作成してみたので、本件の記事ではご紹介致します。

f:id:swx-korotkov:20220405100709p:plain

前提条件

  • ウェブサイトアクセスのアクセス許可の設定済みのS3バケット
  • CloudFrontのディストリビューション

事前準備

今回はS3バケットの作成及びPublicアクセス権限の設定は省きますが、ご覧になりたい方は下記の公式ページをご参考ください。

S3バケットの作成

docs.aws.amazon.com

ウェブサイトアクセスのアクセス許可の設定

docs.aws.amazon.com

CloudFrontの設定

docs.aws.amazon.com

上記の結果でCloudFrontまでアクセスができました!

f:id:swx-korotkov:20220401130222p:plain

ここからやっと本題に参ります。

Lambda@Edgeの概要

Lambda@EdgeとはCloudFrontのエッジロケーションからコードを実行するLambda関数のことで、ユーザに近い場所でコードが実行されるので高速なコンテンツ配信が可能になる仕組みです。

CloudFrontに4つのタイプがあります。それぞれのリクエストに対してLambdaのコードを適用することが出来ます。

タイプ 説明
ビューワーリクエスト (Viewer request) CloudFrontがエンドユーザーからリクエストを貰う時
オリジンリクエスト (Origin request) CloudFrontからオリジンへリクエストを転送する時
オリジンレスポンス (Origin response) CloudFrontがオリジンからの応答を受ける時
ビューワーレスポンス (Viewer response) CloudFrontがエンドユーザーに応答する前

f:id:swx-korotkov:20220331185939p:plain

Lambda@Edge用のIAMロールの作成

[サービス]>[IAM]>[ロール]>[ロールを作成]をクリックします。

[Lambda]を選択し、[次へ]をクリックします。

f:id:swx-korotkov:20220401111701p:plain

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

f:id:swx-korotkov:20220401111844p:plain

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

f:id:swx-korotkov:20220401112145p:plain

下記のURLに記載してある通り"edgelambda.amazonaws.com"を追加しないといけないため、信頼関係を編集します。

docs.aws.amazon.com

対象のIAMロールに入って、[信頼関係]で[編集]ボタンをクリックします。

f:id:swx-korotkov:20220401112634p:plain

下記の設定を入力し、保存します。

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "Service": [
               "lambda.amazonaws.com",
               "edgelambda.amazonaws.com"
            ]
         },
         "Action": "sts:AssumeRole"
      }
   ]
}

f:id:swx-korotkov:20220401112841p:plain

Lambda関数の作成

Lambda@Edgeを作成するには必ずLambda関数をバージニア北部(us-east-1)のリージョンで作成しないといけませんので、ご注意ください

重要

US-East-1 (バージニア北部) リージョン (us-east-1) にいることを確認します。Lambda@Edge 関数を作成するには、このリージョンに設定されている必要があります。

docs.aws.amazon.com

[サービス]>[Lambda]>[関数]>[関数の作成]をクリックします。

f:id:swx-korotkov:20220401114020p:plain

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

f:id:swx-korotkov:20220401120042p:plain

f:id:swx-korotkov:20220401114804p:plain

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

f:id:swx-korotkov:20220401115030p:plain

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

f:id:swx-korotkov:20220401121907p:plain

上記の画像にあるコードを消して、この記事のコードをコピーして貼り付けます。[Deploy]をクリックします。

authUser にユーザ名、 authPass にパスワードを記載します。

f:id:swx-korotkov:20220401122407p:plain

Lambda@Edge へのデプロイ

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

f:id:swx-korotkov:20220401122847p:plain

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

f:id:swx-korotkov:20220401125219p:plain

f:id:swx-korotkov:20220401124355p:plain

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

f:id:swx-korotkov:20220401125234p:plain

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

f:id:swx-korotkov:20220401140654p:plain
デプロイ中

f:id:swx-korotkov:20220401140633p:plain
デプロイ済み

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

f:id:swx-korotkov:20220401125430p:plain

動作確認

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

f:id:swx-korotkov:20220401125856p:plain

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

f:id:swx-korotkov:20220401125949p:plain

f:id:swx-korotkov:20220401130041p:plain

考慮事項

Lambda@Edgeを削除したい場合

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

f:id:swx-korotkov:20220401141951p:plain

blog.serverworks.co.jp

Lambda@Edge 関数の例

公式AWSページにLambda@Edge 関数の例がありますので、是非ご覧ください。

docs.aws.amazon.com

以上、御一読ありがとうございました。

イーゴリ (記事一覧)

クラウドインテグレーション部・エンジニア

特にTerraform(自動化)、ネットワーク系、DNS、VDI、Windows Serverに興味があります

日本国内旅行・ドライブが好きです