2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

技術検証:API Gatewayを使ってLambda関数からS3の静的ページにリダイレクトする方法

Last updated at Posted at 2024-10-19

はじめに

AWS Lambdaはサーバーレスコンピューティングを提供し、特定のイベントに応じてコードを実行できる柔軟なツールです。

この記事では、Lambda関数からS3バケットにホストされた静的ウェブページにリダイレクトする方法を解説します。

リダイレクトを使うことで、Lambda関数のコードをシンプルに保ちながら、S3の静的コンテンツを利用(表示)することが技術的にできました。

知識整理

まず、S3とLambdaの基本的な役割を整理していきます。

Amazon S3 (Simple Storage Service):
ファイルや静的コンテンツ(HTML、CSS、JavaScriptなど)を保存し、ウェブホスティングの機能も提供します。静的なウェブサイトを簡単にデプロイできます。

AWS Lambda:
イベントドリブン型のサーバーレスコンピューティングサービスで、インフラの管理なしにコードを実行することができます。Lambda関数はAPI Gatewayと連携して、ウェブリクエストのレスポンスをカスタマイズ可能です。

リダイレクトのアプローチは、S3にホストされた静的ページのURLをLambdaが返し、そのURLに基づいてウェブページをユーザーに表示します。

この方法は、S3の静的ウェブホスティングを利用するため、処理が非常にシンプルです。

今回の検証手順

S3バケットの作成

まず、AWSコンソールにログインし、S3サービスを選択します。

image.png

「バケットの作成」ボタンをクリックし、新しいバケットを作成します。

image.png

ここでは、パブリックアクセス設定を有効にしてインターネットに公開します。

image.png

S3で静的ウェブホスティングを有効にする

バケットを選択し、「プロパティ」タブに移動して、「静的ウェブサイトホスティング」を見つけてクリックし、有効にします。

image.png

「インデックスドキュメント」として、表示したいファイル名(通常は index.html)を指定します。

image.png

「オブジェクト」タブに移動し、静的ウェブサイトとして公開したいHTMLファイル(例:index.html)や他の必要なファイルをアップロードします。

ここでは、以下のHTMLファイルをアップロードしました。

indx.html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>テストサイト</title>
</head>
<body>
朝活お疲れ様~!
</body>
</html>

デフォルトでは、S3バケット内のオブジェクトは非公開なので、インターネット経由でアクセスできるようにバケットポリシーを設定します。

バケットポリシーを設定して公開アクセスを許可

現在の状態では、発行された「オブジェクト URL」でアクセスすると、以下のようにアクセスが拒否されます。

image.png

バケットを選択し、「アクセス許可」タブに移動し、「バケットポリシーを編集」をクリックして、以下のようなバケットポリシーを追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::honda-20241019/*"
        }
    ]
}

これにより、全世界からの公開アクセスが許可されます。

your-bucket-name の部分を、実際に使用しているバケット名に置き換えてください。

この設定により、シンプルなテストページに問題なくアクセスできることが確認できました。

image.png

Lambda関数の作成と設定

AWSコンソールでLambdaサービスを選択し、「関数の作成」をクリックします。

image.png

「一から作成」を選び、関数名(例: redirect-to-s3)を入力してPythonを選択します。

image.png

実行ロールは「新しいロールを作成」を選択し、適切な権限を設定します。

以下のコードをLambda関数に入力します。このコードは、リクエストを受けるとS3の静的サイトURLにリダイレクトします。

import json

def lambda_handler(event, context):
    return {
        'statusCode': 302,
        'headers': {
            'Location': 'https://your-s3-static-site.s3-website-region.amazonaws.com'
        },
        'body': json.dumps('Redirecting to S3 static site')
    }

このコードは、302ステータスコードを返し、指定したS3のURLにユーザーをリダイレクトします。

ちなみに、テスト実行すると、以下のようにログに記録され、Lambda関数がS3の静的サイトURLに正常にリダイレクトされていることが確認できました。

test.log
Test Event Name
aaaa

Response
{
  "statusCode": 302,
  "headers": {
    "Location": "https://honda-20241019.s3.ap-northeast-1.amazonaws.com/index.html"
  },
  "body": "\"Redirecting to S3 static site\""
}

Function Logs
START RequestId: e9ae69c2-d82e-462a-8f38-f6b0758664f2 Version: $LATEST
END RequestId: e9ae69c2-d82e-462a-8f38-f6b0758664f2
REPORT RequestId: e9ae69c2-d82e-462a-8f38-f6b0758664f2	Duration: 1.98 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 32 MB	Init Duration: 87.85 ms

API Gatewayとlambda関数の連携

Lambda関数をAPI Gatewayと統合することで、HTTPリクエストに応じてLambda関数を呼び出せるようにします。

image.png

「ルートの作成」をクリックし、GETリクエスト用のルートを作成します(例: /static-page)。

image.png

ここでは、APIをデプロイするための個別設定可能な環境のステージとして、「dev」を作成します。

image.png

最後に設定内容に問題がないことを確認して、作成ボタンをクリックします。

image.png

Lambda関数のサービスページでも、以下のように先ほど作成した「API Gateway」がトリガーとして設定されていることが確認できます。

image.png

検証確認

作成したAPI Gatewayをdev環境にデプロイし、API GatewayのエンドポイントURLにブラウザからアクセスします。

image.png

私のAPI Gatewayのエンドポイントは以下の通りです。

https://r22dg2a8pe.execute-api.ap-northeast-1.amazonaws.com/dev/static-page

ブラウザでこのエンドポイントURLにアクセスします。

image.png

API GatewayのエンドポイントURLにアクセスすると、以下のS3バケットのURLにリダイレクトされることが確認できました。

https://honda-20241019.s3.ap-northeast-1.amazonaws.com/index.html

ちょうどこの時間に朝活をしていたので、技術検証が間に合って良かったです(笑)

image.png

Lambda関数も正しく実行され、エラーなく終了しており、ログからも成功していることが確認できました。

image.png

まとめ

この記事では、AWS Lambdaを使用して、S3バケットにホストされた静的ウェブページへリダイレクトする方法を紹介しました。

S3の静的ウェブホスティングを活用し、Lambda関数のコードをシンプルに保ちながら効率的に処理できます。

Lambda関数の作成からAPI Gatewayとの連携までの手順を詳細に解説し、ブラウザからの動作確認も問題なく完了しました。

参考文献

2
4
1

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
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?