【问题标题】:How to fix 'WaiterUnrecoverableException' when using the Jenkins SAM plugin to build a serverless app使用 Jenkins SAM 插件构建无服务器应用程序时如何修复“WaiterUnrecoverableException”
【发布时间】:2019-09-13 03:42:33
【问题描述】:

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

错误:构建步骤失败并出现异常 com.amazonaws.waiters.WaiterUnrecoverableException:资源从未进入 失败时的期望状态。

堆栈在 AWS 中创建并保留在 REVIEW_IN_PROGRESS 中。我假设“服务员”正在等待堆栈进入另一个状态。我找到了this,但这并没有太大帮助。

通过 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模板输出之外,一切正常。因此,当它运行“sam deploy”时,它会查看输出模板并期望 S3 uri。然后它失败并使堆栈处于 REVIEW_IN_PROGRESS 状态。

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

模板.yaml

打包的.yaml

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

【问题讨论】:

    标签: jenkins .net-core jenkins-plugins aws-sam


    【解决方案1】:

    我想通了。所以 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 插入我命名为 的生成的 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 并使用相对路径。

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      相关资源
      最近更新 更多