案例6

题目

某公司使用AWS构建了数据处理管道:用户上传CSV文件到Amazon S3后,触发AWS Lambda函数解析文件并启动AWS Glue作业进行数据清洗,清洗后的数据存储到另一个S3桶中。近期发现文件上传后,Glue作业始终无法启动,Lambda函数执行日志显示“无法创建Glue作业”。请根据以下配置信息排查并解决问题。

相关配置信息

  1. S3存储桶配置

    • 输入桶:data - input - bucket,配置S3事件通知,触发Lambda函数file - processor - lambda
    • 输出桶:data - output - bucket,用于存储Glue清洗后的数据。
  2. 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/*"  
              }  
          ]  
      }  
      
  3. 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(实际脚本存在且正确)。

解题思路

1. 明确问题现象与核心矛盾

  • 现象:Lambda函数调用glue.create_job时报错“无法创建Glue作业”,但S3事件通知正常触发Lambda。
  • 核心矛盾:Lambda函数缺少操作Glue服务的权限,或Glue作业角色配置错误。

2. 排查Lambda函数的Glue权限

  • 代码逻辑分析
    Lambda函数使用glue.create_jobglue.start_job_run,需要对应的IAM权限glue:CreateJobglue: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,需确认:
    1. 该路径下的脚本是否存在且有权限访问(Glue作业角色需有s3:GetObject权限,已在步骤3中修复)。
    2. 桶名是否正确(无多余空格或符号,题目中桶名包含-,需确认是否与实际一致)。

5. 排查Glue作业创建的其他限制

  • 区域一致性
    确认Lambda函数、Glue作业、S3桶是否在同一区域(题目中假设均为us - east - 1,若不一致需修正)。
  • Glue作业名称唯一性
    若重复调用glue.create_job且作业已存在,会报错AlreadyExistsException,需改用get_job检查是否存在,或允许覆盖(生产环境建议幂等设计)。

6. 验证修复后的流程

  1. 更新角色策略
    • lambda - execution - role添加Glue操作权限。
    • glue - service - role添加输出桶写入和日志权限。
  2. 重新触发流程
    • 上传测试文件到data - input - bucket,观察Lambda函数是否成功创建并启动Glue作业。
  3. 检查日志
    • Lambda日志:确认create_jobstart_job_run调用成功。
    • Glue控制台:查看作业状态,确认是否开始执行,输入/输出路径是否正确。

总结

核心错误:Lambda函数缺少Glue服务操作权限

  1. 权限缺失
    • Lambda需glue:CreateJobglue:StartJobRun权限才能创建并启动Glue作业。
    • Glue作业角色需同时具备输入桶读取、输出桶写入及日志相关权限。
  2. 次要检查点
    • 资源路径正确性(如S3脚本路径、桶名拼写)。
    • 区域一致性和服务间的基本连通性。

解决步骤

  1. 为Lambda执行角色添加Glue操作权限。
  2. 为Glue作业角色补充输出桶写入和日志权限。
  3. 验证流程并通过日志确认各服务交互正常。

AWS排错关键:服务间的API调用必须匹配对应的IAM操作权限,且每个服务的执行角色需具备“最小必要权限”。通过控制台错误提示(如AccessDenied)和服务日志(Lambda、Glue、CloudWatch)可快速定位权限问题。

posted @ 2025-04-16 23:57  cat桑  阅读(59)  评论(0)    收藏  举报