AWS Lambda: 提供的执行角色没有在 EC2上调用 DescribeNetworkInterfaces 的权限

今天我有一个新的 AWS Lambda 问题,在谷歌找不到任何地方。

我新建了一个 Lambda 函数,这是毫无疑问的。 但是当我在这个函数中输入任何代码并单击“ Save”时,就会出现错误: ”提供的执行角色没有在 EC2上调用 DescribeNetworkInterfaces 的权限

exports.handler = (event, context, callback) => {
callback(null, 'Hello from Lambda');
console.log();  // here is my code
};

我将函数绑定到 Role: lambda _ exute _ execute (策略: AmazonElasticTranscoderFullAccess) 此函数现在没有与任何触发器绑定。

然后,我给角色“管理员访问”策略,我可以正确地保存我的源代码。

此角色在今天之前可以成功运行函数。

有人知道这个错误吗?

非常感谢!

127159 次浏览

这绝对是一个奇怪的错误,但是您确定您添加的示例代码是在您的 lambda 中使用的代码吗?

因为在您的代码中,您试图在通过回调返回控制之后在您的 lambda 中记录一些内容。换句话说,首先你告诉你的 Lambda 你不干了。接下来,当它忙于关闭并返回结果时,您尝试执行一些日志记录..。

所以首先,我会试试这个:

exports.handler = (event, context, callback) => {
console.log('this is a test');
// do stuff
callback(null, 'Hello from Lambda'); // only do a callback *after* you've run all your code
};

看看能不能解决问题。

如果您尝试在 VPC 中部署 Lambda 而不给它所需的与网络接口相关的权限 ec2:DescribeNetworkInterfacesec2:CreateNetworkInterfaceec2:DeleteNetworkInterface(请参阅 AWS 论坛) ,则此错误很常见。

例如,这个策略允许将 Lambda 部署到 VPC 中:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:AttachNetworkInterface"
],
"Resource": "*"
}
]
}

这其实是一个很普遍的问题。

您可以通过将自定义内联策略添加到 Permission 选项卡下的 Lambda 执行角色来解决这个问题。

再加上这个:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:AttachNetworkInterface"
],
"Resource": "*"
}
]
}

有一个完整的教程与图片在这里,如果你需要更多的信息(Terraform、 CloudForment 和 AWS 控制台)或混淆: https://ao.ms/the-provided-execution-role-does-not-have-permissions-to-call-createnetworkinterface-on-ec2/

此外,最近采取的一系列步骤如下:

  1. 在 Lambda 函数下,选择“ Configuration” Lambda Configuration

  2. 选择“权限” Permissions

  3. 选择执行角色: Role Selection

  4. 选择“添加权限” Add Permissions

  5. 创建内联策略 Inline Policy

  6. 选择“ JSON” JSON

  7. 粘贴上面的 JSON 并选择 Review。

通过管理政策

  • 授予 Lambda 必要的权限,以便深入到生产 RDS db 驻留在私有子网中的 VPC。
  • 正如上面@portatlas 提到的,AWSLambdaVPCAccessExecutionRole管理策略非常适合(我们都知道使用 IAM 管理策略是 AWS 推荐的最佳实践)。
  • 这是为了 Lambdas,因为它已经扮演了一个服务角色。

AWS CLI

1. 获得 Lambda 服务角色

  • 请求 Lambda API 进行函数配置,从中查询角色,输出为文本以获得未引号的返回值。
    aws lambda get-function-configuration \
    --function-name <<your function name or ARN here>> \
    --query Role \
    --output text
    
  • 返回,采取 your-service-role-name到 # 2
    your-service-role-name
    

2. 将托管策略 AWSLambdaVPCAccessExecutionRole附加到服务角色

aws iam attach-role-policy \
--role-name your-service-role-name \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole

CDK2字体脚本

const lambdaVPCExecutionRole:iam.Role = new iam.Role(this, `createLambdaVPCExecutionRole`, {
roleName        : `lambdaVPCExecutionRole`,
assumedBy       : new iam.ServicePrincipal(`lambda.amazonaws.com`),
description     : `Lambda service role to operate within a VPC`,
managedPolicies : [
iam.ManagedPolicy.fromAwsManagedPolicyName(`service-role/AWSLambdaVPCAccessExecutionRole`),
],
});


const lambdaFunction:lambda.Function = new lambda.Function(this, `createLambdaFunction`, {
runtime : lambda.Runtime.NODEJS_14_X,
handler : `lambda.handler`,
code    : lambda.AssetCode.fromAsset(`./src`),
vpc     : vpc,
role    : lambdaVPCExecutionRole,
});

如果您使用的是地形,只需添加:

resource "aws_iam_role_policy_attachment" "AWSLambdaVPCAccessExecutionRole" {
role       = aws_iam_role.lambda.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
}

下面是解决这个错误的 又快又脏方法。

在 AWS 控制台上打开 IAM,选择附加到 Lambda 函数的角色,并给它 EC2FullAccess权限。

这将允许您通过授予 EC2控制访问权来更新 Lambda VPC

它是否比永久附加一些权限更安全。

似乎已经有很多不同的方式回答了这个问题,但是在这篇文章中,AWS 有一个管理策略。如果你只是搜索的 执行角色你将能够附加,这种方法为我工作。

这就是问题所在:

arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole

Cloudform 和 AWS SAM 用户的示例。

这个示例 lambda 角色定义添加了托管 AWSLambdaVPCAccessExecutionRole并解决了这个问题:

Type: "AWS::IAM::Role"
Properties:
RoleName: "lambda-with-vpc-access"
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- sts:AssumeRole
Principal:
Service:
- lambda.amazonaws.com

只需转到 Execution role-> Attach policy-> 搜索“ AWSLambdaVPCAccessExectionrole”并添加它。

仅仅因为没有足够的答案;)我认为这是最简单的方法。如果你正在使用网页管理控制台,当你创建你的 Lambda 函数放在首位,在底部只是展开“高级设置”,选择“启用 VPC”和选择你的 VPC... 简单!在这样做之前,我与 RDS 代理的连接超时了。这样做之后(没有别的)-工程伟大! Image of VPC setup for new Lambda function