使用 Jenkins SAM 插件构建无服务器应用程序时如何修复 'WaiterUnrecoverableException'

How to fix 'WaiterUnrecoverableException' when using the Jenkins SAM plugin to build a serverless app

我有一个非常简单的 Jenkins 作业,它构建一个步骤函数,然后将其部署到 AWS。我已经能够使用 SAM cli 从我的桌面构建和部署没问题。但是,当我设置 jenkins 来执行此操作时,出现以下错误:

ERROR: Build step failed with exception com.amazonaws.waiters.WaiterUnrecoverableException: Resource never entered the desired state as it failed.

堆栈在 AWS 中创建并保留在 REVIEW_IN_PROGRESS 中。我假设 'Waiter' 正在等待堆栈进入另一个状态。我找到了 ,但帮助不大。

通过 SAM CLI,我可以使用

打包和部署
sam package --output-template-file packaged.yaml --s3-bucket thebucketofjesse
sam deploy --template-file packaged.yaml --stack-name jesse-stack-6 --capabilities CAPABILITY_IAM --region us-west-1

编辑

我想我可能已经发现了这个问题的原因。我停止使用 SAM 插件,而是创建了一个批处理脚本来手动 运行 SAM 命令。一切正常,除了某些原因 'sam package' 没有将 S3 uri 添加到 yaml 模板输出。所以当它 运行s 'sam deploy' 它查看输出模板并期望一个 S3 uri。然后它失败并使堆栈处于 REVIEW_IN_PROGRESS 状态。

当我 运行 在 cli 中手动执行上述命令时,它会将我的 state-machine.yaml 文件上传到 S3,并且生成的 packaged.yaml cloudformation 模板将具有 S3 uri。

template.yaml

packaged.yaml

当我 运行 在 jenkins 中执行 sam 命令时,S3 uri 不在 packaged.yaml

我明白了。所以 sam package 命令似乎有问题。

在我的 template.yaml 文件中,我在名为 state-machine.yaml 的外部文件中指定了我的步进函数的定义(如果您不知道该怎么做 here)。在 template.yaml 文件中它看起来像这样

Resources:
  ClosedCaptionStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      RoleArn:
        Fn::GetAtt:
        - ClosedCaptionStateMachineRole
        - Arn
      Fn::Transform:
        Name: AWS::Include
        Parameters:            
          Location: 'state-machine.yaml'

当我 运行 sam package 应该将 state-machine.yaml 文件上传到 S3 存储桶,然后插入 S3 uri 到我命名为 packaged.yaml 的结果 yaml 输出文件中。看起来像这样

Resources:
  ClosedCaptionStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      RoleArn:
        Fn::GetAtt:
        - ClosedCaptionStateMachineRole
        - Arn
      Fn::Transform:
        Name: AWS::Include
        Parameters:
          Location: s3://thebucketofjesse/ba638c2815c6a4d4ad93c5bb5e3c4f32

但是,出于某种原因,它没有将 S3 uri 放入 packaged.yaml。相反,它将其保持为 state-machine.yaml。所以当我 运行 sam deploy 它会寻找 S3 uri 但找不到它。

那么解决方法是什么?

好吧,我发现,纯属偶然,如果你从 template.yaml 所在的目录外 运行 sam package 并且使用完整路径,它不会将 S3 uri 放在 packaged.yaml 中。因此,您必须从 template.yaml 所在的目录中 运行 sam package 并使用相对路径。