首页 > 解决方案 > 从 Lambda 调用时,AWS API Gateway 403 被禁止

问题描述

我有一个带有 IAM 身份验证、没有自定义域名、没有 API 密钥、API 部署到 Prod 并且没有启用 AWS WAF (TBMK) 和 VPC 代理集成请求方法的 API 网关端点。

我从 Lambda 调用此端点(附带execute-api:Invoke调用 API 的权限),但是我收到 403 错误消息Forbidden请注意,如果我删除 IAM 身份验证方法,来自 Lambda 的调用工作正常

我已经看过这个这个SO questions + AWS Doc on the topic,但我已经尝试过这些解决方案(如前所述)。

在 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-servicesaws-api-gatewayhttp-status-code-403

解决方案


您已为您的 API GW 方法设置 IAM 身份验证,但您的 Lambda 函数代码未签署对 API GW 的请求。注意:简单地将execute-api:Invoke权限添加到 Lambda 函数执行角色不会对请求进行签名。

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

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

由于您使用的是 Java,这篇博文还提供了一些示例代码,您可以参考。


推荐阅读