无服务器 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?

无服务器框架将 Lambda 添加到现有 VPC 和子网

无服务器部署多个功能

外部 Http 调用上的无服务器框架/Lambda 错误

将无服务器 next.js 反应应用程序部署到 AWS Lambda,得到 "message":"Internal server error"

部署到 AWS lambda 时找不到模块 ./dist/server