无服务器 lambda 部署卡在 UPDATE_ROLLBACK_COMPLETE
Posted
技术标签:
【中文标题】无服务器 lambda 部署卡在 UPDATE_ROLLBACK_COMPLETE【英文标题】:Serverless lambda deploy stuck in UPDATE_ROLLBACK_COMPLETE 【发布时间】:2022-01-20 10:44:15 【问题描述】:我正在尝试部署此无服务器应用程序,但它卡在了 UPDATE_ROLLBACK_COMPLETE 状态。我已经进行了一些搜索,但所有答案都说要检查失败的嵌套堆栈,这不是我的情况。 这是我的 canformation 资源的打印屏幕,您可以看到这两个资源都已成功创建:
这是我的 serverless.yml
app: mentoria-tech-server
service:
name: mentoria-tech-server
useDotenv: true
package:
exclude:
- node_modules/**
custom:
jest:
collectCoverage: true
pg_user: $env:MENTORIA_TECH_PG_USER
pg_host: $env:MENTORIA_TECH_PG_HOST
pg_password: $env:MENTORIA_TECH_PG_PASSWORD
pg_database: $env:MENTORIA_TECH_PG_DATABASE
pg_port: $env:MENTORIA_TECH_PG_PORT
pg_database_url: $env:MENTORIA_TECH_DATABASE_URL
provider:
name: aws
stage: $opt:stage, 'development'
runtime: nodejs12.x
memorySize: 512
timeout: 10
environment:
MENTORIA_TECH_PG_USER: $self:custom.pg_user
MENTORIA_TECH_PG_HOST: $self:custom.pg_host
MENTORIA_TECH_PG_DATABASE: $self:custom.pg_database
MENTORIA_TECH_PG_PASSWORD: $self:custom.pg_password
MENTORIA_TECH_PG_PORT: $self:custom.pg_port
MENTORIA_TECH_DATABASE_URL: $self:custom.pg_database_url
functions:
- $file(./functions/boards.yml)
- $file(./functions/journey.yml)
- $file(./functions/user.yml)
- $file(./functions/subscription.yml)
plugins:
- serverless-plugin-typescript
- serverless-offline
有人知道为什么会这样吗?提前谢谢你:)
更新:这是serverless deploy
的输出
An error occurred: ApiGatewayResourceApiV1BoardEmailVar - Resource handler returned message: "A sibling (id) of this resource already has a variable path part -- only one is allowed (Service: ApiGateway, Status Code: 400, Request ID: 56f13ceb-ddb6-4f28-821e-f39d516563f3, Extended Request ID: null)" (RequestToken: 27e9b5a5-ca84-4a43-dcde-d6fab549c1d4, HandlerErrorCode: InvalidRequest).
【问题讨论】:
你好夏娃!您可以发布serverless deploy
的输出吗?屏幕截图看起来部署成功,但回滚意味着创建失败并被还原。
嘿 @AaronStuyvenberg 这是输出:An error occurred: ApiGatewayResourceApiV1BoardEmailVar - Resource handler returned message: "A sibling (id) of this resource already has a variable path part -- only one is allowed (Service: ApiGateway, Status Code: 400, Request ID: 56f13ceb-ddb6-4f28-821e-f39d516563f3, Extended Request ID: null)" (RequestToken: 27e9b5a5-ca84-4a43-dcde-d6fab549c1d4, HandlerErrorCode: InvalidRequest).
不确定 id 是什么,是应用程序的名称吗?
你能发布你链接到的函数文件吗?请将它们发布在原始问题中,以便它们具有适当的空格。这就是错误的来源。
【参考方案1】:
没有看到你的功能配置,或者不了解你想要做什么 - 这很难调试。
但是,如果您正在移动 API 网关路径变量 IE,我可以看到此错误通常会发生:
functions:
hello:
handler: handler.hello
events:
- http:
path: /foo/id/bar
到
functions:
hello:
handler: handler.hello
events:
- http:
path: /foo/bar/id
不幸的是,这是 CloudFormation 的一个限制,因为它会在删除旧资源之前创建新资源,这会导致此问题 source,因此这仍然是一个未解决的问题。
您需要创建一个新函数并将请求临时路由到该函数,然后删除旧路由,然后添加新路由,最后将请求路由到旧函数。
【讨论】:
【参考方案2】:Aaron 的建议真的很有帮助!原来我有这两个功能:
getUser:
handler: src/controllers/user.getOne
events:
- http:
path: v1/user/id
method: GET
updateUser:
handler: src/controllers/user.update
events:
- http:
path: v1/user/email
method: PUT
在其中一个中,我使用 id 作为参数,而在另一个中,我使用电子邮件。它们应该都是 id 或都是电子邮件。您只能对不同的路径使用不同的参数! 所以它应该是这样的:
getUser:
handler: src/controllers/user.getOne
events:
- http:
path: v1/user/email
method: GET
updateUser:
handler: src/controllers/user.update
events:
- http:
path: v1/user/email
method: PUT
非常感谢 Aaron,它现在可以工作了!
【讨论】:
以上是关于无服务器 lambda 部署卡在 UPDATE_ROLLBACK_COMPLETE的主要内容,如果未能解决你的问题,请参考以下文章
如何使用事件将 json 输入传递给在无服务器中部署的 Cron 计划 Lambda?
将无服务器 next.js 反应应用程序部署到 AWS Lambda,得到 "message":"Internal server error"