Lambda 未触发 运行 的代码构建?
Lambda not triggering codebuild to run?
我试图让 lambda 在到达 lambda 函数内的点时触发代码构建函数,这是我当前用于 lamda 的代码:
console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3();
exports.handler = async (event, context) => {
const codebuild = new aws.CodeBuild();
let body = JSON.parse(event.body);
let key = body.model;
var getParams = {
Bucket: 'bucketname', // your bucket name,
Key: key + '/config/training_parameters.json' // path to the object you're looking for
}
if (key) {
const objects = await s3.listObjects({
Bucket: 'bucketname',
Prefix: key + "/data"
}).promise();
console.log(objects)
if (objects.Contents.length == 3) {
console.log("Pushing")
await s3.getObject(getParams, function(err, data) {
if (err)
console.log(err);
if (data) {
let objectData = JSON.parse(data.Body.toString('utf-8'));
const build = {
projectName: "projname",
environmentVariablesOverride: [
{
name: 'MODEL_NAME',
value: objectData.title,
type: 'PLAINTEXT',
},
]
};
console.log(objectData.title)
codebuild.startBuild(build,function(err, data){
if (err) {
console.log(err, err.stack);
}
else {
console.log(data);
}
});
console.log("Done with codebuild")
}
}).promise();
const message = {
'message': 'Execution started successfully!',
}
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': JSON.stringify(message)
};
}
}
};
具体这部分应该触发它:
codebuild.startBuild(build,function(err, data){
if (err) {
console.log(err, err.stack);
}
else {
console.log(data);
}
});
但不是,函数后还输出?我认为它与 promises/await/async 有关但找不到正确的解决方案?任何帮助将不胜感激。
正如您所指出的,问题与承诺有关。像这样更改您的代码:
const result = await codebuild.startBuild(build).promise();
如果您为 CodeBuild 配置了 lambda 权限,它应该可以工作。
您可以在没有回调函数的情况下以相同的方式更改您的s3.getObject:
const file = await s3.getObject(getParams).promise();
console.log(file.Body);
我试图让 lambda 在到达 lambda 函数内的点时触发代码构建函数,这是我当前用于 lamda 的代码:
console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3();
exports.handler = async (event, context) => {
const codebuild = new aws.CodeBuild();
let body = JSON.parse(event.body);
let key = body.model;
var getParams = {
Bucket: 'bucketname', // your bucket name,
Key: key + '/config/training_parameters.json' // path to the object you're looking for
}
if (key) {
const objects = await s3.listObjects({
Bucket: 'bucketname',
Prefix: key + "/data"
}).promise();
console.log(objects)
if (objects.Contents.length == 3) {
console.log("Pushing")
await s3.getObject(getParams, function(err, data) {
if (err)
console.log(err);
if (data) {
let objectData = JSON.parse(data.Body.toString('utf-8'));
const build = {
projectName: "projname",
environmentVariablesOverride: [
{
name: 'MODEL_NAME',
value: objectData.title,
type: 'PLAINTEXT',
},
]
};
console.log(objectData.title)
codebuild.startBuild(build,function(err, data){
if (err) {
console.log(err, err.stack);
}
else {
console.log(data);
}
});
console.log("Done with codebuild")
}
}).promise();
const message = {
'message': 'Execution started successfully!',
}
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': JSON.stringify(message)
};
}
}
};
具体这部分应该触发它:
codebuild.startBuild(build,function(err, data){
if (err) {
console.log(err, err.stack);
}
else {
console.log(data);
}
});
但不是,函数后还输出?我认为它与 promises/await/async 有关但找不到正确的解决方案?任何帮助将不胜感激。
正如您所指出的,问题与承诺有关。像这样更改您的代码:
const result = await codebuild.startBuild(build).promise();
如果您为 CodeBuild 配置了 lambda 权限,它应该可以工作。
您可以在没有回调函数的情况下以相同的方式更改您的s3.getObject:
const file = await s3.getObject(getParams).promise();
console.log(file.Body);