AWS上部署Spring Boot应用的完整指南

在AWS上部署Spring Boot应用的完整指南

摘要:本文将手把手教你如何将Spring Boot应用部署到AWS云平台,涵盖容器化、ECS Fargate部署和负载均衡配置,实现高可用、可扩展的云原生架构。


1. 为什么选择AWS + Spring Boot?

  • Spring Boot优势:快速开发、内嵌服务器、微服务友好
  • AWS优势 :
    • 自动扩缩容(ECS Auto Scaling)
    • 托管容器服务(ECS/EKS)
    • 低成本Serverless选项(Lambda)
    • 全球基础设施(多可用区部署)

2. 架构概览

Spring Boot App Docker Image Amazon ECR ECS Fargate Application Load Balancer Internet


3. 逐步实现

步骤1:创建Spring Boot应用
java 复制代码
@SpringBootApplication
@RestController
public class AwsDemoApp {
    public static void main(String[] args) {
        SpringApplication.run(AwsDemoApp.class, args);
    }

    @GetMapping("/")
    public String hello() {
        return "Hello from AWS ECS!";
    }
}

依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

步骤2:容器化应用(Docker)

Dockerfile:

dockerfile 复制代码
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像:

bash 复制代码
mvn clean package
docker build -t springboot-aws-demo .

步骤3:推送镜像到Amazon ECR
  1. 创建ECR仓库

    bash 复制代码
    aws ecr create-repository --repository-name springboot-demo
  2. 推送镜像

    bash 复制代码
    aws ecr get-login-password | docker login --username AWS --password-stdin ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com
    docker tag springboot-aws-demo:latest ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/springboot-demo:latest
    docker push ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/springboot-demo:latest

步骤4:ECS Fargate部署
  1. 创建任务定义(Task Definition)

    • 任务角色:ecsTaskExecutionRole

    • 容器定义:

      json 复制代码
      "image": "ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/springboot-demo:latest",
      "portMappings": [{ "containerPort": 8080 }]
  2. 创建ECS集群

    bash 复制代码
    aws ecs create-cluster --cluster-name springboot-cluster
  3. 创建Fargate服务

    • 关联应用负载均衡器(ALB)
    • 配置健康检查路径:/actuator/health

步骤5:配置负载均衡与安全组
  • ALB设置 :
    • 监听端口:80 → 转发到目标组(Target Group)
    • 健康检查:HTTP:8080/actuator/health
  • 安全组规则 :
    • 入站规则:允许80(ALB)、8080(仅ALB访问)

步骤6:测试与验证
  1. 获取ALB DNS名称:

    bash 复制代码
    aws elbv2 describe-load-balancers --names springboot-alb
  2. 访问端点:

    bash 复制代码
    curl http://springboot-alb-123456.us-east-1.elb.amazonaws.com/
    # 输出:Hello from AWS ECS!

4. 高级优化

  1. 自动扩缩容

    bash 复制代码
    aws application-autoscaling register-scalable-target \
      --service-namespace ecs \
      --scalable-dimension ecs:service:DesiredCount \
      --min-capacity 1 --max-capacity 10
  2. 密钥管理

    • 使用AWS Secrets Manager注入数据库密码
  3. 日志与监控

    • CloudWatch容器日志
    • ECS Service Metrics(CPU/Memory)

5. 故障排查技巧

  • 容器启动失败:检查ECS任务日志(CloudWatch → Log Groups)
  • 健康检查异常:确认安全组允许ALB访问8080端口
  • 镜像拉取失败:验证ECR仓库权限策略

6. 成本优化建议

  • 使用Spot Fleet降低Fargate成本达70%
  • 设置CPU自动缩放(例如:CPU > 70%时增加实例)
  • 使用AWS Graviton处理器(ARM架构,性价比提升40%)

提示 :完整代码已上传 GitHub示例仓库


结语

通过AWS托管服务部署Spring Boot,开发者可专注于业务逻辑而非基础设施。结合ECS Fargate的Serverless容器模型,既能享受Kubernetes的灵活性,又无需管理节点,是现代化应用部署的理想选择。

相关推荐
txxzjmzlh3 小时前
SpringBoot 配置⽂件
java·spring boot·spring
Thomas.Sir9 小时前
第13课:MyBatis-Plus整合SpringBoot4.x,分页、条件查询、逻辑删除实战
java·spring boot
rich_Chan.9 小时前
【2026 实操】bl video edit 教程:已拍素材改风格换颜色全流程,含输出规格、角标自查
人工智能·ai·云计算·aigc
小蒜学长14 小时前
编程语言在线学习平台的设计与实现(代码+数据库+LW)
java·spring boot·后端·编程语言在线学习平台·在线编码
Félix25115 小时前
Nacos学习笔记(SpringBoot/SpringCloud)
java·spring boot·spring
lqbzlll15 小时前
Spring Boot 开启虚拟线程后接口反而变慢了?4 个排查方向和对应修法
java·spring boot·后端
loulanyue_16 小时前
从沙箱隔离到统一运营:腾讯云Agent工程全景解密AgentHosting、AgentCFS与TeamAI开源——读2026全球数字生态大会实录
开源·云计算·腾讯云
企业数字化笔记16 小时前
业务单据怎样接入流程中心?启动条件、实例关联与失败回退
java·spring boot·mysql
孤狼GPT16 小时前
ChatGPT、Codex工程实战:Spring Boot的SSE一直在推送,为什么经过Nginx后前端才一次性显示?
spring boot·chatgpt·sse·codex·chatgptplus
孤狼GPT17 小时前
ChatGPT、Codex性能实战:MySQL升级到8.0后,SQL没改,为什么接口P99反而翻倍?
spring boot·chatgpt·sql优化·codex·mysql8.0