标签: aws-api-gateway

API 网关返回损坏的 Excel 文件

我的 API 端点返回一个从 S3 流式传输的 Excel 文件。它可以在本地运行,但在 API 网关上测试时文件已损坏。这是我的 API 代码:

const downloadContentFromS3 = async function(bucket, file) {
  return new Promise((resolve, reject) => {
    streamFileFromS3(bucket, file, (error, s3buffer) => {
      if (error) return reject(error);
      return resolve(s3buffer);
    });
  });
};

const streamFileFromS3 = async function(bucket, fileName, callback) {
  const params = {
    Bucket: bucket,
    Key: fileName,
  };

  const buffers = [];
  const stream = s3.getObject(params).createReadStream();
  stream.on('data', data => buffers.push(data));
  stream.on('end', () => callback(null, Buffer.concat(buffers)));
  stream.on('error', error => callback(error));
};

downloadExcelFile: async …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js express aws-lambda aws-api-gateway

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

尽管已设置标头,但调用 API 网关仍返回 CORS 错误

我有一个与 Lambda 函数集成的 API 网关(HTTP 类型)。我试图从本地主机调用该函数,如下所示:

const jwt = getAuthToken();
const formBody = new FormData();
formBody.set('user', 'test');

const res = await fetch('https://example.execute-api.eu-west-1.amazonaws.com/default/GetShareValue', {
method: 'POST',
body: formBody,
headers: {
   'Authorization': jwt
   }
});
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误消息:

从源“http://localhost:3000”获取“https://example.execute-api.eu-west-1.amazonaws.com/default/GetShareValue”的访问已被 CORS 策略阻止:对预检的响应请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。

我了解不正确的 CORS 设置将阻止浏览器显示 Lambda 函数返回的内容。但是,我的 API 网关指定了 CORS 设置:

在此输入图像描述

根据此线程,在 Lambda 函数的响应中设置标头非常重要。我已将它们设置为相同。这是我的 Lambda 函数:

exports.handler = async (event, context) => {
    let body;
    let statusCode = '200';
    const headers = {
        'Content-Type': 'application/json',
        "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,X-Amz-Security-Token,Authorization,X-Api-Key,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Methods": "*",
        "X-Requested-With": …
Run Code Online (Sandbox Code Playgroud)

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

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

创建 aws_api_gateway_account 资源返回 AccessDeniedException

在我的 terraform 脚本中,我有以下资源 -

resource "aws_api_gateway_account" "demo" {
  cloudwatch_role_arn = var.apigw_cloudwatch_role_arn
}
Run Code Online (Sandbox Code Playgroud)

在应用阶段,我看到以下错误 -

2020/09/21 20:20:48 [ERROR] <root>: eval: *terraform.EvalApplyPost, err: Updating API Gateway Account failed: AccessDeniedException: 
    status code: 403, request id: abb0662e-ead2-4d95-b987-7d889088a5ef
Run Code Online (Sandbox Code Playgroud)

是否需要向角色附加特定权限才能消除此错误?

terraform aws-api-gateway terraform-provider-aws

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

lambda函数和api网关如何处理灾难恢复?

众所周知,Lambda 是一项由 AWS 处理的无服务器服务。

我当前的流程是:

客户端(API) -> API网关 -> lambda

我想知道当我的 Lambda 所在的区域出现故障时会发生什么?还想知道当 API 网关区域出现故障时会发生什么。

应该如何处理呢?它是由 AWS 处理,因为它是无服务器的,还是我应该自己处理,那会怎么样?

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

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

Vue &amp; Axios + AWS API Gateway &amp; Lambda - CORS + POST 不起作用

我正在尝试通过 AWS API Gateway 创建一个 API 测试函数,以及一个通过 Axios 的 Vue 应用程序调用的 Lambda 函数。它应该从输入元素发送姓名和电子邮件。每次我收到此错误时:

Access to XMLHttpRequest at '[API Gateway URL]' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Run Code Online (Sandbox Code Playgroud)

我已在 API 网关设置中的每个步骤/资源上启用了 CORS(根据本文)。下面是 Vue 组件的代码:

<template>
<div data-app>
        <div class="cell" id="testForm">
    {{responseMsg}}

       <label>Name</label>
       <input v-model="name" type="text" placeholder="Name">
       <label>Email Address</label>
       <input v-model="email" type="email" placeholder="Email Address">
       <button v-on:click="formFunction">Submit</button>
   
   </div>
</div>
</template>

<script>
import axios …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services vue.js aws-lambda aws-api-gateway axios

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

如何修复 Amazon API Gateway 中的“指定的映射表达式参数无效”

如您所见,我尝试设置一个名为“name”的简单查询参数。

TBH,我不完全理解“映射自”是什么意思,我只是按照此处的官方示例文档(步骤7)并将其设置为method.request.querystring.name. 但它仍然抱怨它无效。 在此输入图像描述

rest amazon-web-services restful-url query-string aws-api-gateway

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

AWS:如何将API网关中定义的资源传递给lambda?

我尝试构建一个简单的 Rest API。我只知道如何通过映射将查询字符串传递给我的 lambda 函数。现在我想知道是否有方法将“资源”传递给我的 lambda 函数?

例如,我的 lambda 如何获得“水果”和“蔬菜”?

在此输入图像描述

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

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

使用 AWS 开发工具包 JavaScript 删除使用计划

我尝试通过调用deleteUsagePlan函数并传递usagePlanId参数来使用AWS SDK删除使用计划,如下所示:

  const params: AWSNXR.APIGateway.DeleteUsagePlanRequest = {
    usagePlanId: usage_plan_id,
  };

  const apigw = new AWS.APIGateway();

  const response = await apigw.deleteUsagePlan(params).promise();
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,我无法这样做,并且收到此错误:BadRequestException:无法删除使用计划 USAGE_PLAN_ID_HERE,因为有与其关联的 API 阶段,包括 API_ID_HERE:测试

重现步骤:

1-使用以下参数创建使用计划

名称:“my_usage_plan”,apiStages:[ apiId:“API_ID_HERE”,阶段:“测试”]

2-删除使用计划

使用计划 ID:USAGE_PLAN_ID

我在步骤 #2 中不断收到错误消息: BadRequestException: 无法删除使用计划 USAGE_PLAN_ID_HERE 因为有与其关联的 API 阶段,包括 API_ID_HERE:test

预期行为:

预期的行为是能够使用使用计划 ID 删除新创建的使用计划

附加内容:

我尝试解决此问题的方法: 1- 我尝试删除 API 网关上的测试阶段 2- 我使用相同的使用计划 ID 运行删除使用计划功能

使用计划已成功删除,没有任何错误,但是,我应该能够删除它,而无需删除阶段并在之后重新创建它。

amazon-web-services aws-sdk aws-api-gateway aws-sdk-js

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

使用同步 StepFunctions 处理 API Gateway 中的错误

我正在开发一个具有以下工作流程的项目:API 网关(使用开放 api 定义)触发来自 AWS 的 Step 函数。有 2 个步骤,如果出现错误,状态机定义中有一个 catch 块。

但我面临错误处理的问题。即使我的代码抛出错误(例如 400),我的 Postman(或其他 REST API 测试工具)也会响应 200。我想要 500/400...

这是代码:

Step 函数定义为无服务器

stepFunctions:
  stateMachines:
    PostPayment:
      name: testfunction
      type: EXPRESS
      definition:
        Comment: 'test'
        StartAt: Function1
        States:
          Function1:
            Type: Task
            Resource: !GetAtt Function1.Arn
            Catch:
              - ErrorEquals: ['HandledError']
                Next: Fallback
            Next: Function2
          Function2:
            Type: Task
            Resource: !GetAtt Function2.Arn
            Catch:
              - ErrorEquals: ['HandledError']
                Next: Fallback
            End: true
          Fallback:
            Type: Fail
            Cause: "Error occured",
            Error: "Error"
Run Code Online (Sandbox Code Playgroud)

这是我的 openapi yml

x-amazon-apigateway-request-validator: all
x-amazon-apigateway-integration:
  requestParameters:
    integration.request.path.id: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-api-gateway openapi aws-step-functions

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

在 AWS-API-Gateway 中附加集成以通过 CLI 进行路由

我创建了一条路线和一个集成,但我无法使用awscli. 是否可以通过命令行执行此操作,或者只能通过 Web 界面执行此操作?

我的目标是在 Localstack Pro 中重现现有的 API-Gateway v2 配置(使用 AWS Web 控制台创建),在容器启动期间专门使用 aws-cli 工具进行设置。

我可以毫无困难地创建 API、路由和集成:

awslocal apigatewayv2 create-api --name="test-api" --protocol="http"
awslocal apigatewayv2 create-integration --api-id ebb87127 --integration-type AWS --integration-uri arn:aws:lambda:us-east-1:000000000000:function:some-lambda
awslocal apigatewayv2 create-route --api-id ebb87127 --route-key '$default'
Run Code Online (Sandbox Code Playgroud)

aws apigatewayv2 但我在文档下找不到任何将路由链接到集成的内容。

使用 Web 界面在“真正的”AWS 中执行此操作非常简单:

用于管理从路由到集成的链接的选项卡

创建新的集成并直接附加它

如何在命令行中实现这一点?

amazon-web-services aws-cli aws-api-gateway localstack

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