AWS架构中S3访问拒绝问题求助(CloudWatch报Access Denied)
修复S3->SNS->SQS->Lambda数据流中的Access Denied错误
以下是针对你遇到的SQS消息飞行状态、Lambda触发Access Denied问题的具体修复步骤:
1. 配置Lambda资源策略允许SQS触发
Lambda需要明确授权对应的SQS队列调用它,添加以下资源策略到你的MyLambda函数:
{ "Version": "2012-10-17", "Id": "sqs-trigger-lambda", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sqs.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:ap-south-1:111111111111:function:MyLambda", "Condition": { "ArnEquals": { "AWS:SourceArn": "你的SQS队列ARN" } } } ] }
替换你的SQS队列ARN为实际的队列ARN,确保区域、账号ID与Lambda配置完全匹配。
2. 完善Lambda执行角色权限
检查Lambda使用的MyLambda-role-test角色,补充以下必要权限:
- SQS操作权限:允许Lambda读取、删除SQS消息:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes" ], "Resource": "你的SQS队列ARN" } ] }
- S3读写权限:允许Lambda处理目标S3桶的文件:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::你的S3桶名/*", "arn:aws:s3:::你的S3桶名" ] } ] }
- CloudWatch日志权限:确保Lambda能输出日志便于排查(若自定义角色未包含需添加):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:ap-south-1:111111111111:*" } ] }
3. 验证SQS触发器配置
- 确认SQS触发器已正确关联到
MyLambda函数,未遗漏任何配置项。 - 调整SQS队列的可见性超时,确保其值大于Lambda的超时时间(当前Lambda超时15秒,建议设为30秒以上,避免消息重复触发)。
4. 检查跨区域权限一致性
从CloudTrail日志可见,Lambda位于ap-south-1,但更新请求来自us-east-1,需确保所有资源(S3、SNS、SQS、Lambda)的权限策略中使用的ARN区域、账号ID完全一致,避免跨区域权限不匹配。
内容的提问来源于stack exchange,提问作者CPK_2011
相关产品推荐
相关产品推荐

