【问题标题】:Using multiple Python functions within AWS Lambda script在 AWS Lambda 脚本中使用多个 Python 函数
【发布时间】: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


【解决方案1】:

基于 cmets。

问题是因为 my_function 函数没有在 lambda 处理程序中调用

解决方案是将my_function() 添加到处理程序lambda_handler 中,以便实际调用my_function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2021-09-19
    • 2019-06-23
    • 2020-04-25
    • 2020-02-24
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多