我的 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
我有一个与 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) 在我的 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)
是否需要向角色附加特定权限才能消除此错误?
众所周知,Lambda 是一项由 AWS 处理的无服务器服务。
我当前的流程是:
客户端(API) -> API网关 -> lambda
我想知道当我的 Lambda 所在的区域出现故障时会发生什么?还想知道当 API 网关区域出现故障时会发生什么。
应该如何处理呢?它是由 AWS 处理,因为它是无服务器的,还是我应该自己处理,那会怎么样?
disaster-recovery amazon-web-services aws-lambda aws-api-gateway
我正在尝试通过 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) 如您所见,我尝试设置一个名为“name”的简单查询参数。
TBH,我不完全理解“映射自”是什么意思,我只是按照此处的官方示例文档(步骤7)并将其设置为method.request.querystring.name. 但它仍然抱怨它无效。

rest amazon-web-services restful-url query-string aws-api-gateway
我尝试构建一个简单的 Rest API。我只知道如何通过映射将查询字符串传递给我的 lambda 函数。现在我想知道是否有方法将“资源”传递给我的 lambda 函数?
例如,我的 lambda 如何获得“水果”和“蔬菜”?
我尝试通过调用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 运行删除使用计划功能
使用计划已成功删除,没有任何错误,但是,我应该能够删除它,而无需删除阶段并在之后重新创建它。
我正在开发一个具有以下工作流程的项目: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
我创建了一条路线和一个集成,但我无法使用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 中执行此操作非常简单:
如何在命令行中实现这一点?
aws-api-gateway ×10
aws-lambda ×5
aws-cli ×1
aws-sdk ×1
aws-sdk-js ×1
axios ×1
cors ×1
express ×1
localstack ×1
node.js ×1
openapi ×1
query-string ×1
rest ×1
restful-url ×1
terraform ×1
vue.js ×1