写入 S3 时 AWS Glue 作业被拒绝访问

ky2*_*inh 3 amazon-s3 amazon-web-services 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, executor 1): com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 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

Lyd*_*don 5

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

403 的可能原因只有少数,您可以检查是否都遇到了它们:

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

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