在AWS Elastic Beanstalk中使用Traefik生成SSL证书报错求助
AWS Elastic Beanstalk + Traefik 环境健康异常排查与修复
排查步骤按优先级排序
1. 确认EC2安全组端口配置
- 登录AWS控制台,找到Beanstalk环境对应的EC2实例,查看绑定的安全组
- 入站规则必须包含:
- HTTP(80端口):允许所有来源(0.0.0.0/0)或Beanstalk健康检查IP段
- HTTPS(443端口):允许所有来源(0.0.0.0/0)
- (调试用)8080端口:仅允许你的公网IP访问(方便查看Traefik Dashboard)
2. 修正Elastic Beanstalk健康检查规则
Beanstalk默认的健康检查会访问实例的80端口根路径,但现在Traefik接管了80端口,需要确保健康检查能正确触达后端服务:
- 进入Beanstalk控制台,打开环境的配置 > 实例(单实例环境)或负载均衡器(负载均衡环境)
- 调整健康检查的路径为你的后端服务健康校验端点(比如
/health),端口保持80 - 保存配置后等待环境更新,观察健康状态是否恢复
3. 查看容器日志定位错误
Beanstalk提供了日志收集功能,直接拉取日志分析:
- 在Beanstalk控制台,进入日志 > 请求日志,选择"下载完整日志"或"实时查看"
- 重点排查:
- Traefik日志:检查是否有ACME证书生成失败(如挑战请求未到达、端口被拦截)、Docker socket访问权限问题
- Backend日志:确认服务是否正常启动、端口是否监听8080
- 文件权限:
acme.json需要Traefik拥有读写权限,若权限不足,可在.platform/hooks/prebuild目录添加脚本设置权限:#!/bin/bash mkdir -p letsencrypt chmod 600 letsencrypt/acme.json || true
4. 优化Docker Compose配置适配Beanstalk
你的现有配置存在几个Beanstalk环境下的问题,调整如下:
- 持久化存储:Beanstalk的临时存储会在部署后重置,
./letsencrypt卷会丢失acme.json,建议绑定EFS目录(需先在Beanstalk配置中关联EFS) - 健康检查:给Traefik和Backend添加健康检查标签,确保Beanstalk能识别服务状态
- API安全:生产环境关闭
--api.insecure=true,避免暴露Traefik Dashboard
调整后的配置示例:
version: "3.8" services: backend: image: "mypersonalrepo/image:tag" restart: "always" labels: - "traefik.enable=true" - "traefik.http.routers.backend.rule=Host(`my.53.route.net`)" - "traefik.http.routers.backend.entrypoints=websecure" - "traefik.http.routers.backend.tls.certresolver=myresolver" - "traefik.http.services.backend.loadbalancer.server.port=8080" - "traefik.http.services.backend.loadbalancer.healthcheck.path=/health" - "traefik.http.services.backend.loadbalancer.healthcheck.interval=10s" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 traefik: image: "traefik:v2.9" container_name: "traefik" command: - "--log.level=INFO" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.httpchallenge=true" - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web" - "--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory" - "--certificatesresolvers.myresolver.acme.email=myemail@gmail.com" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" - "--entrypoints.web.http.redirections.entryPoint.to=websecure" - "--entrypoints.web.http.redirections.entryPoint.scheme=https" ports: - "80:80" - "443:443" volumes: - "/efs/letsencrypt:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro" healthcheck: test: ["CMD", "traefik", "healthcheck"] interval: 30s timeout: 10s retries: 3
5. 验证ACME挑战可用性
Let's Encrypt的HTTP挑战需要公网能访问http://your-domain/.well-known/acme-challenge/路径:
- 用curl测试:
curl http://my.53.route.net/.well-known/acme-challenge/test - 如果返回404以外的错误(如连接超时),说明80端口流量未到达Traefik,重新检查安全组和Beanstalk的端口转发规则
内容的提问来源于stack exchange,提问作者Nuno Aparício
相关产品推荐
相关产品推荐

