案例1

题目

某公司使用AWS构建了一个数据处理系统,该系统架构如下:使用Amazon S3存储原始数据,通过AWS Lambda函数定期从S3读取数据并进行预处理,预处理后的数据存储到Amazon DynamoDB中。最近,Lambda函数执行时频繁报错,导致数据无法正常处理。以下是部分相关代码和配置信息,请找出问题并解决。

Lambda函数代码(Python)

import boto3

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    dynamodb = boto3.resource('dynamodb')

    bucket = s3.Bucket('your - s3 - bucket - name')
    for obj in bucket.objects.all():
        data = obj.get()['Body'].read().decode('utf - 8')
        # 这里进行数据预处理,简单示例为去除空格
        processed_data = data.replace(' ', '')

        table = dynamodb.Table('your - dynamodb - table - name')
        table.put_item(Item={'data': processed_data})
    return {
      'statusCode': 200,
        'body': 'Data processed successfully'
    }

Lambda函数配置

  • 执行角色:已创建名为lambda - execution - role的角色,该角色关联了一个策略,策略内容如下:
{
    "Version": "2012 - 10 - 17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "dynamodb:PutItem"
            ],
            "Resource": [
                "arn:aws:s3:::your - s3 - bucket - name/*",
                "arn:aws:dynamodb:your - region:your - account - id:table/your - dynamodb - table - name"
            ]
        }
    ]
}
  • 运行时环境:Python 3.8
  • 内存分配:128MB
  • 超时时间:10秒

解题思路

  1. 仔细审题
    • 明确这是一道AWS相关的架构排错题,涉及到S3、Lambda和DynamoDB服务的协同工作。
    • 已知Lambda函数执行报错,需要从提供的代码和配置信息中找出问题并解决,确保数据能从S3读取、预处理后正确存入DynamoDB。
  2. 全面检查
    • 整体逻辑检查
      • 从整体架构逻辑上看,代码逻辑基本合理。Lambda函数尝试从指定S3桶读取对象,对数据进行预处理,然后将处理后的数据存入指定的DynamoDB表,符合数据处理系统的一般流程。
    • 细节检查
      • 代码语法层面:在Python代码中,bucket = s3.Bucket('your - s3 - bucket - name')这里,your - s3 - bucket - name应替换为真实的S3桶名称,否则会找不到对应的桶。同理,table = dynamodb.Table('your - dynamodb - table - name')中的your - dynamodb - table - name也需替换为真实的DynamoDB表名。
      • 服务交互层面:在DynamoDB的put_item操作中,假设DynamoDB表的主键设计并非只有一个简单的data字段。如果表设计有分区键和排序键等复杂主键结构,当前table.put_item(Item={'data': processed_data})的写法会因主键不完整导致写入失败。
      • 配置层面:在Lambda函数执行角色的策略中,资源ARN的写法虽然格式正确,但your - regionyour - account - id需替换为真实的AWS区域和账户ID,否则策略可能无法正确应用到对应的资源。
      • 性能层面:Lambda函数配置中,内存分配为128MB,超时时间为10秒。如果处理的数据量较大,128MB内存可能不足,导致函数执行过程中因内存耗尽报错;10秒的超时时间对于数据读取、预处理和写入操作可能过短,特别是当S3读取或DynamoDB写入存在网络延迟时,易触发超时错误。
    • 概念检查
      • 代码中对boto3库的使用,包括创建S3和DynamoDB资源对象,以及调用相应的方法,概念上没有错误。对AWS服务之间通过IAM角色授权访问的理解,在策略配置的结构上是正确的,但存在细节错误。
  3. 分析错误原因
    • 错误1:资源名称未替换:代码中的S3桶名称和DynamoDB表名未替换为真实名称,导致无法准确访问对应的资源,这是较为明显的配置错误。
    • 错误2:DynamoDB主键问题:未考虑DynamoDB表复杂的主键结构,直接以简单的data字段写入数据,可能因主键不完整违反表的约束而写入失败。
    • 错误3:策略ARN细节错误:IAM策略中的区域和账户ID未替换,可能导致策略无法正确匹配资源,从而使Lambda函数没有足够权限访问S3和DynamoDB资源。
    • 错误4:性能配置问题:内存和超时时间设置可能无法满足实际数据处理需求,导致函数执行异常。
  4. 改正错误
    • 改正1:替换资源名称:将代码中的'your - s3 - bucket - name'替换为真实的S3桶名称,'your - dynamodb - table - name'替换为真实的DynamoDB表名。
    • 改正2:完善DynamoDB写入:根据实际的DynamoDB表主键结构,完善put_item操作中的Item参数,确保包含完整的主键信息。例如,如果表的分区键是id,排序键是timestamp,则代码应改为table.put_item(Item={'id': some_generated_id, 'timestamp': some_timestamp, 'data': processed_data})
    • 改正3:修正策略ARN:将IAM策略中的your - region替换为实际的AWS区域,your - account - id替换为真实的账户ID。
    • 改正4:调整性能配置:根据实际数据处理的资源消耗情况,适当增加Lambda函数的内存分配,例如调整为256MB或更高;同时,增加超时时间,比如设置为30秒,观察函数执行情况,若仍有问题,可进一步调整。
  5. 复查验证
    • 重新部署修改后的Lambda函数代码,并更新IAM策略配置。
    • 观察Lambda函数的执行情况,查看AWS Lambda控制台中的执行日志。如果没有报错信息,且数据能正确从S3读取、预处理后存入DynamoDB,则说明问题已解决。若仍有错误,需根据新的错误提示,重复上述检查、分析和改正步骤,直至系统能正常运行。
posted @ 2025-04-16 23:52  cat桑  阅读(8)  评论(0)    收藏  举报