写入S3时AWS Glue Job获得访问被拒绝

时间:2019-06-28 19:14:40

标签: amazon-web-services amazon-s3 aws-glue

我有一个由CloudFormation创建的Glue ETL作业。该作业从RDS Aurora中提取数据并写入S3。

运行此作业时,出现以下错误。

该作业具有IAM服务角色。

此服务角色允许

  1. 胶水和RDS服务
  2. 假设arn:aws:iam :: aws:policy / AmazonS3FullAccess和arn:aws:iam :: aws:policy / service-role / AWSGlueServiceRole和
  3. 具有rds:*,kms:*和s3:*动作的全部范围,可用于相应的RDS,KMS和S3资源。

无论S3存储桶是使用AES256还是aws:kms加密的,我都有同样的错误。

无论作业是否具有安全配置,我都会遇到相同的错误。

我从事的工作与手动创建的完全相同,并且可以在没有安全配置的情况下成功运行。

我想念什么?这是完整的错误日志

  

“ / mnt / yarn / usercache / root / appcache / application_1 ... 5_0002 / container_15 ... 45_0002_01_000001 / py4j-0.10.4-src.zip / py4j / protocol.py”,第319行,位于get_return_value中   py4j.protocol.Py4JJavaError:调用o145.pyWriteDynamicFrame时发生错误。   :org.apache.spark.SparkException:由于阶段失败而导致作业中止:阶段2.0中的任务3失败4次,最近一次失败:阶段2.0中的任务3.3丢失(TID 30,ip-10 -.... us-west -2.compute.internal,执行程序1):com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求ID:F ... 49),S3扩展请求ID:eo ... wXZw =   在com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient $ RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1588

6 个答案:

答案 0 :(得分:0)

不幸的是,该错误并没有告诉我们太多,除了在写入DynamicFrame期间失败之外。

403仅有少数几种可能的原因,您可以检查是否满足所有条件:

  1. 目标存储桶上的存储桶策略规则。
  2. IAM角色需要权限(尽管您提到拥有S3 *)
  3. 如果这是跨帐户的,那么还有很多方面需要检查,例如在存储桶和用户上允许策略。 (通常,对规范帐户ID的信任最简单)
  4. 我不知道角色和存储桶的策略文档可能有多么复杂,但是请记住,显式的Deny语句优先于允许。
  5. 如果问题与KMS有关,我将检查以确保您为“胶粘连接”选择的子网具有到达KMS端点的路由(您可以在VPC中添加KMS端点)
  6. 确保临时目录不会出现问题,临时目录也已针对您的工作进行了配置,或者可能不是最终的写入操作。
  7. 检查您的帐户是否是您要写入的位置的“对象所有者”(通常是在帐户之间读取/写入数据时出现的问题)

如果以上方法均无效,则可以进一步了解您的设置。也许是写操作的代码。

答案 1 :(得分:0)

除了Lydon的回答外,如果您的数据源位置与数据目标位置相同,还会收到错误403。在胶水中创建作业时定义。如果它们相同,请更改其中任何一个,问题将得到解决。

答案 2 :(得分:0)

您如何为PassRole提供粘合角色的权限?

{
        "Sid": "AllowAccessToRoleOnly",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole",
          "iam:GetRole",
          "iam:GetRolePolicy",
          "iam:ListRolePolicies",
          "iam:ListAttachedRolePolicies"
        ],
        "Resource": "arn:aws:iam::*:role/<role>"
      }

通常,我们使用<project>-<role>-<env>创建角色,例如xyz-glue-dev,其中项目名称为xyz,env为dev。在这种情况下,我们使用"Resource": "arn:aws:iam::*:role/xyz-*-dev"

答案 3 :(得分:0)

对我来说是两件事。

  1. 应该正确指定存储桶的访问策略-bucket / *,在这里我缺少*部分
  2. 必须在VPC中创建端点以使胶水访问S3 https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoints-s3.html

完成这两个设置后,我的胶水作业成功运行。希望这会有所帮助。

答案 4 :(得分:0)

确保您给出了正确的策略。 我面临同样的问题,以为我的角色配置正确。 但是在我删除角色并遵循this步骤之后,它开始起作用了;]

答案 5 :(得分:-1)

您已完成所需的RDS参数组配置,在您的问题中没有看到对此的任何引用?我很高兴您错过了RDS参数组中的某些配置,无法从S3和RDS进行读取/写入。如果没有完成,请refer to this link并进行所需的配置。这应该起作用。