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: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": "*"
    }
  ]
}

这实际上是一个很常见的问题。

您可以通过在“权限”选项卡下向 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/

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

  1. 在您的 Lambda 函数下,select“配置”

  2. Select“权限”

  3. Select执行角色:

  4. Select“添加权限”

  5. 创建内联策略

  6. Select "JSON"

  7. 粘贴上面的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' 并添加它。