AWS Lambda:提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces

fis*_*eep 70 policy role amazon-web-services amazon-iam aws-lambda

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

我新建了一个 Lambda 函数,毫无疑问。但是当我在这个函数中输入任何代码时[例如。console.log();] 并单击“保存”,出现错误:“提供的执行角色无权调用 EC2 上的 DescribeNetworkInterfaces”

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

我将函数与 Role 绑定: lambda_excute_execution(Policy:AmazonElasticTranscoderFullAccess) 并且此函数现在未与任何触发器绑定。

然后,我给角色“AdministratorAccess”策略,我可以正确保存我的源代码。

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

有人知道这个错误吗?

非常感谢!

Phi*_*ßen 142

如果您尝试部署在VPC拉姆达没有给它所需的网络接口相关的权限此错误是常见的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": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 要添加到上述注释中,如果您的 LambdaExecutionRole 现在附加了 AWSLambdaVPCAccessExecutionRole 策略,也会弹出相同的错误。 (52认同)
  • 为了澄清这个答案:如果您最初在没有 VPC 的情况下部署 lambda,并且现在您尝试将 lambda 添加到 VPC,则可能会发生此错误。显然,在这种情况下,AWS 不包含这些权限,大概是基于“最小权限”的原则。 (16认同)
  • 您能比“资源:*”更具体吗? (14认同)

And*_*aal 47

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

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

只需添加以下内容:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeNetworkInterfaces",
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:DescribeInstances",
        "ec2:AttachNetworkInterface"
      ],
      "Resource": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息( Terraform、CloudFormation 和 AWS 控制台)或感到困惑,这里有一个带图片的完整教程: https ://ataiva.com/the-provided-execution-role-does-not-have-permissions-to -call-createnetworkinterface-on-ec2/

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

  1. 在 Lambda 函数下,选择“配置” 拉姆达配置

  2. 选择“权限” 权限

  3. 选择执行角色: 角色选择

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

  5. 创建内联策略 内嵌策略

  6. 选择“JSON” JSON

  7. 粘贴上面的 JSON 并选择“查看”。

  • `"Resource": "*"` 不太好。我们可以使用更窄的东西吗? (7认同)

Sté*_*ert 40

如果您使用 terraform,只需添加:

resource "aws_iam_role_policy_attachment" "AWSLambdaVPCAccessExecutionRole" {
    role       = aws_iam_role.lambda.name
    policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
}
Run Code Online (Sandbox Code Playgroud)


Cul*_*n D 22

似乎已经有很多不同的方式回答了这个问题,但截至本文发布时,AWS 已经有了托管策略。如果您只搜索AWSLambdaVPCAccessExecutionRole,您将能够附加它,并且此方法对我有用。

这是阿恩:

arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
Run Code Online (Sandbox Code Playgroud)


fus*_*n27 14

通过 AWS CLI 使用托管策略

  • 授予 Lambda 必要的权限以挖掘生产 RDS 数据库驻留在私有子网中的 VPC。
  • 正如上面@portatlas 所提到的,AWSLambdaVPCAccessExecutionRole托管策略非常适合(我们都知道使用 IAM 托管策略是 AWS 推荐的最佳实践)。
  • 这适用于已附加服务角色的 Lambda。

1. 获取 Lambda 服务角色

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

aws iam attach-role-policy \
    --role-name your-service-role-name \
    --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
Run Code Online (Sandbox Code Playgroud)

  • “我们都知道使用 IAM 托管策略是 AWS 推荐的最佳实践” - 用于 lambda 执行的非 VPC 托管策略,用于授予对 S3 中所有对象的完全读写访问权限。在未先查看这些政策的情况下,请勿使用它们。 (2认同)

小智 12

只需转到执行角色 -> 附加策略 -> 搜索“AWSLambdaVPCAccessExecutionRole”并添加它。


Jan*_*ola 10

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
Run Code Online (Sandbox Code Playgroud)