AWS Glue Studio作业运行报错:S3访问被拒绝(403状态码)
问题背景
在AWS Glue Studio创建作业,处理S3桶tfe-scott-02中in/目录的CSV文件,添加1条数据质量规则,无转换操作,输出到同桶out/目录。运行作业时触发启动错误:
LAUNCH ERROR | Error downloading from S3 for bucket: tfe-scott-02, key: scripts/tfe-scott-02-job-04.py.Access Denied (Service: Amazon S3; Status Code: 403; Please refer logs for details.
错误日志显示:
com.amazonaws.SdkClientException: Error downloading from S3 for bucket: tfe-scott-02, key: scripts/tfe-scott-job-04.py.Access Denied (Service: Amazon S3; Status Code: 403;
Glue Studio生成的作业脚本如下:
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from awsgluedq.transforms import EvaluateDataQuality args = getResolvedOptions(sys.argv, ["JOB_NAME"]) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args["JOB_NAME"], args) # Script generated for node S3 bucket S3bucket_node1 = glueContext.create_dynamic_frame.from_options( format_options={ "quoteChar": '"', "withHeader": True, "separator": "|", "optimizePerformance": False, }, connection_type="s3", format="csv", connection_options={"paths": ["s3://tfe-scott-02/in/"], "recurse": True}, transformation_ctx="S3bucket_node1", ) # Script generated for node ApplyMapping ApplyMapping_node2 = ApplyMapping.apply( frame=S3bucket_node1, mappings=[], transformation_ctx="ApplyMapping_node2" ) # Script generated for node Evaluate Data Quality EvaluateDataQuality_node1680983936721_ruleset = """ Rules = [ ColumnValues "patient_effective_date" between 20230101 and 20231231 ] """ EvaluateDataQuality_node1680983936721_DQ_Results = EvaluateDataQuality.apply( frame=ApplyMapping_node2, ruleset=EvaluateDataQuality_node1680983936721_ruleset, publishing_options={ "dataQualityEvaluationContext": "EvaluateDataQuality_node1680983936721", "enableDataQualityCloudWatchMetrics": True, "enableDataQualityResultsPublishing": True, "resultsS3Prefix": "s3://tfe-scott-02/out/", }, ) EvaluateDataQuality_node1680983936721 = ApplyMapping_node2 # Script generated for node S3 bucket S3bucket_node3 = glueContext.getSink( path="s3://tfe-scott-02/out/", connection_type="s3", updateBehavior="UPDATE_IN_DATABASE", partitionKeys=[], enableUpdateCatalog=True, transformation_ctx="S3bucket_node3", ) S3bucket_node3.setCatalogInfo( catalogDatabase="tfe-scott-database-03", catalogTableName="tbl_eligibility" ) S3bucket_node3.setFormat("json") S3bucket_node3.writeFrame(ApplyMapping_node2) job.commit()
可能原因及解决办法
1. Glue作业IAM角色权限不足
Glue作业启动时需要读取存储在S3的作业脚本,若作业绑定的IAM角色没有tfe-scott-02/scripts/路径的读权限,就会触发403错误。
- 解决步骤:
- 进入Glue Studio作业的「Job details」标签,找到使用的IAM角色。
- 进入IAM控制台,编辑该角色的权限策略,添加以下权限:
{ "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::tfe-scott-02", "arn:aws:s3:::tfe-scott-02/scripts/*", "arn:aws:s3:::tfe-scott-02/in/*", "arn:aws:s3:::tfe-scott-02/out/*" ] } - 保存策略后重新运行作业。
2. S3桶策略限制访问
S3桶的自定义策略可能拒绝了Glue角色的访问请求,即使角色本身有权限。
- 解决步骤:
- 进入S3控制台,找到
tfe-scott-02桶,切换到「Permissions」标签查看「Bucket policy」。 - 确认桶策略中存在允许该Glue角色访问的规则,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[你的AWS账号ID]:role/[Glue作业角色名称]" }, "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::tfe-scott-02", "arn:aws:s3:::tfe-scott-02/*" ] } ] } - 若存在拒绝规则,检查是否误阻止了该角色的访问,必要时调整规则。
- 进入S3控制台,找到
3. 脚本文件路径/名称不匹配
错误提示的脚本key是scripts/tfe-scott-02-job-04.py,但日志里显示的是scripts/tfe-scott-job-04.py,存在名称差异,可能是Glue Studio生成脚本时的路径错误,导致找不到文件。
- 解决步骤:
- 登录S3控制台,检查
tfe-scott-02/scripts/目录下是否存在对应的脚本文件。 - 如果文件不存在,回到Glue Studio,重新保存作业,触发脚本自动上传到S3。
- 如果名称不一致,可尝试重新创建作业,或在Glue作业的「Script」标签下手动修正脚本存储路径。
- 登录S3控制台,检查
4. S3桶所有权或ACL问题
如果桶属于其他AWS账号,或者脚本文件的ACL设置限制了访问,也会导致403错误。
- 解决步骤:
- 若桶属于其他账号,需对方账号配置桶策略允许你的账号角色访问,同时你的角色要有对应权限。
- 检查脚本文件的ACL,确保允许Glue作业角色读取该文件,可设置ACL为「bucket-owner-full-control」或直接授权对应角色的读权限。
内容的提问来源于stack exchange,提问作者ScotterMonkey

