无法在AWS Lambda函数中运行ec2方法

时间:2016-06-24 14:44:05

标签: node.js amazon-web-services aws-sdk aws-lambda

我正在调用以下lambda函数来描述实例信息:

'use strict'

var aws = require('aws-sdk');

exports.handler = function(event, context) {
    var instanceID = JSON.parse(event.Records[0].Sns.Message).Trigger.Dimensions[0].value;

    aws.config.region = 'us-east-1';

    var ec2 = new aws.EC2;

    var params = {InstanceIds: [instanceID]};

    ec2.describeInstances(params, function(e, data) {
        if (e)
            console.log(e, e.stack);
        else
            console.log(data);
    }
};

在CloudWatch Logs中,我可以看到该函数一直运行到最后,但不会在ec2.describeInstances方法中记录任何内容:

END RequestId:xxxxxxxxxxxxxx REPORT RequestId:xxxxxxxxxxxxxx持续时间:xx ms结算时长:xx ms内存大小:xx MB最大使用内存:xx MB

我的lambda函数具有VPC访问权限和管理员访问的IAM角色(完全访问权限)。由于某种原因,它无法运行ec2.describeInstances方法。有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:3)

将VPC配置添加到Lambda函数时,它只能访问该VPC中的资源。如果Lambda函数需要访问VPC资源和公共Internet,则VPC需要在VPC内部具有网络地址转换(NAT)实例。因此,对于将日志发送到云监视的EC2实例,它需要通过NAT实例进行Internet连接。

AWS Lambda使用您提供的VPC信息来设置允许Lambda函数访问VPC资源的ENI。每个ENI都从您指定的子网中的IP地址范围分配一个专用IP地址,但未分配任何公共IP地址。因此,如果您的Lambda函数需要Internet访问(例如,要访问不具有VPC端点的AWS服务,例如Amazon Cloudwatch),您可以在VPC内部配置NAT实例,或者您可以使用Amazon VPC NAT网关。有关更多信息,请参阅Amazon VPC用户指南中的NAT Gateways。您不能使用连接到VPC的Internet网关,因为这需要ENI具有公共IP地址。

答案 1 :(得分:2)

首先,尝试将此role提供给您的Lambda

{
        "Effect": "Allow",
        "Resource": "*",
        "Action": [
            "ec2:DescribeInstances",
            "ec2:CreateNetworkInterface",
            "ec2:AttachNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DeleteNetworkInterface",
            "ec2:DetachNetworkInterface",
            "ec2:ModifyNetworkInterfaceAttribute",
            "ec2:ResetNetworkInterfaceAttribute",
            "autoscaling:CompleteLifecycleAction"
        ]
    }

如果那不会产生影响,那么

  • 您需要创建一个ENI。转到“网络接口”'页面https://console.aws.amazon.com/ec2/v2/home#NIC:sort=securityGroup和'创建网络接口'。选择适当的安全组和子网(例如s0bn3t)。
  • 现在,在"高级设置"在您的Lambda中,当您选择VPC时,您将看到一个子网列表。现在,选择与上述ENI相关联的子网(' s0bn3t')。

我相信这应该做到。