はじめに
Lambda@Edgeを初めて使い、色々戸惑うことが多かったため調べたことをまとめる。
また、都度追加していく。
Lambda@Edgeとは
Lambda@EdgeとはCloudFrontの機能の1つで、CloudFrontのエッジサーバでコードを実行するLambda関数のこと。ユーザーに近い場所でコードが実行されることでアプリケーションのパフォーマンスが向上する。
CloudFrontのイベントをトリガーとしてコードを実行する。
トリガー
上述の通り、CloudFrontのイベントをトリガーとし、イベントがあったCloudFrontと同リージョンで起動する。指定できるCloudFrontのイベントは以下の4つ。
1.ビューワーリクエスト
2.ビューワーレスポンス
3.オリジンリクエスト
4.オリジンレスポンス
Lambda@Edgeのトリガーをビューワーリクエストに設定すると、CloudFrontがキャッシュを保有しているかに関わらずビューワーからリクエストがある度にLambdaが起動する。キャッシュがある場合に起動させたくない場合はトリガーを オリジンリクエスト
に設定する。
ログ
Lambda@EdgeのログはLambda同様CloudWatchLogsに保存されるが、Lambda関数が起動したエッジサーバがあるリージョンのCloudWatchLogsに保存される。
Lambda@Edgeの作成する際の注意
リージョン
Lambda@Edgeはバージニア北部リージョンでLambda関数を作成する。
作成方法はLambda関数と同様
恥ずかしい話ですが、Lmadba@Edgeを使用する前、Lambda@Edgeというサービスがあるものだと思っていたんですが、Lambda関数をバージニア北部リージョンで作成し、CloudFrontのイベントをトリガーとすることでLambda@Edgeになるということみたい。
IAMロール
Lambda@EdgeにアタッチするIAMロールは、サービスプリンシパル lambda.amazonaws.com
と edgelambda.amazonaws.com
が引き受けることができるロールである必要があるため、以下の信頼ポリシーを記述したIAMロールを作成する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"edgelambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
IAMポリシーを作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"lambda:GetFunction",
"lambda:EnableReplication"
],
"Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:<関数名>:<バージョン>"
},
{
"Effect": "Allow",
"Action": [
"cloudfront:UpdateDistribution"
],
"Resource":"arn:aws:cloudfront::xxxxxxxxxxxx:distribution/<ディストリビューションID>"
}
]
}
関数の編集後はCloudFrontにデプロイする
関数を編集して保存後CloudFrontにデプロイして、編集内容が各エッジサーバに反映される。
ちなみに、Lambda関数はバージョン管理しておりデプロイする際に自動でバージョンアップされ、それがデプロイされる。