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:DescribeNetworkInterfacesec2:CreateNetworkInterfaceec2: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 无权担任提供的角色

AWS lambda 使用启动模板和 boto3 创建 ec2 实例,仅使用所需的权限

aws ffmpeg+ lambda来完成视频stream的截图 python docker 版