【问题标题】:Serverless lambda deploy stuck in UPDATE_ROLLBACK_COMPLETE无服务器 lambda 部署卡在 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 是什么,是应用程序的名称吗?
  • 你能发布你链接到的函数文件吗?请将它们发布在原始问题中,以便它们具有适当的空格。这就是错误的来源。

标签: amazon-web-services aws-lambda serverless serverless-framework


【解决方案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,它现在可以工作了!

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 2018-09-09
      • 2020-10-08
      • 2021-10-07
      • 2021-08-22
      • 2020-01-29
      • 2021-08-08
      • 1970-01-01
      相关资源
      最近更新 更多