【发布时间】:2021-01-08 09:36:08
【问题描述】:
情况
我正在使用 Lambda 函数,该函数从传入的电子邮件中获取 CSV 附件,并将其放入实际上是 S3 存储桶的子文件夹中。 Lambda 的这一部分运行良好,但是我需要在同一个 Lambda 函数中执行其他 UDF 来执行后续任务。
代码
import boto3
import email
import base64
import math
import pickle
import numpy as np
import pandas as pd
import io
###############################
### GET THE ATTACHMENT ###
###############################
#s3 = boto3.client('s3')
FILE_MIMETYPE = 'text/csv'
#'application/octet-stream'
# destination folder
S3_OUTPUT_BUCKETNAME = 'my_bucket'
print('Loading function')
s3 = boto3.client('s3')
def lambda_handler(event, context):
#source email bucket
inBucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.quote(event['Records'][0]['s3']['object']['key'].encode('utf8'))
try:
response = s3.get_object(Bucket=inBucket, Key=key)
msg = email.message_from_string(response['Body'].read().decode('utf-8'))
except Exception as e:
print(e)
print('Error retrieving object {} from source bucket {}. Verify existence and ensure bucket is in same region as function.'.format(key, inBucket))
raise e
attachment_list = []
try:
#scan each part of email
for message in msg.walk():
# Check filename and email MIME type
if (message.get_content_type() == FILE_MIMETYPE and message.get_filename() != None):
attachment_list.append ({'original_msg_key':key, 'attachment_filename':message.get_filename(), 'body': base64.b64decode(message.get_payload()) })
except Exception as e:
print(e)
print ('Error processing email for CSV attachments')
raise e
# if multiple attachments send all to bucket
for attachment in attachment_list:
try:
s3.put_object(Bucket=S3_OUTPUT_BUCKETNAME, Key='attachments/' + attachment['original_msg_key'] + '-' + attachment['attachment_filename'] , Body=attachment['body']
)
except Exception as e:
print(e)
print ('Error sending object {} to destination bucket {}. Verify existence and ensure bucket is in same region as function.'.format(attachment['attachment_filename'], S3_OUTPUT_BUCKETNAME))
raise e
#################################
### ADDITIONAL FUNCTIONS ###
#################################
def my_function():
print("Hello, this is another function")
结果
CSV 附件已成功检索并放置在 s3.put_object 指定的目标中,但 Cloudwatch 日志中没有证据表明 my_function 运行。
我已经尝试过什么
我尝试使用 def my_function(event, context): 来确定该函数是否需要与第一个函数相同的标准来执行。我也尝试将 my_function() 作为第一个函数的一部分包含在内,但这似乎也不起作用。
如何确保这两个函数都在 Lambda 中执行?
【问题讨论】:
-
你根本没有调用你的
my_function。只需在处理程序末尾的lambda_handler中调用它即可。 -
Lambda 服务调用 您 在您创建/更新 Lambda 函数时配置的 Python 函数。它不会神奇地调用“具有给定参数签名的所有函数”。
-
我的意思是在您要调用函数的
lambda_handler中添加my_function()。 -
在调用
my_function()的lambda_handler(...)函数中编写代码。就像您在常规 Python 中所做的一样。 -
由于 Cloudwatch 日志中存在函数输出,我可以确认该函数已执行
标签: python amazon-web-services amazon-s3 aws-lambda boto3