繁体   English   中英

如何为 AWS Lambda 或 S3“更改模板中的 object 密钥或版本”

[英]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 版本,它假设:

  • 您的 S3 存储桶启用了版本控制。
  • 您已经覆盖了 JAR 文件,该文件应该会为您提供一个新的版本 ID。

从那里,您可以在定义 Lambda 函数的 CloudFormation 模板中使用该版本 ID

或者,您可以在每个版本的不同密钥下上传 JAR - app-1.0.0.jarapp-1.0.1.jar等等。 然后,再次在您的 CloudFormation 模板中,引用新的 S3 路径来触发部署。

如果您的问题是在不为 X Lambdas 手动更改它的情况下将该 S3 路径或版本获取到您的 CloudFormation 模板中, 您可以使用参数 然后,您将能够传递一次该值,并在所有 Lambda 中引用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM