テック技報最新号へ →
インフラ

Lambda の権限は 2 種類: 実行ロール(関数が呼ぶ側)とリソースベースポリシー(関数を呼ぶ側)

@dkfj · 2026-10-26
#infra#aws#lambda#iam#s3#トラブルシュート

S3 イベントで Lambda が起動しないとき、実行ロールをいくら直しても直らないことがある。足りないのは「S3 がその関数を呼んでよい」という許可で、これは関数側のリソースベースポリシーに書くもの。

2 つの違い

実行ロール(execution role)リソースベースポリシー(関数ポリシー)
何の許可か関数が 他のサービスを呼ぶ 権限(S3 読み書き、DynamoDB、CloudWatch Logs など)誰がこの関数を呼べるか(S3、SNS、EventBridge、API Gateway、別アカウントなど)
どこに付くIAM ロール(関数に 1 つ割り当て)Lambda 関数(またはエイリアス・バージョン)そのもの
足りないと関数は起動するが、中で AccessDeniedそもそも関数が起動しない(呼び出し元側で失敗)

切り分け

  1. 関数のログ(CloudWatch Logs)に呼び出しの記録があるか見る
    • 記録がない → 呼び出し元の許可(リソースベースポリシー)かトリガー設定の問題
    • 記録はあって中で AccessDenied → 実行ロールの問題
  2. 関数ポリシーを確認する
sh
aws lambda get-policy --function-name my-func
  1. S3 から呼べるようにする(コンソールでトリガーを追加すると自動で付くが、IaC や CLI で通知だけ設定したときは漏れやすい)
sh
aws lambda add-permission \
  --function-name my-func \
  --statement-id s3-invoke \
  --action lambda:InvokeFunction \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::my-bucket \
  --source-account 123456789012

注意点

出典

X の元の投稿を開く