LoginSignup
34
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-09

はじめに

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

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

34
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
11