Amazon API Gateway REST API を使用して AWS Lambda 関数を呼び出すと、「Invalid permissions on Lambda function」(Lambda 関数に対する無効な許可) エラーが表示されます。エラーの原因は何ですか? また、このエラーを修正するにはどうすればよいですか?
簡単な説明
API Gateway REST API が Lambda 呼び出し許可なしで Lambda 関数を呼び出そうとすると、API Gateway は「Invalid permissions on Lambda function」(Lambda 関数の無効な許可) というエラーを返します。
REST API 用に CloudWatch ログ記録を設定した場合、API Gateway は次のいずれかのエラーメッセージを記録します。
Lambda 統合での REST API の CloudWatch エラーメッセージの例
「 https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations にリクエストを送信
設定エラーのため実行に失敗しました: Lambda 関数に対する権限が無効です
メソッド完了のステータス: 500 」
Lambda オーソライザーでの REST API の CloudWatch エラーメッセージの例
「 https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations にリクエストを送信
設定エラーのため実行に失敗しました: Lambda 関数に対する権限が無効です
設定エラーのため実行に失敗しました: 認証エラー」
解決方法
これらのエラーを解決するには、次のいずれかの操作を行います。
この記事で説明されている方法のいずれかを使用して、リソースベースの Lambda 呼び出しアクセス許可を REST API に追加します。
関数を呼びだすアクセス権限を REST API に付与する AWS Identity and Access Management (IAM) 実行ロールを設定します。
詳細については、 「API を呼び出すための API Gateway アクセス許可モデル」を参照してください。
注:
API Gateway コンソールを使用して Lambda 統合で REST API に Lambda 呼び出し許可を追加するには
1. API Gateway コンソールの [APIs] (API) ペインで、API の名前を選択します。
2. [Resources] ( リソース ) ペインで、構成済みの HTTP メソッドを選択します。
3. [Method Execution ( メソッドの実行 )] ペインで、[Integration Request ( 統合リクエスト )] を選択します。
4. [統合タイプ] で、[Lambda 関数] を選択します。
5. [Lambda リージョン] ドロップダウンリストを展開します。次に、Lambda 関数がある AWS リージョンを選択します。
6. [Lambda 関数] ドロップダウンリストを選択します。次に、Lambda 関数の名前を選択します。
7. Lambda 関数にアクセス許可を追加するオプションを提供するプロンプトが表示されます 。[OK] を選択します。
8. [Save] (保存) を選択します。次に、[API をデプロイ] を選択して、Lambda 呼び出しアクセス許可を API に追加します。
CloudFormation テンプレートを使用して Lambda 統合で REST API に Lambda 呼び出しアクセス許可を追加するためには
CloudFormation テンプレートに次のコードスニペットを追加します。
重要: <api-id> を apiID に置き換えます。FunctionName の値を Lambda 関数の名前に置き換えます。SourceArn の値を API のソース Amazon リソースネーム (ARN) に置き換えます。
SampleApiPermission:
Type: AWS::Lambda::Permission
Properties:
Action: "lambda:InvokeFunction"
FunctionName: !Ref MyLambdaFnA1
Principal: "apigateway.amazonaws.com"
SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/*/<method>/<resource>"
さまざまな CloudFormation テンプレートパーツを宣言する方法の詳細については、「テンプレートスニペット」を参照してください。
AWS CLI を使用して Lambda 統合で REST API に Lambda 呼び出しアクセス許可を追加するには
次のアクセス許可が追加された AWS CLI コマンドを実行します。
重要:****関数名の値を Lambda 関数の名前に置き換えてください。Source-arn 値を API のソース ARN に置き換えます。Statement-id 値を、同じポリシー内の他のステートメントと区別するステートメント識別子に置き換えます。
aws lambda add-permission \
--function-name "$FUNCTION_NAME" \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/*/$METHOD/$RESOURCE" \
--principal apigateway.amazonaws.com \
--statement-id $STATEMENT_ID \
--action lambda:InvokeFunction
API Gateway コンソールを使用して、 Lambda 認証を使って Lambda 呼び出しアクセス許可を REST API に追加するには
1. "lambda:InvokeFunction" アクションを許可する API Gateway の IAM ロールを作成します。その後、IAM ロール ARN をクリップボードにコピーします。
2. API Gateway コンソールの [API] ペインで、作成した API の名前を選択します。
3. [認証者] ペインで、設定された Lambda 認証を選択します。次に、[編集] を選択します。
4. [Lambda 呼び出しロール] で、クリップボードにコピーした IAM ロール ARN を入力します。
5. [Save] (保存) を選択します。次に、[API をデプロイ] を選択します。
CloudFormation テンプレートを使用して 、Lambda 認証を使って Lambda 呼び出しアクセス許可を REST API に追加するには
CloudFormation テンプレートに次のコードスニペットを追加します。
重要: <api-id> を apiID に置き換えます。FunctionName の値を Lambda 関数の名前に置き換えます。<auth-id> を Lambda 認証の authorizerId に置き換えます。
SampleApiAuthPermission:
Type: AWS::Lambda::Permission
Properties:
Action: "lambda:InvokeFunction"
FunctionName: !Ref MyLambdaFnA1
Principal: "apigateway.amazonaws.com"
SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/authorizers/<auth-id>"
さまざまな CloudFormation テンプレートパーツを宣言する方法の詳細については、「テンプレートスニペット」を参照してください。
AWS CLI を使用して、 Lambda 認証を使って Lambda 呼び出しアクセス許可を REST API に追加するには
次のアクセス許可が追加された AWS CLI コマンドを実行します。
重要:****関数名の値を Lambda 関数の名前に置き換えてください。Source-arn 値を API のソース ARN に置き換えます。Statement-id 値を、同じポリシー内の他のステートメントと区別するステートメント識別子に置き換えます。
aws lambda add-permission \
--function-name "$FUNCTION_NAME" \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/authorizers/$AUTHORIZER_ID" \
--principal apigateway.amazonaws.com \
--statement-id $STATEMENT_ID \
--action lambda:InvokeFunction
関連情報
Lambda でのリソースベースのポリシーの使用
API Gateway のアクセスログ記録を設定するにはどうすればよいですか?