こんにちは、SRE1課の古川です。最近は豆腐にマジックソルトをかけて食べるのが好きです。
今回はLambda@Edge作成時にとある部分でハマってしまったので、備忘録としてブログに書こうと思います。
Lambda@Edgeとは
Lambda@Edgeとは何かについて簡単に説明していきます。
公式では以下の説明ですね。
アプリケーションのユーザーに近いロケーションでコードを実行できるため、パフォーマンスが向上し、待ち時間が短縮されます。
参考:
LambdaとCloudFrontを組み合わせることで、ユーザーに近いエッジロケーションでコードが実行できるようになります。
ハマったポイント
Lambda@Edgeの作成はそこまで複雑ではないため「簡単~~!」とナメていました...
ざっくりとしたLambda@Edge作成方法↓
1.CloudFrontのディストリビューションを作成する。
2.Lambda関数をバージニア北部で作成する。
3.該当Lambda関数でバージョンを発行する。
4.発行したバージョンのトリガーにCloudFrontを設定する。
参考: Lambda@Edge 関数の作成と使用の開始 - Amazon CloudFront
しかし、手順4「発行したバージョンのトリガーにCloudFrontを設定する。」際にエラーが発生してしまいました。
エラー内容はこれです↓
InvalidLambdaFunctionAssociationException: The function execution role must be assumable with edgelambda.amazonaws.com as well as lambda.amazonaws.com principals. Update the IAM role and try again.
Lambda関数に付けているIAMロールがエラー原因ということは分かりましたが、IAMロールのポリシー内容には特に問題がなく、どこを直せばよいのか分かりませんでした。
エラー原因
エラーの原因はIAMロールの「信頼関係」でした。
Lambda@Edge用のLambda関数にアタッチしているIAMロールには信頼関係に「edgelambda.amazonaws.com」がなければいけません。
信頼関係に「edgelambda.amazonaws.com」がない場合、【信頼関係の編集】をクリックし、「Service」に「edgelambda.amazonaws.com」を追記します。
以下、信頼関係の書き方の例です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "edgelambda.amazonaws.com", "lambda.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
このエラーが発生した経緯
私の場合、あらかじめ作成しておいたIAMロールをLambda関数にアタッチしたことが、このエラーに遭遇してしまった理由でした。
(※「前もって作成しておくことが悪い!」と言いたいのではありません。これはあくまでも私がミスをしてしまった経緯の話です!)
AWS公式の手順ではこんな感じでした↓
1.「AWS ポリシーテンプレートから新しいロールを作成」を選択する。
2.ポリシーテンプレートで「基本的な Lambda@Edge のアクセス権限(Basic Edge Lambda permissions)」を選択する。
参考: Lambda コンソールで Lambda@Edge 関数を作成する - Amazon CloudFront
この手順でロールを作成・アタッチしていれば問題なくLambda@Edge用のIAMロールを作成することができるはずでした…
おわりに
「どうしても前もってIAMロールを作成しておきたいんだ!」という場合には信頼関係を必ずチェック!
あらかじめIAMロールを作成する必要がない場合は、AWS公式の手順で作成する!
古川智絵 (執筆記事の一覧)
2020年新卒入社 技術課(SRE1課)に所属 好きな食べ物はみそ汁