やりたいこと
Lambda@Edgeを使って開発する時に最小構成で動くものを作る
それを使ってデバッグしながら開発したい
言語はPython3.7(3.8は現時点でサポート外)
#構成
リクエスト→CloudFront→S3
CloudWatchLogsにログを出力しつつ他は何もしないLamda@Edgeをはさむ
##S3の用意
S3で適当なバケットを作る
適当なindex.htmlを置く(今回はこんな感じ)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<title>テストホームページ</title>
</head>
<body>
<h1>テストホームページ</h1>
<p>ただいま工事中です。
</body>
</html>
バケットの「オブジェクトURL」からindex.htmlをブラウザに表示できるか確認する
表示できたらS3の設定は完了
S3の静的ホスティング設定をオンにしてindex.htmlを指定する
##CloudFrontとS3の連携
調べれば山ほど資料が出てくるので割愛
CloudFrontのドメイン経由でS3にアクセスしてブラウザに表示できるか確認する
表示できたら完了
これでリクエスト→CloudFront→S3ができた
ここまでが下準備
ここにLambda@Edgeを挟む
##Lambda@Edge
まずリージョン(ログインしているユーザ名の横にあるやつ)をバージニアにしてからLambda関数を作成する
Lambdaの中身をこれにする
import json
def lambda_handler(event, context):
print('# lambda@edge start')
print(event)
# Viewer Response Origin Responseの場合はこっちをコメントアウトはずす
# cfResponse = event['Records'][0]['cf']['response']
# return cfResponse
# Viewer Request Origin Requestの場合はこっちをコメントアウトはずす
# cfRequest = event['Records'][0]['cf']['request']
# return cfRequest
・Lambda@Edgeはリクエストとレスポンスにそれぞれ必須のパラメータがあり、ない場合エラーとなってしまう
バージョンがLATESTになっている事を確認したらアクション→Lambda@Edgeへのデプロイを選択
ディストリビューションに作成したCloudFrontのIDを設定
CloudFrontイベントに設定したいLambda@Edgeのイベントを設定してデプロイをクリックするとデプロイできる
CDNだからデプロイしてもしばらくはコンテンツの配信が完了してない地域がある
CloudFrontのコンソールでstatusがin Progressからdeployedになっていれば配信完了
完了自体は体感だと数分〜數十分くらいか、日本には1~3分で配信されていたように思う
これでCloudWatchLogsのLambda実行ログを見ればコードに書いたログが出力されるはずだ
あとはLambda@Edgeでやりたい事をデバッグしながらLambdaに実装するだけとなる
Lambda@Edgeのログについて(重要)
Lambda@EdgeのCloudWatchLogsは下記の分類で別々のグループに書き出されるので注意(一番ハマった)
コンソールから実行したテストのログ
リージョン:バージニア
出力対象:関数ごと
Lambda@Edgeで実行したLambdaのログ
リージョン;アクセスしたリージョン(日本ならほぼ東京)
出力対象:関数ごと
Lambda@Edgeで実行したLambda@Edgeのログ
リージョン;アクセスしたリージョン(日本ならほぼ東京)
出力対象:Lambda@Edgeが紐づけられている出力対象ごと
このメモが自分を含めて誰かの役に立てる事を祈る