【发布时间】:2021-05-20 11:42:50
【问题描述】:
我想在 s3 中从 lambda 发送一个 json 文件。我在文档中看到我们可以使用函数 boto3 put_object 发送文件或字节对象(Body=b'bytes'|file)。
但如果我没记错的话,如果我在 s3 中使用 Body=bytes 发送一个文件,然后我下载我的文件,内容将不可见。
所以在我的 lambda 函数中,我从 SQS 队列接收消息,我在 lambda 临时文件夹 /tmp 中创建了一个包含消息内容的文件。我想让这个 json 文件发送到 my_bucket/folder/file.json 中
我看到了很多在 s3 中创建文件的例子,但是 Body 参数是字节而不是文件。
这是我的代码(python3.7)
def alpaca_consent_customer_dev(event, context): # handler
# TODO implement
request_id = context.aws_request_id
print('START - RequestID: {}'.format(request_id))
# function to write json file
def write_json(target_path, target_file, data):
if not os.path.exists(target_path):
try:
os.makedirs(target_path)
except Exception as e:
print(e)
raise
with open(os.path.join(target_path, target_file), 'w') as f:
json.dump(data, f)
try:
s3 = boto3.client('s3', region_name="us-west-2")
request_id = context.aws_request_id
print('START - RequestID: {}'.format(request_id))
# Get message from SQS queue
for record in event['Records']:
data = record
# Get message from SQS
data_loaded = json.loads(data['body'])
sns_message_id = data_loaded['MessageId']
print('data loaded type:', type(data_loaded))
data_saved = json.dumps(data_loaded)
# Create json file in temporary folder
write_json('/tmp', sns_message_id+'.json', data_saved)
# Check if file exists
print(glob.glob("/tmp/*.json"))
# result: ['/tmp/3bb1c0bc-68d5-5c4d-b827-021301.json']
s3.put_object(Body='/tmp/'+sns_message_id + '.json', Bucket='mybucket', Key='my_sub_bucket/' + datetime.datetime.today().strftime('%Y%m%d')+ '/'+ sns_message_id + '.json')
except Exception as e:
raise Exception('ERROR lambda failed: {}'.format(str(e)))
感谢您的帮助。问候。
【问题讨论】:
标签: python-3.x amazon-s3 aws-lambda amazon-sqs