はじめに
ユーザからのアクセスログをEC2を使わず、lambdaからDynamoDBに保管しようと考え、いつもどおりAPIGateway経由でlambdaにリクエストを渡そうとしたが、どうにもダルいのでlambda@edgeを使おうと思った。
CloudFrontの設定でつまづいた
- 設定するLambdaFunctionは必ず
us-east-1
で作らなければならない - ランタイムは
Node.js 6.10
でないとならない - ロール(role)を調整しないとならない ← これにハマった
ロールの設定
ロールを設定しないと
com.amazonaws.services.cloudfront.model.InvalidLambdaFunctionAssociationException:
The function execution role must be assumable with edgelambda.amazonaws.com as well as lambda.amazonaws.com principals
みたいな感じで怒られる。
なので、IAMを覗くとポリシーというものがあるので、そこから新規にポリシーを作成し、既存のロールにアタッチすると想像した。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"edgelambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
上記は公式のドキュメントサンプル。
こちらを設定しようとすると、
このポリシーには、「Has prohibited field Principal」というエラーが含まれています For more information about the IAM policy grammar, see AWS IAM Policies
というエラーが出て受け付けてもらえない。
調べてみると、同じような問題にぶつかっている人もいるようだし、解決に時間がかかった。
そもそも設定する場所が違っていた
ポリシーを新しく作成したり、選択したりして権限を与えるというのがそもそもの間違いだった。
ポリシーではなくロールからlambda作成時に設定したロールを選択し、信頼関係/信頼関係の編集で上記サンプルを入力すると受け付けてもらえる。
とても初歩的だけど、もしかしたら同じ問題に直面してる人もいるかもしれないので。