Udemy講師クーポン配布中。詳しくはこちら

IAM認証のAPI Gateway での500エラーの解決方法(Invalid permissions on Lambda function)

IAM認証のAPI Gateway での 500エラーの解決方法アイキャッチ

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段階の権限チェックが行われます:

  1. API Gateway実行権限execute-api:Invoke
  2. Lambda実行権限lambda:InvokeFunction

多くの場合、API GatewayからLambdaを直接統合する際はサービス間の信頼関係で権限が自動的に処理されますが、IAM認証を使用する場合は明示的にLambda実行権限を付与する必要があります。

見落としやすいポイント

  • Lambdaのリソースベースポリシーだけでは不十分
  • IAM認証を使用する場合、呼び出し元のIAMロールにLambda実行権限が必要
  • execute-api:Invoke権限だけでは不完全

まとめ

IAM認証のAPI Gateway + Lambda構成では、以下の権限設定が必要です:

  1. IAMロールexecute-api:Invoke + lambda:InvokeFunction
  2. Lambdaリソースベースポリシー:API Gatewayからの実行許可

この設定により、「Invalid permissions on Lambda function」エラーを解決できます。

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次