AWS Lambda:The 提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces
AWS Lambda:The provided execution role does not have permissions to call DescribeNetworkInterfaces on EC2
今天我有一个新的 AWS Lambda 问题,在 Google 中找不到任何地方。
我新建了一个Lambda函数,没有问题。
但是当我在此函数中输入任何代码时[例如。 console.log();]点击"Save",出现错误:
"The provided execution role does not have permissions to call DescribeNetworkInterfaces on EC2"
exports.handler = (event, context, callback) => {
callback(null, 'Hello from Lambda');
console.log(); // here is my code
};
我将函数绑定到角色:lambda_excute_execution(Policy:AmazonElasticTranscoderFullAccess)
而且这个函数现在不绑定任何触发器
然后,我给角色"AdministratorAccess"策略,我可以正确保存我的源代码。
此角色可以 运行 在今天之前成功运作。
有人知道这个错误吗?
非常感谢!
这绝对是一个奇怪的错误,但您确定您添加的示例代码是您在 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:DescribeNetworkInterfaces
、ec2:CreateNetworkInterface
和 ec2:DeleteNetworkInterface
(请参阅 AWS Forum).
例如,这是一个允许将 Lambda 部署到 VPC 中的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:AttachNetworkInterface"
],
"Resource": "*"
}
]
}
这实际上是一个很常见的问题。
您可以通过在“权限”选项卡下向 Lambda 执行角色添加自定义内联策略来解决此问题。
只需添加:
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:AttachNetworkInterface"
],
"Resource": "*"
}
]
}
如果您需要更多信息或感到困惑,这里有带图片的完整教程:https://ao.ms/the-provided-execution-role-does-not-have-permissions-to-call-createnetworkinterface-on-ec2/
此外,最近的一系列步骤如下:
在您的 Lambda 函数下,select“配置”
Select“权限”
Select执行角色:
Select“添加权限”
创建内联策略
Select "JSON"
粘贴上面的JSON和select评论。
通过托管策略
- 授予 Lambda 必要的权限以深入到生产 RDS 数据库驻留在私有子网中的 VPC。
- 正如上面@portatlas 所提到的,
AWSLambdaVPCAccessExecutionRole
托管策略非常合身(我们都知道使用 IAM 托管策略是 AWS-recommended best-practice)。
- 这适用于已附加服务角色的 Lambda。
AWS CLI
1。获取 Lambda 服务角色
- 向 Lambda API 询问函数配置,从中查询角色,输出到未引用 return 的文本。
aws lambda get-function-configuration \
--function-name <<your function name or ARN here>> \
--query Role \
--output text
- return,走
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
CDK 2 打字稿
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,
});
如果您使用的是 terraform,只需添加:
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
,select 附加到 Lambda 函数的角色并赋予它 EC2FullAccess
权限。
这将允许您通过授予 EC2 控制访问权限来更新 Lambda VPC。 一定要取消角色的权限,函数仍然运行。
它比永久保留某些权限更安全还是更不安全?值得商榷。
似乎已经用许多不同的方式回答了这个问题,但截至本文发布时,AWS 有一个托管策略。如果您只搜索 AWSLambdaVPCAccessExecutionRole,您将能够附加它,这个方法对我有用。
这是 arn:
arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
Cloudformation 和 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
只需转到执行角色 -> 附加策略 -> 搜索 'AWSLambdaVPCAccessExecutionRole' 并添加它。
今天我有一个新的 AWS Lambda 问题,在 Google 中找不到任何地方。
我新建了一个Lambda函数,没有问题。 但是当我在此函数中输入任何代码时[例如。 console.log();]点击"Save",出现错误: "The provided execution role does not have permissions to call DescribeNetworkInterfaces on EC2"
exports.handler = (event, context, callback) => {
callback(null, 'Hello from Lambda');
console.log(); // here is my code
};
我将函数绑定到角色:lambda_excute_execution(Policy:AmazonElasticTranscoderFullAccess) 而且这个函数现在不绑定任何触发器
然后,我给角色"AdministratorAccess"策略,我可以正确保存我的源代码。
此角色可以 运行 在今天之前成功运作。
有人知道这个错误吗?
非常感谢!
这绝对是一个奇怪的错误,但您确定您添加的示例代码是您在 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:DescribeNetworkInterfaces
、ec2:CreateNetworkInterface
和 ec2:DeleteNetworkInterface
(请参阅 AWS Forum).
例如,这是一个允许将 Lambda 部署到 VPC 中的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:AttachNetworkInterface"
],
"Resource": "*"
}
]
}
这实际上是一个很常见的问题。
您可以通过在“权限”选项卡下向 Lambda 执行角色添加自定义内联策略来解决此问题。
只需添加:
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeInstances",
"ec2:AttachNetworkInterface"
],
"Resource": "*"
}
]
}
如果您需要更多信息或感到困惑,这里有带图片的完整教程:https://ao.ms/the-provided-execution-role-does-not-have-permissions-to-call-createnetworkinterface-on-ec2/
此外,最近的一系列步骤如下:
在您的 Lambda 函数下,select“配置”
Select“权限”
Select执行角色:
Select“添加权限”
创建内联策略
Select "JSON"
粘贴上面的JSON和select评论。
通过托管策略
- 授予 Lambda 必要的权限以深入到生产 RDS 数据库驻留在私有子网中的 VPC。
- 正如上面@portatlas 所提到的,
AWSLambdaVPCAccessExecutionRole
托管策略非常合身(我们都知道使用 IAM 托管策略是 AWS-recommended best-practice)。 - 这适用于已附加服务角色的 Lambda。
AWS CLI
1。获取 Lambda 服务角色
- 向 Lambda API 询问函数配置,从中查询角色,输出到未引用 return 的文本。
aws lambda get-function-configuration \ --function-name <<your function name or ARN here>> \ --query Role \ --output text
- return,走
your-service-role-name
到#2your-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
CDK 2 打字稿
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,
});
如果您使用的是 terraform,只需添加:
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
,select 附加到 Lambda 函数的角色并赋予它 EC2FullAccess
权限。
这将允许您通过授予 EC2 控制访问权限来更新 Lambda VPC。 一定要取消角色的权限,函数仍然运行。
它比永久保留某些权限更安全还是更不安全?值得商榷。
似乎已经用许多不同的方式回答了这个问题,但截至本文发布时,AWS 有一个托管策略。如果您只搜索 AWSLambdaVPCAccessExecutionRole,您将能够附加它,这个方法对我有用。
这是 arn:
arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
Cloudformation 和 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
只需转到执行角色 -> 附加策略 -> 搜索 'AWSLambdaVPCAccessExecutionRole' 并添加它。