AWS API Gateway 403 从 Lambda 调用时禁止。

问题描述 投票:0回答:1

我有一个带有IAM认证的API网关端点,没有自定义域名,没有API Key,API部署到Prod,没有启用AWS WAF(TBMK)和VPC代理集成请求方法。

我从一个Lambda调用这个端点(带有附加的 execute-api:Invoke 权限来调用API),但是我得到了一个403错误,消息是 Forbidden. 请注意,如果我删除 IAM 认证方法,Lambda 的调用可以正常工作.

我已经看到了 这个这个 SO问题+ AWS专题文件 但我已经尝试过这些解决方案(如前所述)。

在Lambda内部调用API Gateway的示例代码。

final HttpURLConnection connection = (HttpURLConnection) new URL(postApiUrl).openConnection();
connection.setRequestMethod("POST");
final int responseCode = connection.getResponseCode();
//...

我如何将API Gateway ARN附加到CDK中的Lambda角色。

this.addToRolePolicy(
      new PolicyStatement({
          actions: [execute-api:Invoke],
          effect: Effect.ALLOW,
          resources: [postMethod.methodArn],
      }),
);
amazon-web-services aws-api-gateway http-status-code-403
1个回答
1
投票

您已经为您的 API GW 方法设置了 IAM 身份验证,但您的 Lambda 函数代码没有签署向 API GW 提出的请求。注意:只需在您的API GW方法中添加 execute-api:Invoke 权限的Lambda函数执行角色不签署请求。

你需要使用AWS SigV4签名流程来添加认证信息,然后在API GW端进行验证。这个 文档 列出了涉及的步骤,基本上是

  1. 创建一个规范的请求。
  2. 使用规范请求和附加元数据来创建一个用于签名的字符串。
  3. 从你的AWS秘密访问密钥中导出一个签名密钥。然后使用签名密钥,以及上一步的字符串,创建一个签名。
  4. 将生成的签名添加到HTTP请求的头中或作为查询字符串参数。

由于你使用的是Java。本博文 还提供了一些示例代码,大家可以参考。


-2
投票

APIG有一个authorizer缓存,可以看看这个。

https:/aws.amazon.compremiumsupportknowledge-centerapi-gateway-403-error-lambda-authorizer。

如果你能读一读,或许能详细说明一下,我会附上适当的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.