案例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秒
解题思路
- 仔细审题
- 明确这是一道AWS相关的架构排错题,涉及到S3、Lambda和DynamoDB服务的协同工作。
- 已知Lambda函数执行报错,需要从提供的代码和配置信息中找出问题并解决,确保数据能从S3读取、预处理后正确存入DynamoDB。
- 全面检查
- 整体逻辑检查:
- 从整体架构逻辑上看,代码逻辑基本合理。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 - region
、your - account - id
需替换为真实的AWS区域和账户ID,否则策略可能无法正确应用到对应的资源。 - 性能层面:Lambda函数配置中,内存分配为128MB,超时时间为10秒。如果处理的数据量较大,128MB内存可能不足,导致函数执行过程中因内存耗尽报错;10秒的超时时间对于数据读取、预处理和写入操作可能过短,特别是当S3读取或DynamoDB写入存在网络延迟时,易触发超时错误。
- 代码语法层面:在Python代码中,
- 概念检查:
- 代码中对
boto3
库的使用,包括创建S3和DynamoDB资源对象,以及调用相应的方法,概念上没有错误。对AWS服务之间通过IAM角色授权访问的理解,在策略配置的结构上是正确的,但存在细节错误。
- 代码中对
- 整体逻辑检查:
- 分析错误原因
- 错误1:资源名称未替换:代码中的S3桶名称和DynamoDB表名未替换为真实名称,导致无法准确访问对应的资源,这是较为明显的配置错误。
- 错误2:DynamoDB主键问题:未考虑DynamoDB表复杂的主键结构,直接以简单的
data
字段写入数据,可能因主键不完整违反表的约束而写入失败。 - 错误3:策略ARN细节错误:IAM策略中的区域和账户ID未替换,可能导致策略无法正确匹配资源,从而使Lambda函数没有足够权限访问S3和DynamoDB资源。
- 错误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秒,观察函数执行情况,若仍有问题,可进一步调整。
- 改正1:替换资源名称:将代码中的
- 复查验证
- 重新部署修改后的Lambda函数代码,并更新IAM策略配置。
- 观察Lambda函数的执行情况,查看AWS Lambda控制台中的执行日志。如果没有报错信息,且数据能正确从S3读取、预处理后存入DynamoDB,则说明问题已解决。若仍有错误,需根据新的错误提示,重复上述检查、分析和改正步骤,直至系统能正常运行。