以前に 1つのAWS Lambda関数でSPAフレームワーク作成 という記事を書いたが、当記事では API Gateway ではなく CloudFront を利用して似たような事をやってみる。
/css
/html
/js
・・・ CSS格納用
・・・ HTML格納用
・・・ JS格納用
/api
/css
/html
/js
・・・ Lambdaで処理
・・・ オリジン(S3)にリクエストさせる
・・・ 〃
・・・ 〃
参考)
https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/lambda_edge
注意)
edgelambda.amazonaws.com を assumable role しないと、
「The function execution role must be assumable with edgelambda.amazonaws.com as well as lambda.amazonaws.com principals.」と怒られる。
#TODO
AutoPublishAlias: live を指定すると Version という追加のプロパティが使用できるようになるらしい。
AWS::CloudFront::Distribution 側の LambdaFunctionAssociations 配下の LambdaFunctionARN では、これを使用する事ができるようになる。
https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/lambda_edge
例)
LambdaEdgeFunctionSample: Type: AWS::Serverless::Function Properties: : CodeUri: ./src Handler: index.handler AutoPublishAlias: live SampleDistribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: : LambdaFunctionAssociations: - EventType: origin-request LambdaFunctionARN: !Ref LambdaEdgeFunctionSample.Version
Lambda@Edge では、Node.js Lambda 関数により返却するコンテンツをカスタマイズする事ができる。
Lambda 関数が実行出来るタイミングは以下の通り。
当記事では、上記の「オリジンリクエスト」イベントによってLambdaをトリガーし、動的コンテンツか静的コンテンツかを判定する。
動的コンテンツへのリクエストだった場合はLambd 内でレスポンスデータを作成/返却する。
静的コンテンツへのリクエストだった場合は何もしない。(そのままオリジンに対してリクエストさせる)