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的灵活性,又无需管理节点,是现代化应用部署的理想选择。

相关推荐
陈果然DeepVersion18 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十二)
java·spring boot·ai·kafka·面试题·向量数据库·rag
陈果然DeepVersion18 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(九)
java·人工智能·spring boot·微服务·kafka·面试题·rag
爆爆凯19 小时前
Spring Boot Web上下文工具类详解:获取Request、Response和参数
前端·spring boot·后端
深耕AI19 小时前
【端口的核心区别】阿里云安全组:80、443和16251
安全·阿里云·云计算
行思理19 小时前
Lombok 新手教程
java·spring boot·lombok
观望过往19 小时前
Spring Boot 集成 InfluxDB 2.x 完整技术指南
java·spring boot·influxdb
The star"'19 小时前
云计算概述
云计算
摇滚侠1 天前
Spring Boot3零基础教程,Spring Boot 应用打包成 exe 可执行文件,笔记91 笔记92 笔记93
linux·spring boot·笔记
lang201509281 天前
Spring Boot日志配置完全指南
java·spring boot·单元测试
故事不长丨1 天前
【Java SpringBoot+Vue 实现视频文件上传与存储】
java·javascript·spring boot·vscode·后端·vue·intellij-idea