我正在调用以下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方法。有什么问题,我该如何解决?
答案 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"
]
}
如果那不会产生影响,那么
我相信这应该做到。