AWS Lambda:提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces
Posted
技术标签:
【中文标题】AWS Lambda:提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces【英文标题】:AWS Lambda:The provided execution role does not have permissions to call DescribeNetworkInterfaces on EC2 【发布时间】:2017-05-01 20:53:49 【问题描述】:今天我有一个新的 AWS Lambda 问题,在 Google 的任何地方都找不到。
我新建了一个 Lambda 函数,毫无疑问。 但是当我在这个函数中输入任何代码时[例如。 console.log();] 并点击“保存”,出现错误: “提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces”
exports.handler = (event, context, callback) =>
callback(null, 'Hello from Lambda');
console.log(); // here is my code
;
我将函数与角色绑定:lambda_excute_execution(Policy:AmazonElasticTranscoderFullAccess) 而且这个函数现在没有绑定任何触发器。
然后,我给角色“AdministratorAccess”策略,我可以正确保存我的源代码。
此角色可以在今天之前成功运行 Functions。
有人知道这个错误吗?
非常感谢!
【问题讨论】:
【参考方案1】:通过托管策略
授予 Lambda 挖掘 VPC 所需的权限,其中生产 RDS 数据库位于私有子网中。 正如上面@portatlas 所述,AWSLambdaVPCAccessExecutionRole
托管策略非常合适(我们都知道使用 IAM 托管策略是 AWS 推荐的最佳实践)。
这适用于已附加服务角色的 Lambda。
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
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,
);
【讨论】:
“我们都知道使用 IAM 托管策略是 AWS 推荐的最佳实践” - 用于 lambda 执行的非 VPC 托管策略,用于授予对 S3 中所有对象的完全读写访问权限。不先查看这些政策,请不要使用它们。【参考方案2】:只需转到执行角色 -> 附加策略 -> 搜索“AWSLambdaVPCAccessExecutionRole”并添加它。
【讨论】:
这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review 这与其他建议您附上AWSLambdaVPCAccessExecutionRole
的答案有何不同?【参考方案3】:
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
【讨论】:
【参考方案4】:似乎已经以许多不同的方式回答了这个问题,但截至本文发布时,AWS 有一个托管策略。如果您只是搜索 AWSLambdaVPCAccessExecutionRole,您将能够附加它,并且此方法对我有用。
这是arn:
arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
【讨论】:
【参考方案5】:这其实是个很常见的问题。
您可以通过在“权限”选项卡下向 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/
【讨论】:
"Resource": "*"
不是很好。我们可以使用更窄的东西吗?【参考方案6】:
这是解决错误的快速而肮脏的方法。
在 AWS 控制台上打开 IAM
,选择附加到 Lambda 函数的角色并为其授予 EC2FullAccess
权限。
这将允许您通过授予 EC2 控制访问权限来更新 Lambda VPC。 一定要从角色中删除权限,该功能仍然运行。
与永久附加某些权限相比,它更安全还是更安全?值得商榷。
【讨论】:
【参考方案7】:如果您使用的是 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-sam
做到这一点吗?【参考方案8】:
如果您尝试在 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": "*"
]
【讨论】:
要添加到上述评论,如果您的 LambdaExecutionRole 现在附加了 AWSLambdaVPCAccessExecutionRole 策略,也会弹出相同的错误。 你能比Resource: *
更具体吗?【参考方案9】:
这绝对是一个奇怪的错误,但您确定您添加的示例代码是您在 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
;
看看这是否能解决问题。
【讨论】:
谢谢!现在好了。似乎有一些 Lambda 错误。我什么也没做,但两天后就好了。以上是关于AWS Lambda:提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces的主要内容,如果未能解决你的问题,请参考以下文章
AWS IAM 执行角色无权在 EC2 上为特定 VPC 调用 CreateNetworkInterface
无法修复“提供的执行角色无权在 EC2 上调用 CreateNetworkInterface”
在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问
principal states.amazonaws.com 无权担任提供的角色