amazon-web-services - 从 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],
}),
);
解决方案
您已为您的 API GW 方法设置 IAM 身份验证,但您的 Lambda 函数代码未签署对 API GW 的请求。注意:简单地将execute-api:Invoke
权限添加到 Lambda 函数执行角色不会对请求进行签名。
您需要使用 AWS SigV4 签名流程添加身份验证信息,然后在 API GW 端进行验证。该文档列出了涉及的步骤,基本上是:
- 创建规范请求。
- 使用规范请求和其他元数据创建用于签名的字符串。
- 从您的 AWS 秘密访问密钥派生签名密钥。然后使用签名密钥和上一步中的字符串来创建签名。
- 将生成的签名添加到标头中的 HTTP 请求或作为查询字符串参数。
由于您使用的是 Java,这篇博文还提供了一些示例代码,您可以参考。
推荐阅读
- mysql - 在 SQL 中删除 SQL JOIN 和 UNION 运算符中的 NULL 值
- jquery - foreach 引导手风琴
- python - 在 OpenCV Python 中找不到 SIFT 或 xfeatures2d
- vue.js -
在自身内部渲染相同的组件 - git - 提取不相关的回购后如何修复我的回购?
- python - 用于动画层合成的 MoviePy
- c# - 如何在 MVC Core 和 AutoFac 中使用属性注入
- angular - 如何找出破坏 Angular 自动更改检测的原因?
- python - 我尝试导出 tf.estimator.DNNClassifier 模型时出错。我怎么能保存这个?
- ionic3 - 如何将对象设置为离子选项的选定值