【问题标题】:Permission error when using Boto3, but works via aws cli使用 Boto3 时出现权限错误,但通过 aws cli 工作
【发布时间】:2019-12-03 05:29:58
【问题描述】:

我在尝试创建 Lambda 函数时遇到了权限缺失问题。

我配置的执行角色有以下权限:

$ aws --output=text iam get-role-policy --policy-name=MyRolePolicy --role-name=my-role
<snip>
POLICYDOCUMENT  2012-10-17
STATEMENT   Allow
ACTION  s3:Get*
ACTION  s3:List*
ACTION  logs:CreateLogGroup
ACTION  logs:CreateLogStream
ACTION  logs:PutLogEvents
ACTION  ec2:DescribeNetworkInterfaces
ACTION  ec2:CreateNetworkInterface
ACTION  ec2:DeleteNetworkInterface

当我使用该角色创建 Lambda 函数时,创建成功:

$ aws lambda create-function \
  --function-name=my-test --runtime=java8 \
  --role='arn:aws:iam::1234567890:role/my-role' \
  --handler=MyHandler \
  --code=S3Bucket=my-bucket,S3Key=app.zip
<result successful>

但是,当我使用相同的参数(尤其是相同的执行角色)创建函数时,我收到以下错误:

Boto3 用法

client.create_function(
  FunctionName=function_name,
  Runtime='java8',
  Role=getenv('execution_role_arn'),
  Handler='MyHandler',
  Code={
    "S3Bucket": bucket,
    "S3Key": artifact_name
  },
  Publish=True,
  VpcConfig={
    'SubnetIds': getenv('vpc_subnet_ids').split(','),
    'SecurityGroupIds': getenv('vpc_security_group_ids').split(',')
  }
)

Boto3 结果

{
   'Error':{
      'Message':'The provided execution role does not have permissions to call CreateNetworkInterface on EC2',
      'Code':'InvalidParameterValueException'
   },
   'ResponseMetadata':{
      'RequestId':'47b6640a-f3fe-4550-8ac3-38cfb2842461',
      'HTTPStatusCode':400,
      'HTTPHeaders':{
         'date':'Wed, 24 Jul 2019 10:55:44 GMT',
         'content-type':'application/json',
         'content-length':'119',
         'connection':'keep-alive',
         'x-amzn-requestid':'47b6640a-f3fe-4550-8ac3-38cfb2842461',
         'x-amzn-errortype':'InvalidParameterValueException'
      },
      'RetryAttempts':0
   }
}

通过控制台创建具有此执行角色的函数也可以,因此我在使用 Boto3 的过程中一定遗漏了一些东西,但我无法解释。

希望有人能在这里发现对 Boto3 的误用,因为我不知所措!

【问题讨论】:

    标签: amazon-web-services aws-lambda boto3 aws-cli


    【解决方案1】:

    您的 boto3 代码指定了一个 VPC:

      VpcConfig={
        'SubnetIds': getenv('vpc_subnet_ids').split(','),
        'SecurityGroupIds': getenv('vpc_security_group_ids').split(',')
    

    但是,CLI 版本没有指定 VPC。

    因此,这两个请求相同。这就是为什么一个有效而另一个无效的原因。

    来自Configuring a Lambda Function to Access Resources in an Amazon VPC - AWS Lambda

    要连接到 VPC,您的函数的执行角色必须具有以下权限。

    • ec2:CreateNetworkInterface
    • ec2:DescribeNetworkInterfaces
    • ec2:删除网络接口

    这些权限包含在AWSLambdaVPCAccessExecutionRole 托管策略中。

    【讨论】:

    • 感谢您的帮助!我更改了角色定义以使用您提到的托管策略。我已经定义了与托管策略相同的操作(包括上面提到的 3 个 ec2 权限),但它仅在我通过托管策略将它们附加到角色时才有效。虽然我不清楚为什么我的角色没有工作,但我可以接受这个作为解决方案。
    【解决方案2】:

    lambda 具有允许ec2:CreateNetworkInterface 而不是帐户执行脚本的角色。

    分配给 lambda 函数的当前角色允许 lambda 创建VpcConfig

    检查运行脚本以配置 lambda 的帐户是否允许 ec2:CreateNetworkInterface 操作。

    【讨论】:

    • 感谢您的建议!它与用于运行 python 脚本以及调用“aws lambda create-function”的帐户相同,并且是一个管理员帐户(即“Actions *”)。此外,错误消息非常清楚:“提供的执行角色没有调用 CreateNetworkInterface 的权限”——这清楚地表明问题出在提供的执行角色上,而不是调用帐户。
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 2020-12-11
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多