我正在尝试使用AWS API Gateway作为图像服务前的代理.我能够让图像通过,但它显示为一大块ASCII,因为Content-Type被设置为"application/json".
有没有办法告诉网关不要改变源内容类型?
我只想通过"image/jpeg","image/png"等来实现.
我尝试将文件从iOS上传到AWS API网关并通过它传递给Lambda函数,我该如何实现这种情况?
我可以使用multipart/form-data上传到AWS API Gateway但是如何使输入Model支持二进制数据?
[Edit1]从Spektre的回答中移开
谢谢对于响应,经过一些阅读后我发现无法将文件上传到lambda(并且它不合逻辑因为它是基于事件的)并且是上传到S3并使S3通知lambda的唯一有效用例.
我试图看看如何从lambda代码中访问请求标头和正文值.如果请求主体是JSON格式,它似乎会自动解析并在事件对象中可用.
如何在Lambda中访问任何类型的传入"Content-Type"请求的完整查询字符串,请求正文,请求标头(cookie)?
以下编辑是我收集的信息,以帮助解决可能相关或不相关的问题.如果你愿意,请忽略它们.
编辑:
我在这里和这里详细介绍了SE的现有问题.按照这个线程,使用$input.json('$')应该做的伎俩.我猜上面这些链接的答案已经过时,因为默认情况下API网关似乎在请求中识别JSON,如果是这样,它在event对象中可用,而不配置任何映射模板.
按建议设置映射对我不起作用.它不包含请求标头信息.
以下是有关如何配置的屏幕截图.
"headers"键返回一个空值.使用$input.params('$')或"$input.params('$')"错误输出.
编辑2
尝试在方法请求中定义标头.仍然没有在lambda中获取User-Agent值.
编辑3
我在API网关上使用了以下模板映射
{
"request": $input.json('$'),
"headers": "$input.params()"
}
Run Code Online (Sandbox Code Playgroud)
以及lambda中的以下代码
context.succeed("event.key32:"+JSON.stringify(event, null, 2) );
Run Code Online (Sandbox Code Playgroud)
查看响应中的"标题"值,看起来AWS-SDK/API网关/ cloudfront剥离了从HTTP客户端收到的所有标头?以下是$ input.params().标头返回的JSON的全文
header={CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, Content-Type=application/json, Via=1.1 5d53b9570d94ce920abbd471.cloudfront.net (CloudFront), 1.1 95eea7baa7ec95c9a41eca9e3ab7.cloudfront.net (CloudFront), X-Amz-Cf-Id=GBqmObLRy6Iem9bJbVPrrW1K3YoWRDyAaMpv-UkshfCsHAA==, X-Forwarded-For=172.35.96.199, 51.139.183.101, X-Forwarded-Port=443, X-Forwarded-Proto=https}}
Run Code Online (Sandbox Code Playgroud)
它在标头中没有User-Agent字符串,尽管如上面的屏幕截图所示,它是由REST客户端发送的.有趣的是,整个查询字符串可用.不确定这是否是访问它的预期方式.
我一直在网上寻找答案.
基本上,我们使用Swagger来启动一个API,它非常棒并且运行良好,但有一件事不起作用......当我们调用一个端点时,我们得到一个500错误(它不是500错误,我们提供的是AWS的一个.该错误指出"由于配置错误导致执行失败:对Lambda函数的权限无效"(https://youtu.be/H4LM_jw5zzs < - 这是来自其他用户的视频,我收到的错误).
我已经走了很多路,并找到了答案......它涉及使用AWS CLI,看起来有点像这样:
aws lambda add-permission \
--function-name FUNCTION_NAME \
--statement-id STATEMENT_ID \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn "arn:aws:execute-api:us-east-1:ACCOUNT_ID:API_ID/*/METHOD/ENDPOINT"
Run Code Online (Sandbox Code Playgroud)
这很棒,但我们正在使用CloudFormation来启动所有内容,我们希望这是自动化的.有没有更简单的方法来解决这个问题?CloudFormation中是否有某些内容可以为我们提供所需的资源政策?
我正在尝试这个问题,但是我今天已经开始工作了几个小时,这对我们的API版本来说有点阻碍,所以任何帮助都会非常感激.:)
amazon-web-services aws-cloudformation aws-lambda aws-api-gateway
众所周知,API Gateway和lambda支持二进制请求/响应,但我对节点JavaScript中的后端编程有一个疑问.
环境:
在上述环境中,在我的代码中,我将响应内容作为二进制(缓冲对象数组).
但是,如果我直接将Buffer对象数组作为响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body
});
Run Code Online (Sandbox Code Playgroud)
收到回复是这样的:
Content-type: image/jpeg
{type=Buffer, data=[255,216,255,224,0,16,74,70,73,70,0...
Run Code Online (Sandbox Code Playgroud)
如果我通过base64编码将Buffer对象数组作为响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body.toString('base64')
});
Run Code Online (Sandbox Code Playgroud)
收到回复是这样的:
Content-type: image/jpeg
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDA...
Run Code Online (Sandbox Code Playgroud)
如何使用无服务器框架从节点JS后端向API网关提供二进制响应?
== PostScript ==
根据此文档:
没有Accept标头的AWS API Gateway二进制输出
我们必须将Integration响应的"Content Handling"更改为"CONVERT TO BINARY",以响应二进制响应.
但是我该怎么设置呢?
我不知道serverless.yml和AWS控制台GUI.
如果我成功设置了Content Handling => CONVERT TO BINARY,我可以解决响应二进制响应吗?
== 1月17日编辑==
嗨@ ka-hou-ieong
你写了rest-api-id和resource-id,它们在下面的图片中,对吗?
但是使用这些id,命令结果说:
$aws apigateway put-integration-response --rest-api-id XXXXXXXX --resource-id XXXXXX --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY
An error occurred …Run Code Online (Sandbox Code Playgroud) 我按照教程创建和调用步骤函数
我在api的GET请求中得到了输出
{
"executionArn": "arn:aws:states:ap-northeast-1:123456789012:execution:HelloWorld:MyExecution",
"startDate": 1.486772644911E9
}
Run Code Online (Sandbox Code Playgroud)
但是,而不是上面的响应,我想要我的步骤函数输出,由下面的结束状态给出.
{
"name":"Hellow World"
}
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?
amazon-web-services aws-lambda aws-api-gateway aws-step-functions
我有一个字符串(这里解码为base64),如下所示:
----------------------------212550847697339237761929
Content-Disposition: form-data; name="preferred_name"; filename="file1.rtf"
Content-Type: application/rtf
{\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0
\f0\fs24 \cf0 testing123FILE1}
----------------------------212550847697339237761929
Content-Disposition: form-data; name="to_process"; filename="file2.rtf"
Content-Type: application/rtf
{\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0
\f0\fs24 \cf0 testing123FILE212341234}
----------------------------212550847697339237761929--
Run Code Online (Sandbox Code Playgroud)
我在一个简单的网页上生成此内容,该网页通过API网关的PUT请求将几个文件上传到AWS Lambda脚本.应该注意的是,我从API网关获得的是一个Base64字符串,然后我将其解码为上面的字符串.
上面的字符串是我的Lambda脚本从API网关接收的数据.我想要做的是解析这个字符串,以便检索Python 2.7中包含的数据.我已经尝试过cgi该类并使用该cgi.parse_multipart()方法,但是,我找不到将字符串转换为所需参数的方法.有小费吗?
我有一个程序执行几千蒙特卡罗模拟来预测结果; 我不能说他们真正预测的是什么,所以我将使用"无可争议的圣诞老人存在"中的另一个例子,因为这些算法的内容与问题无关.我想知道Monopoly董事会上每个广场的访问频率(预测哪些是最好的购买物业).为此,我模拟了数千个游戏并整理结果.我目前的实现是一个独立的C#应用程序,但我想将它移动到云端,以便我可以将其作为服务提供 - 每个用户都可以通过提交每个骰子的边数来获得个性化结果.
当前的实现也非常慢 - 它非常简单,因为每个模拟都是完全独立的,但我只有8个内核,因此在我的本地机器上完成大约50000个单独模拟的完整预测需要20分钟.
计划是让AWS lambda函数运行一个(或几个)模拟然后整理 - 基本上mapreduce它.我查看了使用AWS EMR(弹性MapReduce),但这对于我想要的太大了,旋转实例单独运行计算似乎比单独的整个计算花费更长时间(这对于多个小时离线分析,但我希望通过Web请求进行低延迟响应).
我认为理想的是:
Lambda 0 - 触发许多其他lambda函数,每个函数执行一小部分计算.Lambda 1..N - 并行进行多次模拟(数字不是常数).Lambda N + 1 - 整理所有结果并返回答案.
这里有一个lambda mapreduce框架:
https://github.com/awslabs/lambda-refarch-mapreduce
但它似乎有一个主要缺点 - 每次地图阶段完成时,它会将结果写入S3(我可以将其作为临时使用)然后通过事件触发新的lambda.触发lambda看看是否所有结果都已写入存储.如果不是,则结束,如果是,则执行还原步骤.这似乎是一个公平的解决方案,但我只是稍微关注a)当两个结果汇总在一起时,两个减速器都能计算结果?并且b)看起来好像它已经解雇了很多只是决定不运行的lambdas(我知道它们运行起来很便宜,但是每次模拟的数量加倍到两次 - 计算并且可能会减少 - 显然会使成本增加一倍).有没有办法在100个文件写入文件夹而不是每个文件后写入S3结果?
我看了一下使用步骤函数,但是我不确定如何在一步中并行激发多个lambdas并让它们在状态机转换之前全部返回.然而,步骤函数对于最终的皱纹是有用的 - 我想在API后面隐藏所有这些.
根据我的阅读,API可以触发lambda并返回该lambda的结果,但我不希望被调用的lambda是返回结果的lambda.当您从API调用步骤函数时,不是API调用返回最后一个状态的结果.
总之,我想:
API请求 - >并行计算结果 - > API响应
中间的那一点我不清楚该怎么做,同时能够将所有结果作为对原始请求的响应返回 - 或者单独使用它们很容易.
我可以看到几个选项:
使用现在由AWS API网关本机支持的步骤函数,并在一个状态中调用多个lambda,等待它们在转换之前返回.
使用AWS EMR,但以某种方式保持配置的实例始终处于活动状态以避免配置时间开销.这显然否定了Lambda的可扩展性并且更加昂贵.
使用mapreduce框架或类似的东西,找到一种方法来响应来自不同lambda的传入请求到API请求最初调用的请求.理想情况下还要减少此处涉及的S3事件的数量,但这不是优先事项.
立即响应来自第一个lambda的原始API请求,然后在计算完成后将更多数据推送给用户(它们应该只需要大约30秒的并行性,并且域是这样的,这是可以接受的等待时间响应,甚至HTTP响应).
我怀疑它会对解决方案产生任何影响,因为它只是中间位的扩展,而不是根本的改变,但真正的计算是迭代的,所以会是:
请求 - > Mapreduce - > Mapreduce - > ... - >响应
只要我知道如何在一个请求中链接一组lambda函数,链接更多应该更多相同(我希望).
谢谢.
PS我无法创建它们,标签aws-emr也不aws-elastic-mapreduce存在.
amazon-web-services aws-lambda aws-api-gateway aws-step-functions
我正在 $connect 路由上设置一个带有自定义授权方的 AWS API Gateway Websockets,如下所述:
我的问题是——我如何获得 connectionID,即我可以用来稍后向该连接的客户端广播的标识符?
我正在研究微服务架构,我想聚合来自两个微服务的数据。
例如,Frontend 调用 API Gateway,API Gateway 调用两个微服务 Customer 和 Order 微服务。客户微服务返回客户详细信息,订单微服务返回客户所有订购的产品。
这是使用 Ocelot 或 Azure API 管理从两个微服务聚合后 API 网关返回的格式。
格式 1
{
"Customers":[
{
"customerId":1001,
"customerName":"Tom"
},
{
"customerId":1002,
"customerName":"Jerry"
}
],
"Orders":[
{
"CustomerId":1001,
"Orders":[
{
"ProductId":"PRO1",
"ProductName":"Books"
},
{
"ProductId":"PRO2",
"ProductName":"Pens"
}
]
},
{
"CustomerId":1002,
"Orders":[
{
"ProductId":"PRO3",
"ProductName":"Pencils"
},
{
"ProductId":"PRO4",
"ProductName":"Toys"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想要的格式是格式 2。
格式 2
{
"OrderDetails":[
{
"customerId":1001,
"customerName":"Tom",
"Orders":[
{
"ProductId":"PRO1",
"ProductName":"Books"
},
{
"ProductId":"PRO2",
"ProductName":"Pens"
}
] …Run Code Online (Sandbox Code Playgroud) azure-api-management microservices aws-api-gateway api-gateway ocelot
aws-api-gateway ×10
aws-lambda ×6
api-gateway ×2
aws-sdk ×1
ios ×1
ocelot ×1
python ×1
websocket ×1