You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让AWS Lambda函数向自定义Flask应用返回响应?

把AWS Lambda的Rekognition分析结果传给自定义Flask应用的几种方案

嘿,这个需求我之前帮不少开发者处理过,给你整理几个实用的实现方案,你可以根据自己的业务场景和可靠性要求来选:

方案1:Lambda直接调用Flask的API端点(快速实现)

这是最直接的方式,只要你的Flask应用能被Lambda访问到(公网可访问,或者和Lambda在同一个VPC内)。

步骤:

  1. 在Flask里写接收结果的接口
    先给你的Flask应用加一个POST接口,专门用来接收Lambda传过来的Rekognition分析结果:

    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    @app.route('/webhook/rekognition-result', methods=['POST'])
    def receive_rekognition_data():
        try:
            # 解析Lambda发来的JSON数据
            analysis_result = request.get_json()
            # 这里写你的业务逻辑:比如存数据库、生成报表、触发其他操作等
            print(f"收到分析结果:{analysis_result}")
            return jsonify({"status": "success", "message": "结果已接收"}), 200
        except Exception as e:
            return jsonify({"status": "error", "message": str(e)}), 500
    
    if __name__ == '__main__':
        # 生产环境一定要用Gunicorn/uWSGI这种专业WSGI服务器,别用自带的开发服务器!
        app.run(host='0.0.0.0', port=5000)
    
  2. 修改Lambda函数,添加调用Flask接口的逻辑
    在你现有的Lambda代码里,把Rekognition的分析结果通过POST请求发送到Flask接口。注意:Lambda默认环境没有requests库,你需要把它打包成Lambda层或者直接打包到部署包中。

    import requests
    import json
    
    def lambda_handler(event, context):
        # 这里是你已经写好的Rekognition分析逻辑,假设拿到了结果analysis_result
        analysis_result = {
            "image_s3_location": f"{event['Records'][0]['s3']['bucket']['name']}/{event['Records'][0]['s3']['object']['key']}",
            "rekognition_labels": [{"Name": "Dog", "Confidence": 99.2}]
        }
    
        # 替换成你的Flask应用公网域名/IP+接口路径
        flask_webhook_url = "https://your-flask-app-domain.com/webhook/rekognition-result"
        try:
            # 发送POST请求
            response = requests.post(
                flask_webhook_url,
                json=analysis_result,
                timeout=10
            )
            response.raise_for_status()  # 抛出HTTP错误
            print(f"Flask应用响应:{response.json()}")
        except requests.exceptions.RequestException as e:
            # 处理请求失败的情况:比如记录日志、存入SQS重试,避免丢数据
            print(f"调用Flask接口失败:{str(e)}")
            # 可选:把失败的结果存入SQS,后续用另一个Lambda或脚本重试
            # sqs_client.send_message(QueueUrl="your-sqs-queue-url", MessageBody=json.dumps(analysis_result))
    
        return {
            'statusCode': 200,
            'body': json.dumps('分析结果已尝试发送至Flask应用')
        }
    
  3. 关键注意点

    • 如果Flask在公网,Lambda需要有访问公网的权限(配置NAT网关);如果Flask在VPC内,把Lambda放到同一个VPC的子网,配置安全组允许Lambda访问Flask的端口。
    • 生产环境一定要给Flask配置HTTPS(比如用Nginx+SSL证书,或者AWS ALB+ACM证书),避免明文传输数据。
    • 打包requests到Lambda层:本地执行pip install requests -t ./python,把python文件夹打包成zip,上传到Lambda层即可。

方案2:用SQS做中间件(高可靠性)

如果担心Flask应用临时宕机或者网络波动导致数据丢失,建议加个SQS队列做缓冲,实现“解耦”。

步骤:

  1. 创建SQS队列
    在AWS控制台创建一个标准队列(需要顺序处理的话用FIFO队列),记录下队列URL。

  2. Lambda把结果发送到SQS
    修改Lambda代码,把分析结果发送到SQS而不是直接调用Flask:

    import boto3
    import json
    
    sqs_client = boto3.client('sqs', region_name='your-aws-region')
    SQS_QUEUE_URL = "https://sqs.your-aws-region.amazonaws.com/123456789012/your-queue-name"
    
    def lambda_handler(event, context):
        analysis_result = {
            "image_s3_location": f"{event['Records'][0]['s3']['bucket']['name']}/{event['Records'][0]['s3']['object']['key']}",
            "rekognition_labels": [{"Name": "Dog", "Confidence": 99.2}]
        }
    
        try:
            sqs_client.send_message(
                QueueUrl=SQS_QUEUE_URL,
                MessageBody=json.dumps(analysis_result)
            )
            print("分析结果已发送至SQS队列")
        except Exception as e:
            print(f"发送SQS消息失败:{str(e)}")
    
        return {
            'statusCode': 200,
            'body': json.dumps('分析结果已发送至SQS队列')
        }
    
  3. Flask应用添加SQS消费者
    在Flask应用里启动一个后台线程,不断从SQS拉取消息并处理:

    import boto3
    import json
    from flask import Flask, jsonify
    import threading
    
    app = Flask(__name__)
    sqs_client = boto3.client('sqs', region_name='your-aws-region')
    SQS_QUEUE_URL = "https://sqs.your-aws-region.amazonaws.com/123456789012/your-queue-name"
    
    def process_sqs_messages():
        """后台线程处理SQS消息"""
        while True:
            # 长轮询拉取消息,减少空轮询次数
            response = sqs_client.receive_message(
                QueueUrl=SQS_QUEUE_URL,
                MaxNumberOfMessages=10,
                WaitTimeSeconds=20
            )
            if 'Messages' in response:
                for message in response['Messages']:
                    try:
                        analysis_result = json.loads(message['Body'])
                        # 处理结果:存数据库、触发业务逻辑等
                        print(f"处理SQS消息:{analysis_result}")
                        # 处理完成后删除消息,避免重复处理
                        sqs_client.delete_message(
                            QueueUrl=SQS_QUEUE_URL,
                            ReceiptHandle=message['ReceiptHandle']
                        )
                    except Exception as e:
                        print(f"处理消息失败:{str(e)}")
                        # 如果处理失败,消息会在可见性超时后重新回到队列,可根据情况调整重试策略
    
    # 启动后台消费者线程
    threading.Thread(target=process_sqs_messages, daemon=True).start()
    
    @app.route('/')
    def home():
        return jsonify({"status": "running", "message": "SQS消费者已启动"}), 200
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    

优势

  • 即使Flask应用临时不可用,消息会存在SQS里,不会丢失,等应用恢复后自动处理。
  • 解耦了Lambda和Flask,各自独立扩容,不会因为一方压力大影响另一方。

方案3:用API Gateway做代理(安全+高级功能)

如果你的Flask应用在VPC内不想暴露公网,或者需要做认证、限流、日志监控等高级功能,可以用AWS API Gateway做中间层。

步骤:

  1. 创建API Gateway并集成Flask应用

    • 在AWS控制台创建REST API,选择“VPC链接”(如果Flask在EC2/ECS的VPC内)或者直接集成Lambda(如果Flask是部署在Lambda上的)。
    • 配置API的资源和方法(比如POST方法),设置集成到你的Flask应用端点。
    • 可选:配置API Key认证、IAM认证、限流规则、CloudWatch日志等。
  2. Lambda调用API Gateway端点
    把Lambda里的Flask接口URL换成API Gateway的invoke URL,其他逻辑和方案1类似。

优势

  • 不用暴露Flask应用的公网IP,更安全。
  • 自带限流、认证、监控等功能,不用自己开发。

内容的提问来源于stack exchange,提问作者Subhanan Ganguli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:26