はじめに
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サービスを選択します。
「バケットの作成」ボタンをクリックし、新しいバケットを作成します。
ここでは、パブリックアクセス設定を有効にしてインターネットに公開します。
S3で静的ウェブホスティングを有効にする
バケットを選択し、「プロパティ」タブに移動して、「静的ウェブサイトホスティング」を見つけてクリックし、有効にします。
「インデックスドキュメント」として、表示したいファイル名(通常は index.html)を指定します。
「オブジェクト」タブに移動し、静的ウェブサイトとして公開したいHTMLファイル(例:index.html)や他の必要なファイルをアップロードします。
ここでは、以下のHTMLファイルをアップロードしました。
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストサイト</title>
</head>
<body>
朝活お疲れ様~!
</body>
</html>
デフォルトでは、S3バケット内のオブジェクトは非公開なので、インターネット経由でアクセスできるようにバケットポリシーを設定します。
バケットポリシーを設定して公開アクセスを許可
現在の状態では、発行された「オブジェクト URL」でアクセスすると、以下のようにアクセスが拒否されます。
バケットを選択し、「アクセス許可」タブに移動し、「バケットポリシーを編集」をクリックして、以下のようなバケットポリシーを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::honda-20241019/*"
}
]
}
これにより、全世界からの公開アクセスが許可されます。
your-bucket-name の部分を、実際に使用しているバケット名に置き換えてください。
この設定により、シンプルなテストページに問題なくアクセスできることが確認できました。
Lambda関数の作成と設定
AWSコンソールでLambdaサービスを選択し、「関数の作成」をクリックします。
「一から作成」を選び、関数名(例: redirect-to-s3)を入力してPythonを選択します。
実行ロールは「新しいロールを作成」を選択し、適切な権限を設定します。
以下のコードを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 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関数を呼び出せるようにします。
「ルートの作成」をクリックし、GETリクエスト用のルートを作成します(例: /static-page)。
ここでは、APIをデプロイするための個別設定可能な環境のステージとして、「dev」を作成します。
最後に設定内容に問題がないことを確認して、作成ボタンをクリックします。
Lambda関数のサービスページでも、以下のように先ほど作成した「API Gateway」がトリガーとして設定されていることが確認できます。
検証確認
作成したAPI Gatewayをdev環境にデプロイし、API GatewayのエンドポイントURLにブラウザからアクセスします。
私のAPI Gatewayのエンドポイントは以下の通りです。
https://r22dg2a8pe.execute-api.ap-northeast-1.amazonaws.com/dev/static-page
ブラウザでこのエンドポイントURLにアクセスします。
API GatewayのエンドポイントURLにアクセスすると、以下のS3バケットのURLにリダイレクトされることが確認できました。
https://honda-20241019.s3.ap-northeast-1.amazonaws.com/index.html
ちょうどこの時間に朝活をしていたので、技術検証が間に合って良かったです(笑)
Lambda関数も正しく実行され、エラーなく終了しており、ログからも成功していることが確認できました。
まとめ
この記事では、AWS Lambdaを使用して、S3バケットにホストされた静的ウェブページへリダイレクトする方法を紹介しました。
S3の静的ウェブホスティングを活用し、Lambda関数のコードをシンプルに保ちながら効率的に処理できます。
Lambda関数の作成からAPI Gatewayとの連携までの手順を詳細に解説し、ブラウザからの動作確認も問題なく完了しました。
参考文献