LoginSignup
53
52

More than 5 years have passed since last update.

Lambda + CloudFront + S3でBasic認証する

Last updated at Posted at 2018-05-13

やりたいこと

  • S3に配置したHTMLファイルを表示する前にBasic認証
    • ユーザがCloudFrontへアクセスしたらBasic認証される

構成

qiita.png

手順概要

  1. S3作成
    1-1. バケット作成
    1-2. Webサイトホスティング有効
  2. CloudFront作成
  3. Lambda作成
    3-1. Lambda用Role作成
    3-2. 関数作成
    3-3. バージョニング設定
    3-4. トリガー設定

手順

1.S3作成

1-1. バケット作成

バケット名を入力し次へ
WS000021.JPG
何もせず次へ
WS000022.JPG
何もせず次へ(パブリックアクセスは推奨値直か念のため確認)
WS000023.JPG
バケットを作成
WS000024.JPG

1-2. Webサイトホスティング有効

作成したバケットを作成
WS000025.JPG
プロパティタブ内のStatic website hostingを選択
WS000026.JPG
チェックを入れて有効化しindex.htmlを入力後保存する
WS000027.JPG

2.CloudFront作成

Webタイプを選択する
WS000028.JPG

下記情報を入力する

  • Origin Domain Name:作成したS3を選択
  • Restrict Bucket Access:Yes(S3へのアクセスをCloudFront経由のみに制限する)
  • Origin Access Identity:Create a New Identity(アクセスポリシーを作成する)
  • Grant Read Permissions on Bucket:Yes, Update Bucket Policy(S3のポリシーを自動アップデートする)
    WS000029.JPG
    下記情報を入力

  • Viewer Protocol Policy:Redirect HTTP to HTTPS(HTTPできたらHTTPSへリダイレクトする)
    WS000030.JPG

index.htmlを入力する
WS000031.JPG

3.Lambda作成

3-1. Lambda用Role作成

ロールの作成
WS000032.JPG
Lambda用のRoleにする
WS000033.JPG
ポリシーを作成する
WS000034.JPG
JSONタブを選択し下記ポリシーを入力する
WS000035.JPG

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:EnableReplication*",
                "iam:CreateServiceLinkedRole",
                "cloudfront:CreateDistribution",
                "cloudfront:UpdateDistribution"
            ],
            "Resource": "*"
        }
    ]
}

ポリシー名を入力し作成完了
WS000036.JPG
Role作成画面へ戻り作成したポリシーを選択する
WS000037.JPG
Role名を入力し作成完了
WS000038.JPG
作成したRoleを選択する
WS000039.JPG
信頼関係を編集する
WS000040.JPG
edgelambdaを追加する
WS000041.JPG

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

信頼関係が追加されたことを確認する
WS000042.JPG

3-2. 関数作成

Lambd画面で関数を作成する
WS000043.JPG
一から作成し名前と作成したRoleを選択し関数の作成を押下する
WS000044.JPG
index.jsに下記を入力し保存をする
WS000045.JPG

'use strict';
exports.handler = (event, context, callback) => {

    // Get request and request headers
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    console.log('request: ' + JSON.stringify(request));
    // Configure authentication
    const authUser = 'Takahashi';
    const authPass = 'Password';

    // Construct the Basic Auth string
    const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64');

    // Require Basic authentication
    if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
        const body = 'Unauthorized';
        const response = {
            status: '401',
            statusDescription: 'Unauthorized',
            body: body,
            headers: {
                'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
            },
        };
        callback(null, response);
    }

    // Continue request processing if authentication passed
    callback(null, request);
};

3-3. バージョン作成

アクションから新しいバージョンを発行する
WS000046.JPG
発行する(空欄でもOK)
WS000047.JPG

3-4. トリガー設定

発行したバージョン内で左側のサービス一覧からCloudFrontを選択する
WS000048.JPG
ディストリビューションに作成したCloudFrontのIDを入力後ビューアーリクエストを選択し追加する
WS000049.JPG

4. 動作確認

CloudFrontにアクセスして認証されるか確認する。

53
52
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
52