通过 lambda 访问所有 ec2 跨区域

access all ec2 cross region via lambda

我有用于自动 Ami 备份的 lambda 功能可以跨区域执行 lambda 以自动备份我帐户上所有工作的 EC2。

跨区域的所有 ec2 执行一次 lambda 函数

    var aws = require('aws-sdk');  
aws.config.region = 'us-east-1','ap-south-1','eu-central-1';  
var ec2 = new aws.EC2();  
var now = new Date();  
date = now.toISOString().substring(0, 10)  
hours = now.getHours()  
minutes = now.getMinutes()  
exports.handler = function(event, context) {  
    var instanceparams = {
        Filters: [{
            Name: 'tag:Backup',
            Values: [
                'yes'
            ]
        }]
    }
    ec2.describeInstances(instanceparams, function(err, data) {
        if (err) console.log(err, err.stack);
        else {
            for (var i in data.Reservations) {
                for (var j in data.Reservations[i].Instances) {
                    instanceid = data.Reservations[i].Instances[j].InstanceId;
                    nametag = data.Reservations[i].Instances[j].Tags
                    for (var k in data.Reservations[i].Instances[j].Tags) {
                        if (data.Reservations[i].Instances[j].Tags[k].Key == 'Name') {
                            name = data.Reservations[i].Instances[j].Tags[k].Value;
                        }
                    }
                    console.log("Creating AMIs of the Instance: ", name);
                    var imageparams = {
                        InstanceId: instanceid,
                        Name: name + "_" + date + "_" + hours + "-" + minutes,
                        NoReboot: true
                    }
                    ec2.createImage(imageparams, function(err, data) {
                        if (err) console.log(err, err.stack);
                        else {
                            image = data.ImageId;
                            console.log(image);
                            var tagparams = {
                                Resources: [image],
                                Tags: [{
                                    Key: 'DeleteOn',
                                    Value: 'yes'
                                }]
                            };
                            ec2.createTags(tagparams, function(err, data) {
                                if (err) console.log(err, err.stack);
                                else console.log("Tags added to the created AMIs");
                            });
                        }
                    });
                }
            }
        }
    });
}

其中 aws.config.region 用于区域配置..它适用于当前(部署 lambda 的)区域

这一行:

var ec2 = new aws.EC2(); 

连接到Lambda函数所在区域的Amazon EC2服务运行。

您可以修改它以连接到另一个区域:

var ec2 = new AWS.EC2({apiVersion: '2006-03-01', region: 'us-west-2'});

因此,您的程序可以遍历区域列表(来自 ec2.describeRegions),为给定区域创建一个新的 EC2 客户端,然后 运行 您已有的代码。

参见:Setting the AWS Region - AWS SDK for JavaScript

在您的 Lambda 角色中,您需要添加一个策略,为 Lambda 函数提供访问不同账户上的 EC2 所需的权限,通常您可以添加您不想访问的 EC2 实例的 ARN,或者您可以指定“ *" 授予所有实例的权限。

另外,在 EC2 实例为 运行 的其他帐户上,您需要添加 IAM 策略以访问您的 Lambda 角色,请注意您需要提供 Lambda 角色 ARN,

这样,您的 Lambda 角色将具有访问 EC2 的策略,跨账户 EC2 将具有授予对 Lambda 角色的访问权限的策略。

如果没有这个,您可能需要在每个帐户中为每个 EC2 配置 IP。

是的,您还需要将 EC2 对象指向实例所在的区域 运行,

任何代码(包括 Lambda 函数)都可以创建连接到不同区域的客户端。