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

Posted

技术标签:

【中文标题】AWS Glue 作业在写入 S3 时被拒绝访问【英文标题】:AWS Glue Job getting Access Denied when writing to S3 【发布时间】:2019-06-28 19:14:40 【问题描述】:

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

当我运行此作业时,我收到以下错误。

该作业具有 IAM 服务角色。

此服务角色允许

    胶水和 RDS 服务, 假设 arn:aws:iam::aws:policy/AmazonS3FullAccess 和 arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole,并且 具有全范围的 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

【问题讨论】:

您可以配置 s3 访问日志,也可以为 s3 存储桶配置对象级日志记录,并使用 Athena 分析日志(或直接打开写入的日志)以查看 403 的确切原因。跨度> 对于 s3.*,您是否将资源指定为 ["bucket-arn", "bucket-arn/*"] ? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

除了Lydon的回答,如果你的Data Source位置和Data Target一样,也会收到403错误;在 Glue 中创建作业时定义。如果它们相同,请更改其中任何一个,问题将得到解决。

【讨论】:

【参考方案3】:

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


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

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

【讨论】:

【参考方案4】:

对我来说是两件事。

    应正确给出存储桶的访问策略 - bucket/*,这里我缺少 * 部分 必须在 VPC 中创建终结点,以便粘连访问 S3 https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoints-s3.html

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

【讨论】:

【参考方案5】:

确保您制定了正确的政策。 我面临同样的问题,认为我的角色配置得很好。 但是在我删除角色并按照this 步骤后,它起作用了;]

【讨论】:

以上是关于AWS Glue 作业在写入 S3 时被拒绝访问的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue 作业将 Null 写入 Redshift

AWS Glue 抓取动态 S3 路径位置

如何在 AWS 中使用 Glue 作业覆盖 s3 数据

尽管用户角色,AWS Batch 作业在 S3 上被拒绝访问

从 AWS Redshift 到 S3 的 AWS Glue ETL 作业失败

为啥 AWS Glue 不生成火花事件日志