[英]Cannot put object to S3 using aws lambda running on Greengrass
[英]How to "change the object key or version in the template" for AWS Lambda or S3
我有 14 个 AWS Lambda,每个都引用已编译到 .jar 文件中的相同代码。 每当我更新 .jar 时,我不想更新每个 Lambda 并再次上传 .jar。 出于这个原因,我决定将 .jar 上传到 S3 存储桶,然后从 Lambda 中引用该代码。
这看起来不错,但我刚刚了解到将新代码上传到.jar 不会自动更新Lambda。参考文档时,它说如下:
在堆栈更新期间,不会自动检测到对 Amazon S3 中部署 package 的更改。 要更新 function 代码,请更改模板中的 object 密钥或版本。
更改“模板中的对象键或版本”是什么意思,如何完成?
我尝试过的一件事是创建一个单独的 Lambda来更新我的所有其他 Lambda,当我的 jar S3 存储桶发生更改时触发,但这似乎也不起作用:
console.log('Loading function');
var AWS = require('aws-sdk');
var lambda = new AWS.Lambda();
exports.handler = function(event, context) {
let key = event.Records[0].s3.object.key
let bucket = event.Records[0].s3.bucket.name
let version = event.Records[0].s3.object.versionId
let functionNames = [
"cs_340_tweeter_follow",
"cs_340_tweeter_get_followers",
"cs_340_tweeter_get_feed",
"cs_340_tweeter_is_follower",
"cs_340_tweeter_log_in",
"cs_340_tweeter_register",
"cs_340_tweeter_logout",
"cs_340_tweeter_get_follower_count",
"cs_340_tweeter_get_following",
"cs_340_tweeter_get_following_count",
"cs_340_tweeter_get_user",
"cs_340_tweeter_unfollow",
"cs_340_tweeter_post_status",
"cs_340_tweeter_get_story"
]
if (bucket == "cs340tweeterserverjar" && key == "server-all.jar" && version) {
for (let i = 0; i < functionNames.length; i++) {
var functionName = functionNames[i];
console.log("uploaded to lambda function: " + functionName);
var params = {
FunctionName: functionName,
S3Key: key,
S3Bucket: bucket,
S3ObjectVersion: version
};
lambda.updateFunctionCode(params, function(err, data) {
if (err) {
console.log(err, err.stack);
context.fail(err);
} else {
console.log(data);
context.succeed(data);
}
});
}
} else {
context.succeed("skipping zip " + key + " in bucket " + bucket + " with version " + version);
}
};
谢谢!
S3 中的对象可以进行版本控制。 它建议您指定不同的 object 版本,它假设:
从那里,您可以在定义 Lambda 函数的 CloudFormation 模板中使用该版本 ID 。
或者,您可以在每个版本的不同密钥下上传 JAR - app-1.0.0.jar
、 app-1.0.1.jar
等等。 然后,再次在您的 CloudFormation 模板中,引用新的 S3 路径来触发部署。
如果您的问题是在不为 X Lambdas 手动更改它的情况下将该 S3 路径或版本获取到您的 CloudFormation 模板中, 您可以使用参数。 然后,您将能够传递一次该值,并在所有 Lambda 中引用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.