IAM認証を使用したAPI Gateway + Lambda構成で「Invalid permissions on Lambda function」エラーによる500エラーが発生し、解決に苦労したので記事にしました。
一般的な権限設定(execute-api:Invoke
やLambdaリソースベースポリシー)は正しく設定されているにも関わらず500エラーが発生する場合の対処法を解説します。同じ問題で困っている方の解決の助けになれば幸いです。
解決方法(結論)
IAM認証のAPI Gateway + Lambda構成で500エラーが発生する場合、IAMロールにlambda:InvokeFunction
権限を追加する必要があります。
以下のように、execute-api:Invoke
権限に加えてlambda:InvokeFunction
権限を設定してください:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"execute-api:Invoke"
],
"Resource": "arn:aws:execute-api:ap-northeast-1:123456789012:api-gateway-id/*",
"Effect": "Allow"
},
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:your-lambda-function",
"Effect": "Allow"
}
]
}
問題の詳細
発生していたエラー
API Gatewayから以下のような500エラーが返されていました:
{
"status": "500",
"errorMessage": "Internal server error",
"errorResponseType": "API_CONFIGURATION_ERROR",
"identityCaller": "AROA********************:AssumeRoleSession",
"identityUser": "AROA********************:AssumeRoleSession",
"authorizeError": "-",
"authorizeStatus": "200",
"authorizerError": "-",
"authorizerIntegrationStatus": "-",
"authorizerRequestId": "-",
"authorizerStatus": "-",
"authenticateError": "-",
"authenticateStatus": "200",
"integrationError": "Execution failed due to configuration error: Invalid permissions on Lambda function",
"integrationIntegrationStatus": "-",
"integrationLatency": "24"
}
エラーの特徴
重要なポイントは以下の通りです:
- statusが500エラー
- authenticateStatusが200で認証は成功
- integrationErrorに「Invalid permissions on Lambda function」が表示
これは、API GatewayでのIAM認証は成功したものの、Lambda関数の実行権限で問題が発生していることを示しています。
設定済みだった権限
問題発生前に設定していた権限は以下の通りでした:
IAMロールのポリシー(不完全版)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:123456789012:api-gateway-id/*"
}
]
}
Lambdaのリソースベースポリシー
{
"ArnLike": {
"AWS:SourceArn": "arn:aws:execute-api:ap-northeast-1:123456789012:api-gateway-id/*/GET/api/endpoint"
}
}
実装コード例
API Gateway呼び出しコード
# AWS認証情報を取得
session = boto3.Session()
credentials = session.get_credentials()
# SigV4署名を追加
SigV4Auth(credentials, 'execute-api', 'ap-northeast-1').add_auth(request)
# HTTPリクエストを実行
response = requests.request(
method=method,
url=prepared_request.url,
headers=prepared_request.headers,
data=request_data
)
原因と対策
なぜこの権限が必要なのか
API GatewayがLambda関数を実行する際、以下の2段階の権限チェックが行われます:
-
API Gateway実行権限:
execute-api:Invoke
-
Lambda実行権限:
lambda:InvokeFunction
多くの場合、API GatewayからLambdaを直接統合する際はサービス間の信頼関係で権限が自動的に処理されますが、IAM認証を使用する場合は明示的にLambda実行権限を付与する必要があります。
見落としやすいポイント
- Lambdaのリソースベースポリシーだけでは不十分
- IAM認証を使用する場合、呼び出し元のIAMロールにLambda実行権限が必要
-
execute-api:Invoke
権限だけでは不完全
まとめ
IAM認証のAPI Gateway + Lambda構成では、以下の権限設定が必要です:
-
IAMロール:
execute-api:Invoke
+lambda:InvokeFunction
- Lambdaリソースベースポリシー:API Gatewayからの実行許可
この設定により、「Invalid permissions on Lambda function」エラーを解決できます。

システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当