使用 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
并使用相对路径。
我有一个非常简单的 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
并使用相对路径。