AWS Lambda 函数中无法 运行 ec2 方法
Can't run ec2 method in AWS Lambda Function
我正在调用以下 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 中,我可以看到函数 运行s 直到结束,但在 ec2.describeInstances 方法中没有记录任何内容:
END RequestId: xxxxxxxxxxxxxx
REPORT RequestId:xxxxxxxxxxxxxx 持续时间:xx 毫秒计费持续时间:xx 毫秒内存大小:xx MB 使用的最大内存:xx MB
我的 lambda 函数具有 VPC 访问权限和 AdministratorAccess 的 IAM 角色(完全访问权限)。由于某种原因,它不能 运行 ec2.describeInstances 方法。出了什么问题,我该如何解决?
当您将 VPC 配置添加到 Lambda 函数时,它只能访问该 VPC 中的资源。如果 Lambda 函数需要同时访问 VPC 资源和 public Internet,则 VPC 需要在 VPC 内部具有网络地址转换 (NAT) 实例。因此,要使该 EC2 实例将日志发送到云手表,它需要通过 NAT 实例连接互联网。
AWS Lambda 使用您提供的 VPC 信息来设置允许您的 Lambda 函数访问 VPC 资源的 ENI。每个 ENI 都会从您指定的子网内的 IP 地址范围内分配一个私有 IP 地址,但不会分配任何 public 个 IP 地址。因此,如果您的 Lambda 函数需要 Internet 访问(例如,访问没有 VPC 终端节点的 AWS 服务,例如 Amazon Cloudwatch),您可以在 VPC 内配置 NAT 实例,也可以使用 Amazon VPC NAT 网关。有关更多信息,请参阅 Amazon VPC 用户指南中的 NAT Gateways。您不能使用连接到 VPC 的 Internet 网关,因为这需要 ENI 具有 public IP 地址。
首先,尝试将此 role 提供给您的 Lambda
{
"Effect": "Allow",
"Resource": "*",
"Action": [
"ec2:DescribeInstances",
"ec2:CreateNetworkInterface",
"ec2:AttachNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DeleteNetworkInterface",
"ec2:DetachNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:ResetNetworkInterfaceAttribute",
"autoscaling:CompleteLifecycleAction"
]
}
如果那没有什么不同,
- 您需要创建弹性网卡。转到 'Network Interfaces' 页面 https://console.aws.amazon.com/ec2/v2/home#NIC:sort=securityGroup 和 'Create Network Interface'。 Select 适当的安全组和子网(比如 s0bn3t)。
- 现在,在您的 Lambda "Advanced Settings" 中,当您 select VPC 时,您将看到一个子网列表。现在,select 与上述 ENI 关联的子网 ('s0bn3t')。
我认为应该这样做。
我正在调用以下 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 中,我可以看到函数 运行s 直到结束,但在 ec2.describeInstances 方法中没有记录任何内容:
END RequestId: xxxxxxxxxxxxxx REPORT RequestId:xxxxxxxxxxxxxx 持续时间:xx 毫秒计费持续时间:xx 毫秒内存大小:xx MB 使用的最大内存:xx MB
我的 lambda 函数具有 VPC 访问权限和 AdministratorAccess 的 IAM 角色(完全访问权限)。由于某种原因,它不能 运行 ec2.describeInstances 方法。出了什么问题,我该如何解决?
当您将 VPC 配置添加到 Lambda 函数时,它只能访问该 VPC 中的资源。如果 Lambda 函数需要同时访问 VPC 资源和 public Internet,则 VPC 需要在 VPC 内部具有网络地址转换 (NAT) 实例。因此,要使该 EC2 实例将日志发送到云手表,它需要通过 NAT 实例连接互联网。
AWS Lambda 使用您提供的 VPC 信息来设置允许您的 Lambda 函数访问 VPC 资源的 ENI。每个 ENI 都会从您指定的子网内的 IP 地址范围内分配一个私有 IP 地址,但不会分配任何 public 个 IP 地址。因此,如果您的 Lambda 函数需要 Internet 访问(例如,访问没有 VPC 终端节点的 AWS 服务,例如 Amazon Cloudwatch),您可以在 VPC 内配置 NAT 实例,也可以使用 Amazon VPC NAT 网关。有关更多信息,请参阅 Amazon VPC 用户指南中的 NAT Gateways。您不能使用连接到 VPC 的 Internet 网关,因为这需要 ENI 具有 public IP 地址。
首先,尝试将此 role 提供给您的 Lambda
{
"Effect": "Allow",
"Resource": "*",
"Action": [
"ec2:DescribeInstances",
"ec2:CreateNetworkInterface",
"ec2:AttachNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DeleteNetworkInterface",
"ec2:DetachNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:ResetNetworkInterfaceAttribute",
"autoscaling:CompleteLifecycleAction"
]
}
如果那没有什么不同,
- 您需要创建弹性网卡。转到 'Network Interfaces' 页面 https://console.aws.amazon.com/ec2/v2/home#NIC:sort=securityGroup 和 'Create Network Interface'。 Select 适当的安全组和子网(比如 s0bn3t)。
- 现在,在您的 Lambda "Advanced Settings" 中,当您 select VPC 时,您将看到一个子网列表。现在,select 与上述 ENI 关联的子网 ('s0bn3t')。
我认为应该这样做。