gpt4 book ai didi

amazon-web-services - 为什么 AWS Lambda 函数会为单个事件多次调用?

转载 作者:行者123 更新时间:2023-12-04 05:48:20 24 4
gpt4 key购买 nike

我正在尝试创建执行以下过程的 AWS Lambda 函数。

  • 接收 S3“放置”事件
  • 从 S3 获取文件 A
  • 从调用 lambda 的 S3 获取 fileB
  • 仅启动一个 EC2 实例
  • 为新的 EC2 实例创建标签

  • 问题:多个 (5) 实例意外启动。

    成功创建了一个实例,但同时启动了 4 个其他实例。总共启动了 5 个实例。

    日志

    在此函数的日志流中,我找到了 4 个用于此调用的流。每个 Stream 都没有显示任何错误或异常,但似乎该函数是重复执行的。

    试用

    我猜是函数超时了,然后重新运行。

    然后,我改了 Timeout从 5s 到 60s 并将文件放在 S3 上。
    它以某种方式起作用。只出现了2个Log Streams,第一个显示函数只执行了一次,第二个显示函数执行了两次。已启动实例数为 3。

    但是,我不知道为什么会启动多个(3)个实例。

    欢迎任何意见!
    先感谢您 :-)

    我的 Lambda 函数

    我的 Lambda 函数如下。 (简化了隐藏凭证信息,但不会丢失其基本结构)
    var AWS = require('aws-sdk');

    function composeParams(data, config){
    var block_device_name = "/dev/xvdb";
    var security_groups = [
    "MyGroupName"
    ];
    var key_name = 'mykey';
    var security_group_ids = [
    "sg-xxxxxxx"
    ];
    var subnet_id = "subnet-xxxxxxx";

    // Configurations for a new EC2 instance
    var params = {
    ImageId: 'ami-22d27b22', /* required */
    MaxCount: 1, /* required */
    MinCount: 1, /* required */
    KeyName: key_name,
    SecurityGroupIds: security_group_ids,
    InstanceType: data.instance_type,
    BlockDeviceMappings: [
    {
    DeviceName: block_device_name,
    Ebs: {
    DeleteOnTermination: true,
    Encrypted: true,
    VolumeSize: data.volume_size,
    VolumeType: 'gp2'
    }
    }
    ],
    Monitoring: {
    Enabled: false /* required */
    },
    SubnetId: subnet_id,
    UserData: new Buffer(config).toString('base64'),
    DisableApiTermination: false,
    InstanceInitiatedShutdownBehavior: 'stop',
    DryRun: data.dry_run,
    EbsOptimized: false
    };

    return params;
    }

    exports.handler = function(event, context) {
    // Get the object from the event
    var s3 = new AWS.S3({ apiVersion: '2006-03-01' });
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;

    // Get fileA
    var paramsA = {
    Bucket: bucket,
    Key: key
    };
    s3.getObject(paramsA, function(err, data) {
    if (err) {
    console.log(err);
    } else {
    var dataA = JSON.parse(String(data.Body));

    // Get fileB
    var paramsB = {
    Bucket: bucket,
    Key: 'config/config.yml'
    };
    s3.getObject(paramsB, function(err, data) {
    if (err) {
    console.log(err, err.stack);
    } else {
    var config = data.Body;
    /* Some process */

    // Launch EC2 Instance
    var ec2 = new AWS.EC2({ region: REGION, apiVersion: '2015-04-15' });
    var params = composeParams(dataA, config);
    ec2.runInstances(params, function(err, data) {
    if (err) {
    console.log(err, err.stack);
    } else {
    console.log(data);

    // Create tags for instance
    for (var i=0; i<data.Instances.length; i++){
    var instance = data.Instances[i];
    var params = {
    Resources: [ /* required */
    instance.InstanceId
    ],
    Tags: [ /* required */
    {
    Key: 'Name',
    Value: instance_id
    },
    {
    Key: 'userID',
    Value: dataA.user_id
    }
    ],
    DryRun: dataA.dry_run
    };
    ec2.createTags(params, function(err, data) {
    if (err) {
    console.log(err, err.stack);
    } else {
    console.log("Tags created.");
    console.log(data);
    }
    });
    }
    }
    });
    }
    });
    }
    });
    };

    最佳答案

    解决了。

    添加 context.succeed(message);嵌套回调的最后一部分防止函数的重复执行。

                ec2.createTags(params, function(err, data) {
    if (err) {
    console.log(err, err.stack);
    context.fail('Failed');
    } else {
    console.log("Tags created.");
    console.log(data);
    context.succeed('Completed');
    }
    });

    关于amazon-web-services - 为什么 AWS Lambda 函数会为单个事件多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982704/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com