标签: aws-api-gateway

如何在API网关前添加CloudFront

API网关(APIG),虽然它使用CloudFront(CF),但它不支持CDN边缘缓存.当我配置CF分发以使用API​​G作为自定义源时,我收到权限被拒绝错误.

如何配置CF来解决这个问题?

cdn amazon-web-services amazon-cloudfront aws-api-gateway

33
推荐指数
2
解决办法
2万
查看次数

使用Cognito的AWS Lambda API网关 - 如何使用IdentityId访问和更新UserPool属性?

好吧,我现在已经进入了这个阶段并取得了重大进展,但仍然完全被基本面所困扰.

我的应用程序使用Cognito用户池来创建和管理用户 - 这些在S3上通过IdentityId标识.我的每个用户都有自己的S3文件夹,AWS会自动为他们提供一个等于用户IdentityId的文件夹名称.

我需要将IdentityId与其他Cognito用户信息相关联,但无法确定如何使用.

我需要的关键是能够识别用户名以及给定IdentityId的其他cognito用户属性 - 而且这非常困难.

因此,第一场战斗是在Cognito用户通过AWS API Gateway发出请求时,弄清楚如何获取IdentityId.最后我得到了解决方案,现在我有一个Cognito用户,他向API网关发出请求,而我后面的Lambda函数现在有了IdentityId.那一点有效.

但我完全不知道如何访问存储在用户池中的Cognito用户信息.我找不到任何明确的信息,当然也没有代码,它显示了如何使用IdentityId来获取Cognito用户的属性,用户名等.

看来,如果我使用"Cognito用户池"在API网关中授权我的方法,那么可以使用正文映射模板将Cognito用户信息(例如sub,用户名和电子邮件地址)放入上下文中,但我可以没有得到IdentityId.

但是如果我AWS_IAM在API网关中使用授权我的方法,那么身体映射模板会反过来 - 它为我提供了IdentityId而不是Cognito用户字段,例如sub和username以及email.

这让我发疯了 - 如何将IdentityId和所有Cognito用户字段和属性合并为一个数据结构?事实上,我似乎只能得到一个或另一个是没有意义的.

amazon-cognito aws-lambda aws-api-gateway

33
推荐指数
1
解决办法
6658
查看次数

Lambda集成与Lambda代理:优点和缺点

您认为在AWS API Gateway中使用和不使用代理功能的Lambda集成的优点和缺点是什么(更具体地说,在使用无服务器框架时)?这是我现在的想法:

Lambda与代理集成

  • Pro:人们可以快速进行原型设计和编码,而无需担心所有必需的配置细节(并重新发明一些轮子,如通用模板映射等).
  • Pro:返回任何状态代码和自定义标题非常容易,同时还有一种通用的方法来读取请求的正文,标题和参数.
  • Con:一切都在代码中完成,因此自动生成文档有点困难.依赖关系(标题,模型,返回的状态代码)在代码中"隐藏".

没有代理的Lambda集成

  • Con:需要更多的工作来设置它,并且这种配置可能在不同的资源中重复.
  • Pro:它允许人们分离lambda接收和返回的内容,以及如何将其映射到不同的HTTP状态代码,标头和有效负载.
  • Pro:非常有用,因为它预先规定了它返回的内容,以及它在标题和有效负载方面的要求.
  • Pro:从长远来看,设置所有内容时的艰苦工作非常有用,因为可以将所有内容导出到Swagger,以便其他人可以使用它为它生成不同的SDK.

你的想法是什么?您通常使用Lambda Proxy还是普通的Lambda集成?你喜欢什么,为什么?

编辑:到目前为止,我倾向于总是选择不使用代理功能,因为提到的原因(解耦和说明依赖关系 - 标题,状态代码等 - 预先).

aws-lambda aws-api-gateway serverless-framework

32
推荐指数
2
解决办法
5982
查看次数

CloudFormation在更新时不会部署到API网关阶段

当我deploy使用带有API网关资源的模板运行CloudFormation时,第一次运行它时,它会创建并部署到阶段.随后我运行它,它会更新资源但不会部署到阶段.

这种行为是否符合预期?如果是的话,我是如何在更新时将其部署到阶段的?

(Terraform提到了类似的问题:https://github.com/hashicorp/terraform/issues/6613)

amazon-web-services aws-cloudformation aws-api-gateway

31
推荐指数
6
解决办法
9174
查看次数

使用rest client POSTMAN使用api密钥调用AWS api网关端点

我们正在开发一个移动/网络应用程序,我们使用aws lambda和dynamo db作为我们的后端.独立的lambda功能正在完美运行.呼叫通过api网关路由.我们使用api密钥来利用它提供的安全功能.出于某些测试目的,我们试图通过第三方休息客户端POSTMAN调用api端点.

请求属于POST类型,但无论我们尝试什么,我们都会得到

403 ("message": "Missing authentication token.")

附上快照以供参考.(出于安全原因,少数部分用阴影表示)

在此输入图像描述

  1. 我们无法理解这种行为的根本原因.
  2. 如果使用其他工具可以实现同样的目的,请建议.

amazon-web-services aws-lambda aws-api-gateway

30
推荐指数
4
解决办法
3万
查看次数

微服务之间的数据共享

当前架构:

在此输入图像描述

问题:

我们在前端和后端层之间有两步流程.

  • 第一步:前端在微服务1(MS1)上验证用户的输入I1
  • 第二步:前端向微服务2 提交I1和更多信息

微服务2(MS2)需要验证来自前端的I1的完整性.如何避免对MS1的新查询?什么是最好的方法?

流程我正在尝试优化删除步骤1.3和2.3

流程1:

  • 1.1用户X从MS2请求数据(MS2_Data)
  • 1.2用户X在MS1上保留数据(MS2_Data + MS1_Data)
  • 1.3 MS1使用B2B HTTP请求检查MS2_Data的完整性
  • 1.4 MS1使用MS2_Data和MS1_Data来持久化数据库1并构建HTTP响应.

流程2:

  • 2.1用户X已经存储在本地/会话存储器中的数据(MS2_Data)
  • 2.2用户X在MS1上保留数据(MS2_Data + MS1_Data)
  • 2.3 MS1使用B2B HTTP请求检查MS2_Data的完整性
  • 2.4 MS1使用MS2_Data和MS1_Data来持久化数据库1并构建HTTP响应.

途径

一种可能的方法是在MS2和MS1之间使用B2B HTTP请求,但我们将在第一步中复制验证.另一种方法是将数据从MS1复制到MS2.然而,由于数据量和它的波动性,这是令人望而却步的.复制似乎不是一个可行的选择.

我认为更合适的解决方案是前端有责任获取微服务2上的微服务1所需的所有信息并将其传递给微服务2.这将避免所有这些B2B HTTP请求.

问题是微服务1如何信​​任前端发送的信息.也许使用JWT以某种方式对来自微服务1的数据进行签名,并且微服务2将能够验证该消息.

注意 每次微服务2需要来自微服务1的信息时,执行B2B http请求.(HTTP请求使用ETAG缓存控制:max-age).怎么避免这个?

建筑目标

在此输入图像描述

微服务1需要来自微服务2的数据,以便能够在MS1数据库上保持MS1_Data和MS2_Data,因此使用代理的ASYNC方法不适用于此.

我的问题是,是否存在设计模式,最佳实践或框架,以实现这种推力沟通.

当前体系结构的缺点是在每个微服务之间执行的B2B HTTP请求的数量.即使我使用缓存控制机制,每个微服务的响应时间也会受到影响.每个微服务的响应时间至关重要.这里的目标是存档更好的性能,以及如何使用前端作为网关在多个微服务之间分配数据,但使用推力通信.

MS2_Data只是MS1必须用于维护数据完整性的产品SID或供应商SID的实体SID.

可能解决方案

在此输入图像描述

这个想法是使用网关作为api网关请求处理,它将缓存来自MS1和MS2的一些HTTP响应,并将它们用作对MS2 SDK和MS1 SDK的响应.这样,在MS1和MS2之间不直接进行通信(SYNC或ASYNC),也避免了数据复制.

当然,上述解决方案仅适用于跨微服务的共享UUID/GUID.对于完整数据,事件总线用于以异步方式(事件源模式)跨微服务分发事件和数据.

灵感:https://aws.amazon.com/api-gateway/https://getkong.org/

相关问题和文档:

architecture design-patterns data-sharing microservices aws-api-gateway

30
推荐指数
1
解决办法
9996
查看次数

在AWS Lambda中,我可以在哪里安全地存储API凭据?

我有一个通过API网关配置的lambda函数,该函数应该通过Node(例如:Twilio)访问外部API.我不想在lambda函数中存储函数的凭据.有没有更好的地方设置它们?

amazon-web-services aws-lambda aws-api-gateway

29
推荐指数
4
解决办法
1万
查看次数

Amazon API网关超时

我对API网关有一些问题.我制作了一些API方法,有时它们工作时间超过10秒,亚马逊返回504错误.以下是截图:

在此输入图像描述

请帮忙!如何增加超时?

谢谢!

amazon-web-services aws-api-gateway

28
推荐指数
6
解决办法
3万
查看次数

无法在AWS API Gateway中创建阶段

我想在AWS Api Gateway中创建一个新阶段,但由于某种原因,部署列表为空.我尝试检查所有部分,但找不到我可以添加/创建部署项的部分.

任何想法如何解决这个问题?

在此输入图像描述

amazon-web-services aws-api-gateway

28
推荐指数
2
解决办法
4833
查看次数

由于配置错误,执行失败:Lambda 函数的权限无效

我正在通过 Visual Studio 使用 AWS Lambda 和 API Gateway 构建无服务器应用程序。我正在使用 C#,并使用无服务器应用程序模型 (SAM) 来部署我的 API。我在 Visual Studio 中构建代码,然后通过发布到 Lambda 进行部署。这是有效的,除了每次我进行新构建并尝试执行 API 调用时,我都会收到此错误:

由于配置错误,执行失败:Lambda 函数的权限无效

做了一些研究,我发现其他地方提到了这个修复(通过 AWS 控制台完成):

修复:转到 API 网关 > API 名称 > 资源 > 资源名称 > 方法 > 集成请求 > Lambda 函数并重新选择我现有的函数,然后用小复选标记“保存”它。

现在这对我有用,但它破坏了使用 serverless.template (JSON) 构建我的 API 的自动化。有谁知道如何在 serverless.template 文件中解决这个问题?这样我就不需要在控制台中采取行动来解决?这是 serverless.template 文件中我的一种方法的示例

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Transform" : "AWS::Serverless-2016-10-31",
  "Description" : "An AWS Serverless Application.",

  "Resources" : {

    "Get" : {
      "Type" : "AWS::Serverless::Function",
      "Properties": {
        "VpcConfig":{
          "SecurityGroupIds" : …
Run Code Online (Sandbox Code Playgroud)

aws-lambda aws-api-gateway serverless-application-model

28
推荐指数
4
解决办法
2万
查看次数