簡體   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