首页 > 解决方案 > AWS Glue 作业在写入 S3 时被拒绝访问

问题描述

我有一个由 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

标签: amazon-web-servicesamazon-s3aws-glue

解决方案


不幸的是,这个错误并没有告诉我们太多,只是它在你的 DynamicFrame 的写入过程中失败了。

403的可能原因只有少数,你可以检查一下你是否都遇到过:

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

如果上述方法都不起作用,您可以对您的设置有更多了解。也许是写操作的代码。


推荐阅读