从AWS Lambda启动EC2实例时超时

时间:2016-03-05 06:40:54

标签: amazon-web-services amazon-ec2 aws-lambda

我一直在尝试启动一个新的EC2实例,并通过lambda将一段字符串数据添加到我的SQS,以响应我的s3存储桶中的对象上传事件。

我能够成功更新我的SQS,但无法初始化新的EC2实例。尽管将lambda函数的时间分配设置为5分钟的最大时间并增加内存分配,但操作超时错误会持续浮出水面。

我的代码如下。任何人都可以指出这种错误的潜在原因是什么?虽然我把我的整段代码留在这里作为参考,但有关启动的区域是在代码的末尾。

非常感谢你!

console.log('Loading function');

var fs = require('fs');
var async = require('async');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var sqs = new aws.SQS({apiVersion: '2012-11-05'});
var ecs = new aws.ECS({apiVersion: '2014-11-13'});
var ec2 = new aws.EC2({apiVersion: '2015-10-01'});

// Check if the given key suffix matches a suffix in the whitelist. Return true if it matches, false otherwise.
exports.checkS3SuffixWhitelist = function(key, whitelist) {
    if(!whitelist){ return true; }
    if(typeof whitelist == 'string'){ return key.match(whitelist + '$') }
    if(Object.prototype.toString.call(whitelist) === '[object Array]') {
        for(var i = 0; i < whitelist.length; i++) {
            if(key.match(whitelist[i] + '$')) { return true; }
        }
        return false;
    }
    console.log(
        'Unsupported whitelist type (' + Object.prototype.toString.call(whitelist) +
        ') for: ' + JSON.stringify(whitelist)
    );
    return false;
};


exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('Received event:');

    //Read in the configuration file
    var config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
    if(!config.hasOwnProperty('s3_key_suffix_whitelist')) {
        config.s3_key_suffix_whitelist = false;
    }
    console.log('Config: ' + JSON.stringify(config));

    var name = event.Records[0].s3.object.key;
    if(!exports.checkS3SuffixWhitelist(name, config.s3_key_suffix_whitelist)) {
        context.fail('Suffix for key: ' + name + ' is not in the whitelist')
    }


    // Get the object from the event and show its key
    var bucket = event.Records[0].s3.bucket.name;
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    var params = {
        Bucket: bucket,
        Key: key
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting object " + key + " from bucket " + bucket +
                ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);
            context.fail(message);
        } else {
            console.log('CONTENT TYPE:', key);
            context.succeed(key);
        }
    });


    //Sending the image key as a message to SQS and starting a new instance on EC2
    async.waterfall([
        function(next){
            var params = {
                MessageBody: JSON.stringify(event),
                QueueUrl: config.queue
            };
            console.log("IN QUEUE FUNCTION");
            sqs.sendMessage(params, function (err, data) {
                    if (err) { console.warn('Error while sending message: ' + err); }
                    else { console.info('Message sent, ID: ' + data.MessageId); }
                    next(err);
            });
        }, 
        function (next) {

            console.log("INITIALIZING ECS");
            var params = {
                ImageId: 'ami-e559b485',
                MinCount: 1,
                MaxCount: 1,
                DryRun: true,
                InstanceType: 't2.micro',
                KeyName: 'malpem2102',
                SubnetId: 'subnet-e8607e8d'

            }

            ec2.runInstances(params, function(err,data){
                if(err){
                    console.log(err, err.stack);
                    context.fail('Error', "Error getting file: " + err);
                    return;
                } else{
                    var instanceId = data.Instances[0].InstanceId;
                    console.log("Created instance ", instanceId);
                    context.suceed("Created instance");
                }
            });
        }
    ], function(err){
        if (err) {
                context.fail('An error has occurred: ' + err);
            }
            else {
                context.succeed('Successfully processed Amazon S3 URL.');
            }
        }
    );

};

0 个答案:

没有答案