node.js - AWS CodePipeline 将错误的 JobId 传递给 Lambda(nodejs)
问题描述
我有一个包含 4 个阶段的管道,源、构建、部署,然后是 Lambda 阶段。在 lambda 阶段,我运行一个函数来在 s3 中移动一些文件。
s3 函数有效,我可以看到 s3 文件已被移动,但 Lambda 阶段从未成功它总是超时。经过一番挖掘,我认为这是因为 CodePipeline 将错误的 JobId 传递给 Lambda,因为如果我记录传入事件,我可以看到 id 值与管道历史选项卡中运行的 id 不同。
该函数设置为同时运行putJobSuccessResult()
和putJobFailureResult()
,它们可以工作,因为如果我从管道的历史选项卡中复制 id 并将其放入 Lambda 中的测试事件并运行测试,那么管道会成功而不是超时。
我已经搜索了几个小时的答案,但我似乎找不到任何解决方案,甚至找不到任何有同样问题的人。作为一个整体,我对 AWS 相当陌生,所以也许我遗漏了一些东西。
任何帮助将不胜感激,谢谢。
更新:
我正在使用以下内容来获取jobid:
var jobId = event["CodePipeline.job"].id;
解决方案
你能发布lambda代码吗?
当对管道的成功/失败请求未完成时,可能会发生此类问题。例如,当 lambda 在调用完成之前退出时。
检查您的异步执行,例如,如果您的 lambda 处理程序是一个函数,请使用关键字
async
调用管道 API 。await
发生异常时捕获错误并将管道设置为失败。
例子:
const AWS = require('aws-sdk')
const codepipeline = new AWS.CodePipeline({apiVersion: '2015-07-09'})
exports.handler = async function(event, context) {
const jobId = event["CodePipeline.job"].id
try {
...
const params = {
jobId
}
await codepipeline.putJobSuccessResult(params).promise()
}
catch (err) {
const params = {
jobId,
failureDetails: {
message: err.toString(),
type: 'JobFailed',
externalExecutionId: context.invokeid
}
}
await codepipeline.putJobFailureResult(params).promise()
}
}
推荐阅读
- c++ - C++ - 为什么我的程序在再次调用函数后关闭?
- javascript - 在张量流中为张量层解包位时性能缓慢
- node.js - sqllite3安装在节点和macos上给出错误
- filter - BigCommerce Stencil 如何嵌套 {{filter}} Handlebars Helper?
- asp.net-mvc - 使用字符串调用实体框架中的表
- javascript - 追加和清空大型列表时的性能
- react-native - React Native - 全局 BackHandler 行为取决于注册时间
- docker - 为什么 ENTRYPOINT [“bash”] 时 docker 容器退出?
- r - PCA 加载情节组织?
- sql-server-2016 - Dapper 动态参数