您认为在AWS API Gateway中使用和不使用代理功能的Lambda集成的优点和缺点是什么(更具体地说,在使用无服务器框架时)?以下是我现在的想法:
与代理进行Lambda集成
没有代理的Lambda集成
你有什么想法?您通常使用Lambda Proxy还是普通的Lambda集成?你喜欢什么,为什么?
编辑:到目前为止,我倾向于总是选择不使用代理功能,因为提到的原因(解耦和说明依赖关系 - 标题,状态代码等等)。< / p>
答案 0 :(得分:5)
无代理。
我在生产中有几个SLS部署,有些产生了一些作为内部工具的收入。我专门不使用代理。我不想依赖AWS的结构来应用我的应用程序,所以如果我们不再成为朋友,我可以毫不费力地迁移。
至于代理人的优点,我会认为它们是缺点,因为它感觉你也有,并且作为专业人士。在“让我们快速移动”之前,我已经看到了这一切。是的,我们需要敏捷并快速行动,但不要以牺牲思维为代价。我总是和我的工程师一起得到这个,在文档/设计上还有一件事就是另外一起说“坚持规划让代码”。无论你多快进入市场,这就是你如何改变自己。没有代理(以及对项目结构进行一些早期规划,也许还有一些优秀的DDD思想),如果世界燃烧,那么从AWS迁移起来非常简单。
除此之外,我发现很难通过AWS的东西快速获得新的标准。一旦你知道它的所有肉汁,但开发人员是开发人员,而不是基础设施工程师(我们这些两者都非常罕见)。抽象离开可以帮助人们在狂欢节开始他们艰难的旅程时保持高效。我更喜欢我的编码器代码,而不是每20分钟就打扰一次CFN。
答案 1 :(得分:2)
我们也从Proxy开始,因为启动和运行许多功能确实非常快。很快我们就意识到,我们与代理强制我们读取输入和写入输出的方式建立了非常紧密的耦合,并且我们的函数对此一无所知,并且应该具有更清晰,更简单的界面。然后,我们想开始使用AWS Step Functions and that's when we realized we had created functions that really only work with the Proxy integration来协调其中一些功能。不能使用步进功能,因此它们肯定不容易迁移。
没有代理了。
答案 2 :(得分:2)
它看起来像AWS recommends choosing Lambda Proxy Integration for new API development。
注意
Lambda定制集成(以前称为Lambda集成)是一项旧技术。我们建议您对任何新API使用Lambda代理集成。有关更多信息,请参阅使用Lambda代理集成构建API网关API。
我知道,使用代理集成而非自定义集成来启动API端点和lambda集成是很“快”的事情(短期内),但令我惊讶的是,这是对 all的推荐 API / Lambda开发正在进行:
答案 3 :(得分:2)
我不喜欢人体贴图模板,因为在导出的Swagger中它是转义的,例如:
uri: "arn:aws:apigateway:us-east-1:dynamodb:action/UpdateItem"
responses:
default:
statusCode: "200"
requestTemplates:
application/json: "{\n \"TableName\": \"happy-marketer\",\n \"Key\"\
: {\n \"pk\": {\n \"S\": \"project\"\n },\n \
\ \"sk\": {\n \"S\": \"$context.authorizer.claims.email\
\ $util.urlDecode($input.params('name'))\"\n }\n },\n \"\
UpdateExpression\": \"SET projectStatus = :c\",\n \"ExpressionAttributeValues\"\
: {\n \":c\": {\n \"S\": \"Completed\"\n\n }\n\
\ }\n}"
passthroughBehavior: "never"
httpMethod: "POST"
type: "aws"
/projects/{name}/status/restore:
options:
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- name: "name"
in: "path"
并且您了解-在本地编辑此类“代码”并部署此swagger文件是不好的。同样,当您在浏览器中编辑身体贴图模板时,您将不会收到有关错误的JSON / Apache Velocity的错误。例如,这里我们有一个错误:
{
"email": "$context.authorizer.claims.email",
"nameOld": "$util.urlDecode($input.params('name'))",
#if ($input.path('$.nameNew') != "")
"nameNew": "$util.urlDecode($input.path('$.nameNew'))",
#end
#if ($input.path('$.ownerNew') != "")
"ownerNew": "$input.path('$.ownerNew')",
#end
#if ($input.path('$.shared') != "")
"shared": $input.json('$.shared')
#end
#if ($input.path('$.StartDate') != "")
, "startDate": "$input.path('$.StartDate')"
#end
#if ($input.path('$.DueDate') != "")
, "dueDate": "$input.path('$.DueDate')"
#end
}
错误是-,
之前的startDate
错误。我在Go中的后端代码没有出现此类错误。我不想为Apache Velocity编写测试。
此外,也许代理集成速度更快-因为缺少“中间服务”。
答案 4 :(得分:0)
作为最佳实践,我个人会选择代理集成(与 proxy resource 不同)。原因如下: