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

AWS App Runner与EC2实例通信失败问题求助

问题:AWS App Runner上的Django应用与EC2后端通信失败(500错误)

我将Django应用部署在AWS App Runner服务器,Python后端进程部署在EC2实例,需要实现两者通信:用户与Django应用交互时,调用EC2后端处理信息并返回结果。本地运行Django时通信正常,但部署到App Runner后出现500内部服务器错误。移除requests库后App Runner上的Django可正常运行,已尝试用flask_cors解决跨域问题但无效。


Django应用代码(ecconsult函数)

from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import requests

def home(request):
    return render(request, 'index.html')


def ecconsult(request):
    data_to_send = "communication test"
    response = requests.post('http://specific_host:specific_port/api/procesar', json=data_to_send)

    if response.status_code == 200:
        jsondatabe = response.text
        response_data = {'jsondatabe': jsondatabe}

    else:
        print('Error al procesar la call del backend')

    return render(request, 'index.html', response_data)

EC2后端服务器代码

from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)

CORS(app, resources={r"/api/*": {"origins": "Django_app_domain"}})

@app.route('/')
def hello():
    print("accesing from outside")
    return 'Hello backend!'

@app.route('/api/procesar', methods=['POST'])
def procesar_datos():
    data = request.get_json()
    print(data)

    response = "connection successful"
    print("Returning data to webapp")
    return response

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=specific_port)

错误信息

Failed to load resource: the server responded with a status of 500 (Internal Server Error)


解决方案建议

1. 确认requests库在App Runner环境正确安装

  • 检查Django项目的requirements.txt是否包含requests,必要时指定具体版本(如requests>=2.31.0),确保App Runner部署时能成功安装依赖。
  • 查看App Runner的部署日志,搜索requests相关记录,确认安装过程无报错。

2. 排查App Runner到EC2的网络连通性

  • 检查EC2安全组入站规则,是否允许App Runner的IP段访问specific_port。可临时开放该端口允许所有IP访问(仅测试用),验证是否为网络权限问题。
  • 若EC2在私有子网,需为App Runner配置VPC连接权限,使其能访问私有子网内的资源。
  • 在Django视图中添加异常捕获,打印详细网络错误日志:
    def ecconsult(request):
        data_to_send = "communication test"
        response_data = {}
        try:
            response = requests.post('http://specific_host:specific_port/api/procesar', json=data_to_send, timeout=10)
            response.raise_for_status()
            jsondatabe = response.text
            response_data = {'jsondatabe': jsondatabe}
        except requests.exceptions.RequestException as e:
            print(f'Request error details: {str(e)}')
        return render(request, 'index.html', response_data)
    
    通过App Runner的应用日志,获取具体错误原因(如连接超时、DNS解析失败、端口拒绝等)。

3. 优化EC2后端的请求处理逻辑

  • 将EC2后端的返回格式改为JSON,避免潜在的解析问题:
    @app.route('/api/procesar', methods=['POST'])
    def procesar_datos():
        data = request.get_json()
        print(data)
        response = {"message": "connection successful"}
        print("Returning data to webapp")
        return jsonify(response)
    
  • 验证CORS配置中的Django_app_domain是否正确,需填写App Runner分配给Django应用的完整域名(如https://xxx.awsapprunner.com),测试阶段可临时设为*(生产环境禁用)。

4. 修复Django视图的异常处理

  • 初始化response_data为空字典,避免请求失败时因变量未定义导致模板渲染出错:
    def ecconsult(request):
        data_to_send = "communication test"
        response_data = {}
        response = requests.post('http://specific_host:specific_port/api/procesar', json=data_to_send)
    
        if response.status_code == 200:
            jsondatabe = response.text
            response_data = {'jsondatabe': jsondatabe}
        else:
            print('Error al procesar la call del backend')
            response_data['error'] = 'Backend request failed'
    
        return render(request, 'index.html', response_data)
    

内容的提问来源于stack exchange,提问作者Albert Badias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:17:42