AWS
CloudFront
lambda
Lambda@Edge

lambda@edgeを使おうとしたらroleにハマった


はじめに

ユーザからのアクセスログを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作成時に設定したロールを選択し、信頼関係/信頼関係の編集で上記サンプルを入力すると受け付けてもらえる。

とても初歩的だけど、もしかしたら同じ問題に直面してる人もいるかもしれないので。