Python Lambda将Base64转DICOM后上传AWS S3失败求助
解决Lambda将Base64转DCM文件上传S3的问题
一、先确认Lambda执行角色权限
你的S3桶启用了「Block all public access」,必须通过IAM角色授权让Lambda拥有上传权限,不能依赖公开访问策略。给Lambda的执行角色添加以下IAM权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::你的桶名/*" } ] }
注意替换你的桶名为实际存储桶名称,确保Resource路径覆盖你要上传的目标前缀。
二、正确的代码实现方案
Lambda的本地可写目录只有/tmp,Base64解码后可直接用字节流上传(更高效),以下是两种可行方案:
方案1:直接用put_object上传字节流(推荐)
跳过本地文件写入,直接把解码后的DCM字节数据上传到S3:
import boto3 import base64 s3_client = boto3.client('s3') def lambda_handler(event, context): # 从event中获取Base64编码的DCM数据(移除可能的前缀如"data:application/dicom;base64,") base64_data = event['body'].split(',')[-1] if ',' in event['body'] else event['body'] # 解码Base64为字节流 dcm_bytes = base64.b64decode(base64_data) # 上传到S3 bucket_name = "你的桶名" s3_key = "目标路径/文件名.dcm" # 示例:"dicom_files/patient_001.dcm" try: s3_client.put_object( Bucket=bucket_name, Key=s3_key, Body=dcm_bytes ) return {"statusCode": 200, "message": "上传成功"} except Exception as e: print(f"上传失败:{str(e)}") return {"statusCode": 500, "message": f"上传失败:{str(e)}"}
方案2:写入临时文件后用upload_file上传
如果必须用本地文件方式,确保文件写入/tmp目录:
import boto3 import base64 import os s3_client = boto3.client('s3') def lambda_handler(event, context): base64_data = event['body'].split(',')[-1] if ',' in event['body'] else event['body'] dcm_bytes = base64.b64decode(base64_data) # 写入Lambda临时目录 temp_file_path = "/tmp/temp.dcm" with open(temp_file_path, 'wb') as f: f.write(dcm_bytes) bucket_name = "你的桶名" s3_key = "目标路径/文件名.dcm" try: s3_client.upload_file(temp_file_path, bucket_name, s3_key) # 可选:清理临时文件 os.remove(temp_file_path) return {"statusCode": 200, "message": "上传成功"} except Exception as e: print(f"上传失败:{str(e)}") return {"statusCode": 500, "message": f"上传失败:{str(e)}"}
三、常见排查要点
- 查看CloudWatch日志:Lambda执行日志会明确给出失败原因(比如
AccessDenied、NoSuchBucket、解码错误等),这是最快定位问题的方式。 - 验证Base64数据有效性:部分输入会带
data:application/dicom;base64,前缀,必须移除后再解码,否则会导致解码失败。 - 确认桶名和路径正确性:检查桶名拼写,S3 key路径若含特殊字符需做URL编码。
- VPC环境权限检查:如果Lambda在VPC内运行,需确保VPC配置了S3访问权限(VPC端点或NAT网关)。
内容的提问来源于stack exchange,提问作者Talha
相关产品推荐
相关产品推荐

