SJ blog
backend
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Lambda実行ロールとリソースポリシー — 2種類の権限モデルの使い分け

Lambda関数の実行ロール(何にアクセスできるか)とリソースベースポリシー(誰が呼び出せるか)の違い、クロスアカウント呼び出し、APIゲートウェイ/S3/EventBridgeからの呼び出し設定を解説。

一言結論

Lambda関数の権限設計は実行ロール(Lambda→外部サービスへのアクセス)とリソースポリシー(外部サービス→Lambdaへの呼び出し許可)の2つを独立して管理することが基本で、S3やEventBridgeからのトリガー設定時はリソースポリシーの追加を忘れがちな点に注意が必要だ。

2種類の権限モデル

Lambda関数には2種類の権限設定が存在する。

実行ロール(Execution Role):
  → Lambda関数が「何をできるか」を定義
  → Lambda関数→AWSサービスへのアクセス権限

リソースベースポリシー(Resource-based Policy):
  → 「誰がLambdaを呼び出せるか」を定義
  → AWSサービス/アカウント→Lambda関数への呼び出し権限

実行ロールの設定

// Lambda実行ロールに付与するポリシー例
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::my-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders"
    }
  ]
}
# 実行ロールの作成
aws iam create-role \
  --role-name LambdaExecutionRole \
  --assume-role-policy-document '{
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "lambda.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

# 基本実行ポリシーのアタッチ(CloudWatchログの書き込み)
aws iam attach-role-policy \
  --role-name LambdaExecutionRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

リソースベースポリシーの設定

他のAWSサービスがLambdaを呼び出すには、Lambda側のリソースポリシーにAllow設定が必要だ。

# S3からの呼び出しを許可
aws lambda add-permission \
  --function-name image-processor \
  --statement-id allow-s3-invoke \
  --action lambda:InvokeFunction \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::my-uploads-bucket \
  --source-account 123456789012

# EventBridgeからの呼び出しを許可
aws lambda add-permission \
  --function-name scheduled-task \
  --statement-id allow-eventbridge \
  --action lambda:InvokeFunction \
  --principal events.amazonaws.com \
  --source-arn arn:aws:events:ap-northeast-1:123456789012:rule/my-rule

# API Gatewayからの呼び出しを許可
aws lambda add-permission \
  --function-name api-handler \
  --statement-id allow-apigw \
  --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:ap-northeast-1:123456789012:abc123/*/POST/orders"

クロスアカウントでのLambda呼び出し

アカウントBのLambdaをアカウントAから呼び出す場合:

# アカウントBのLambdaにアカウントAからの呼び出しを許可(リソースポリシー)
aws lambda add-permission \
  --function-name my-function \
  --statement-id cross-account-invoke \
  --action lambda:InvokeFunction \
  --principal arn:aws:iam::111111111111:role/InvokerRole
// アカウントAのIAMポリシー(InvokerRoleに付与)
{
  "Statement": [{
    "Effect": "Allow",
    "Action": "lambda:InvokeFunction",
    "Resource": "arn:aws:lambda:ap-northeast-1:222222222222:function:my-function"
  }]
}

VPCアクセスとの組み合わせ

Lambda関数をVPCに配置する場合、追加の権限が必要だ。

// VPC内のLambdaに必要なENI作成権限
{
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "ec2:CreateNetworkInterface",
      "ec2:DescribeNetworkInterfaces",
      "ec2:DeleteNetworkInterface",
      "ec2:AssignPrivateIpAddresses",
      "ec2:UnassignPrivateIpAddresses"
    ],
    "Resource": "*"
  }]
}
// または マネージドポリシー:
// arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole

Lambda実行ロールのベストプラクティス

# ❌ 過剰な権限(S3全操作 + 全バケット)
{
  "Action": "s3:*",
  "Resource": "*"
}

# ✅ 最小権限(必要な操作と特定バケットのみ)
{
  "Action": ["s3:GetObject", "s3:PutObject"],
  "Resource": "arn:aws:s3:::my-bucket/data/*"
}

リソースポリシーの確認

# Lambda関数のリソースポリシーを確認
aws lambda get-policy \
  --function-name my-function \
  --query 'Policy' | python3 -m json.tool

# リソースポリシーから特定のStatementを削除
aws lambda remove-permission \
  --function-name my-function \
  --statement-id allow-s3-invoke

試験頻出ポイント

シナリオ回答
S3イベントでLambdaを起動したいS3通知設定 + Lambda側にリソースポリシー追加
LambdaがDynamoDBに書き込みたい実行ロールにDynamoDB権限を付与
クロスアカウントからLambdaを呼び出すLambda側にリソースポリシー + 呼び出し元にIAMポリシー
Lambda VPC設定でENI作成エラー実行ロールにEC2 ENI権限が不足
API GatewayへのLambdaの許可add-permissionでAPIGatewayプリンシパルを許可

まとめ

Lambdaの権限設計は「実行ロール(Lambda→外部サービスへの権限)」と「リソースポリシー(外部→Lambdaへの呼び出し権限)」の2つを分けて考えることが重要だ。特にS3やEventBridgeからのトリガー設定時はリソースポリシーの追加を忘れやすいので注意。