案例6
题目
某公司使用AWS构建了数据处理管道:用户上传CSV文件到Amazon S3后,触发AWS Lambda函数解析文件并启动AWS Glue作业进行数据清洗,清洗后的数据存储到另一个S3桶中。近期发现文件上传后,Glue作业始终无法启动,Lambda函数执行日志显示“无法创建Glue作业”。请根据以下配置信息排查并解决问题。
相关配置信息
-
S3存储桶配置
- 输入桶:
data - input - bucket,配置S3事件通知,触发Lambda函数file - processor - lambda。 - 输出桶:
data - output - bucket,用于存储Glue清洗后的数据。
- 输入桶:
-
Lambda函数配置
- 函数代码(Python):
import boto3 glue = boto3.client('glue') def lambda_handler(event, context): glue.create_job( Name='data - cleaning - job', Role='glue - service - role', Command={ 'Name': 'glueetl', 'ScriptLocation': 's3://data - input - bucket/glue - scripts/clean_data.py' }, DefaultArguments={ '--input-bucket': 'data - input - bucket', '--output-bucket': 'data - output - bucket' } ) glue.start_job_run(JobName='data - cleaning - job') return { 'statusCode': 200 } - 执行角色:
lambda - execution - role,策略如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::data - output - bucket/*" } ] }
- 函数代码(Python):
-
Glue配置
- Glue作业角色:
glue - service - role,策略如下(仅列出部分):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::data - input - bucket/*" } ] } - Glue脚本存储路径:
s3://data - input - bucket/glue - scripts/clean_data.py(实际脚本存在且正确)。
- Glue作业角色:
解题思路
1. 明确问题现象与核心矛盾
- 现象:Lambda函数调用
glue.create_job时报错“无法创建Glue作业”,但S3事件通知正常触发Lambda。 - 核心矛盾:Lambda函数缺少操作Glue服务的权限,或Glue作业角色配置错误。
2. 排查Lambda函数的Glue权限
- 代码逻辑分析:
Lambda函数使用glue.create_job和glue.start_job_run,需要对应的IAM权限glue:CreateJob和glue:StartJobRun。 - 当前角色策略检查:
lambda - execution - role的策略仅包含s3:PutObject,完全缺少Glue相关操作权限,这是直接导致错误的原因。 - 修正Lambda角色策略:
为lambda - execution - role添加Glue操作权限:{ "Effect": "Allow", "Action": [ "glue:CreateJob", "glue:DeleteJob", "glue:StartJobRun", "glue:GetJobRun" ], "Resource": "*" // 或限定为具体的Glue作业ARN(生产环境建议最小化) }
3. 检查Glue作业角色的权限
- Glue作业执行需求:
Glue作业需要访问输入S3桶(读取CSV文件)、输出S3桶(写入清洗后的数据),以及可能的日志存储权限。 - 当前
glue - service - role策略问题:
仅包含s3:GetObject(输入桶),缺少输出桶的s3:PutObject权限,且未配置Glue作业所需的日志存储权限(默认需写入CloudWatch Logs或S3日志桶)。 - 补充Glue角色策略:
[ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::data - output - bucket/*" }, { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "*" }, { "Effect": "Allow", "Action": "logs:CreateLogStream", "Resource": "*" }, { "Effect": "Allow", "Action": "logs:PutLogEvents", "Resource": "*" } ]
4. 验证Lambda代码中的资源路径
- 潜在问题:
ScriptLocation指定为s3://data - input - bucket/glue - scripts/clean_data.py,需确认:- 该路径下的脚本是否存在且有权限访问(Glue作业角色需有
s3:GetObject权限,已在步骤3中修复)。 - 桶名是否正确(无多余空格或符号,题目中桶名包含
-,需确认是否与实际一致)。
- 该路径下的脚本是否存在且有权限访问(Glue作业角色需有
5. 排查Glue作业创建的其他限制
- 区域一致性:
确认Lambda函数、Glue作业、S3桶是否在同一区域(题目中假设均为us - east - 1,若不一致需修正)。 - Glue作业名称唯一性:
若重复调用glue.create_job且作业已存在,会报错AlreadyExistsException,需改用get_job检查是否存在,或允许覆盖(生产环境建议幂等设计)。
6. 验证修复后的流程
- 更新角色策略:
- 为
lambda - execution - role添加Glue操作权限。 - 为
glue - service - role添加输出桶写入和日志权限。
- 为
- 重新触发流程:
- 上传测试文件到
data - input - bucket,观察Lambda函数是否成功创建并启动Glue作业。
- 上传测试文件到
- 检查日志:
- Lambda日志:确认
create_job和start_job_run调用成功。 - Glue控制台:查看作业状态,确认是否开始执行,输入/输出路径是否正确。
- Lambda日志:确认
总结
核心错误:Lambda函数缺少Glue服务操作权限
- 权限缺失:
- Lambda需
glue:CreateJob和glue:StartJobRun权限才能创建并启动Glue作业。 - Glue作业角色需同时具备输入桶读取、输出桶写入及日志相关权限。
- Lambda需
- 次要检查点:
- 资源路径正确性(如S3脚本路径、桶名拼写)。
- 区域一致性和服务间的基本连通性。
解决步骤:
- 为Lambda执行角色添加Glue操作权限。
- 为Glue作业角色补充输出桶写入和日志权限。
- 验证流程并通过日志确认各服务交互正常。
AWS排错关键:服务间的API调用必须匹配对应的IAM操作权限,且每个服务的执行角色需具备“最小必要权限”。通过控制台错误提示(如AccessDenied)和服务日志(Lambda、Glue、CloudWatch)可快速定位权限问题。

浙公网安备 33010602011771号