AWS Lambda从S3上传文件至API遇422错误的解决方法
AWS Lambda处理S3上传文件后发送POST请求返回422错误的解决方法
我有一个由指定S3存储桶中对象上传触发的AWS Lambda函数,预期在文件上传后发送携带该文件的POST请求。以下是初始代码:
import json import os.path import boto3 import requests s3Client=boto3.client('s3') def lambda_handler(event, context): bucket=event['Records'][0]['s3']['bucket']['name'] key=event['Records'][0]['s3']['object']['key'] FILE_NAME = os.path.basename(key) TMP_FILE_NAME = '/tmp/' +FILE_NAME s3Client.download_file(bucket, key,TMP_FILE_NAME) url = "*****************" payload={'approved': 'true', '': ''} files=[ ('file',('ori-csv.csv',open(TMP_FILE_NAME,'rb'),'text/csv')) ] headers = { 'Accept': 'application/json,application/vnd.api+json;version=1', 'Content-Type': 'multipart/form-data',#(tried this also 'application/json') 'Host': '****************', 'Authorization': 'Bearer *****************' } response = requests.request("POST", url, headers=headers, data=payload, files=files) print(response)
已正确将requests库导入Lambda,且通过同一API的GET请求测试正常,但在CloudWatch中收到422响应,请问正确的请求头或文件POST方式是什么?
更新:问题已解决
将boto3客户端改为资源后问题解决,以下是正确代码:
s = boto3.resource('s3') token = 'Bearer ******************' def lambda_handler(event, context): bucket=event['Records'][0]['s3']['bucket']['name'] key=event['Records'][0]['s3']['object']['key'] print(bucket) print(key) file = key.split('/')[-1] print(file) s3_object = s.Object(bucket, key) data = s3_object.get()['Body'].read().decode('utf-8') with open('/tmp/'+file,'w') as file1: file1.write(data) url = "**************" payload = {'approved': 'true'} files = [ ('file',open('/tmp/'+file,'rb') ) ] headers = { 'Authorization': token } response = requests.request("POST", url, headers=headers, data=payload, files=files) print(response)
内容的提问来源于stack exchange,提问作者melamed
相关产品推荐
相关产品推荐

