AWS Lambda の Resource-Based Policies に仕様変更があったようだ。
http://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:apigateway:us-east-1::my-api-id:/test/petstorewalkthrough/pets\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"apigateway.amazonaws.com\"}, \"Sid\":\"5\"}" }
これは上記の公式ドキュメントからの引用だけど、ぼくも Resource 単位で lambda:InvokeFunction
の対象を絞って許可していた。
ところが、この形での Resource 指定が今朝 (?) から許可されなくなった。どうも関数名だけでなく、その後ろに qualifier をつけないと動かなくなったらしい。
どっかのタイミングでAws::Lambda::Clientがinvokeした時にfunction_nameのarnに指定した値に、勝手に:currentが付いたリソース名を要求する様になったらしい。それでversion指定のないIAMの権限だと実行できなくて弾かれている。
— イキリーマン (@joker1007) 2017年8月23日
なぜか権限エラーが出ていたのだけど、このツイートで原因に気づいた。とりあえず Resource に qualifier つきのものを追加して対応した。
互換性を壊す変更を予告なく入れるのはやめてほしい。ぼくが気づいていないだけかもしれないが、今回のはおそらく予告がなかった。……というより、ドキュメントのものだとエラーになるような……。