☰
AWS CDK Java 实战:用 Maven 构建并部署 Classic Load Balancer 与 Auto Scaling 示例
2026/10/15 5:45:21 网站建设 项目流程

【免费下载链接】aws-cdk-examples

Example projects using the AWS CDK

项目地址:https://gitcode.com/gh_mirrors/aw/aws-cdk-examples
点击查看免费下载

本文以 aws-cdk-examples 仓库中 java/classic-load-balancer 示例为主线,完整讲解如何用 Java 编写 AWS CDK 程序:在一个 VPC 内创建由 Auto Scaling 组托管的 EC2 实例与 Classic Load Balancer(经典负载均衡器),并打通「Maven 编译 → CDK 合成 → 部署到账户」的完整链路。读完本文,你将掌握 Java 版 CDK 应用的入口结构、cdk.json的运行机制,以及cdk ls / synth / deploy / diff四个核心 Toolkit 命令的实战用法。

示例概览:CLB 与 ASG 的组合架构

该示例在仓库的 Java 示例目录 中定位为“Using an AutoScalingGroup with a Classic Load Balancer”,即在共享 VPC 内同时创建两个核心资源:

  • AutoScalingGroup(ASG):承载后端计算能力,使用突发型 micro 规格的 EC2 实例,镜像采用 Amazon Linux AMI;
  • Classic Load Balancer(CLB):面向公网(internet-facing),监听 80 端口,将流量分发到 ASG 中的实例,并通过 80 端口做健康检查。

两者的关系由 CDK 代码显式“挂钩”:负载均衡器把 ASG 作为目标挂载,CDK 会自动为 ASG 与 CLB 建立正确的关联(注册目标、健康检查、安全组放行等)。仓库中该示例被标记为Stable 稳定示例,无需任何额外基础设施前置条件即可构建部署。

整体工程只有 4 个文件,结构非常清晰:

  • cdk.json:CDK Toolkit 的应用入口指令;
  • pom.xml:Maven 构建与依赖管理;
  • ClassicLoadBalancerApp.java:程序入口(App);
  • ClassicLoadBalancerStack.java:基础设施定义(Stack)。

工程骨架:入口类与 cdk.json

入口类 ClassicLoadBalancerApp

Java 版 CDK 应用的入口是一个标准的main方法,代码极简:

package software.amazon.awscdk.examples; import software.amazon.awscdk.App; public class ClassicLoadBalancerApp { public static void main(final String[] args) { App app = new App(); new ClassicLoadBalancerStack(app, "cdk-classic-load-balancer-example"); app.synth(); } }

它做了三件事:

  1. 创建App根构造节点;
  2. 实例化ClassicLoadBalancerStack,并指定该栈的 ID 为cdk-classic-load-balancer-example;
  3. 调用app.synth()触发模板合成,生成 CloudFormation 模板。

cdk.json:告诉 Toolkit 如何执行 Java 程序

原文档特别强调:cdk.json 位于仓库根目录下,其中包含了 CDK Toolkit 执行该程序的方式说明。它的内容只有一行关键配置:

{ "app": "mvn exec:java -Dexec.mainClass=software.amazon.awscdk.examples.ClassicLoadBalancerApp" }

app字段告诉 CDK Toolkit:运行本应用时,执行mvn exec:java并指定主类为software.amazon.awscdk.examples.ClassicLoadBalancerApp。这意味着:

  • 每次执行cdk命令时,Toolkit 都会以 Maven 方式启动 JVM 并运行入口类;
  • 修改 Java 代码后无需手动重新编译,Maven 会在exec:java执行过程中自动重编译(原文档明确说明“Maven will recompile as needed”),随后即可照常使用cdk ls / synth / deploy / diff等 Toolkit 命令。

核心 Stack 源码逐行拆解

ClassicLoadBalancerStack.java 是全部基础设施逻辑所在,按顺序定义了 5 个环节。

1. 创建 VPC

Vpc vpc = new Vpc(this, "VPC");

使用默认配置创建 VPC。默认构造会在该栈所属账户/区域创建一套包含公有与私有子网的标准 VPC(默认最多两个可用区),ASG 与 CLB 都挂载在这套共享 VPC 中。

2. 创建 AutoScalingGroup

AutoScalingGroup asg = AutoScalingGroup.Builder.create(this, "ASG") .vpc(vpc) .instanceType(InstanceType.of(InstanceClass.BURSTABLE2, InstanceSize.MICRO)) .machineImage(new AmazonLinuxImage()) .build();
  • .vpc(vpc):将 ASG 放入上一步创建的 VPC;
  • .instanceType(...):指定实例类型为突发型系列(BURSTABLE2)的MICRO规格,即 t2.micro,属于低成本入门规格;
  • .machineImage(new AmazonLinuxImage()):使用 Amazon Linux 的当前可用 AMI 作为机器镜像。

注意:这里没有显式设置desiredCapacity等容量参数,CDK 会按 ASG 默认行为创建实例(默认 desired 为 1,min 为 1)。

3. 创建 Classic Load Balancer

HealthCheck healthCheck = new HealthCheck.Builder().port(80).build(); LoadBalancer lb = LoadBalancer.Builder.create(this, "LB") .vpc(vpc) .internetFacing(Boolean.TRUE) .healthCheck(healthCheck) .build();
  • .internetFacing(Boolean.TRUE):声明为公网面向型负载均衡器,CDK 会为其分配公网 DNS 名称并放置在公有子网;
  • .healthCheck(...):基于 80 端口的 TCP 健康检查,用于判定后端实例是否存活;
  • 这里创建的LoadBalancer来自software.amazon.awscdk.services.elasticloadbalancing模块,即Classic Load Balancer(经典负载均衡器),区别于 v2 的elasticloadbalancingv2(ALB/NLB)。

4. 挂载目标与开放监听器

lb.addTarget(asg); ListenerPort listenerPort = lb.addListener(LoadBalancerListener.builder().externalPort(80).build()); listenerPort.getConnections().allowDefaultPortFromAnyIpv4("Open to the world");
  • lb.addTarget(asg):把 ASG 整体注册为负载均衡的目标。CDK 会自动在 CLB 与 ASG 之间建立注册关系,并配置好实例健康检查与自动扩缩容所需的联动;
  • lb.addListener(...):为负载均衡器添加外部端口为 80 的监听器,返回对应的ListenerPort对象;
  • listenerPort.getConnections().allowDefaultPortFromAnyIpv4("Open to the world"):以一句描述性的说明(Open to the world)允许任意 IPv4 访问该监听器的默认端口(80),等价于在安全组上放行 80 端口入站流量。

至此,一套「互联网用户 → CLB:80 → ASG 中的 Amazon Linux 实例」的完整链路即定义完毕。

构建:mvn compile 与依赖管理

原文档的Building章节给出了本示例的构建方式:在示例目录下执行mvn compile,Maven 会下载编译 Java 代码所需的全部依赖。

pom.xml 中的关键配置如下:

  • CDK 核心依赖:software.amazon.awscdk:aws-cdk-lib,版本范围声明为[2.262.0,3.0.0),即允许 2.262.0 及以上、小于 3.0.0 的 2.x 版本;同时依赖software.constructs:constructs([10.5.0,11.0.0));
  • 编译插件:maven-compiler-plugin3.8.1,source与target均设为1.8(Java 8);
  • 打包插件:maven-assembly-plugin3.1.0,绑定到package阶段生成jar-with-dependencies可执行胖包;
  • 测试依赖:junit4.13.1 与hamcrest-library1.3,scope 为test。

一个值得注意的细节:pom.xml 的 assembly 插件 manifest 中mainClass写的是com.amazonaws.cdk.examples.ClassicLoadBalancerApp,而实际类位于software.amazon.awscdk.examples包下(源码与 cdk.json 均如此)。也就是说,实际运行时以 cdk.json 中mvn exec:java -Dexec.mainClass=...的配置为准,打包 manifest 中的这一差异并不影响 CDK 工作流。

CDK Toolkit 工作流

原文档CDK Toolkit章节指出:你可以用 IDE 编写代码和单元测试,但合成(synthesize)与部署(deploy)栈必须通过 CDK Toolkit 完成。在示例根目录下依次执行:

$ cdk ls <list all stacks in this program>

cdk ls列出当前程序中定义的所有栈,本例应输出cdk-classic-load-balancer-example。

$ cdk synth <cloudformation template>

cdk synth执行app.synth()的等价流程,把 Java 代码合成 CloudFormation 模板并输出到cdk.out目录,可用于部署前人工审查将要创建的资源。

$ cdk deploy <deploy stack to your account>

cdk deploy将栈部署到当前 AWS 账户/区域(需提前完成 AWS 凭证配置与bootstrap)。由于该栈是 Stable 示例,无额外前置依赖,可直接部署。

$ cdk diff <diff against deployed stack>

cdk diff对比已部署栈与当前代码,展示将要发生的变更,是迭代开发与代码评审阶段的常用命令。

此外,部署完毕后如需清理资源,可执行:

$ cdk destroy

销毁该栈创建的全部 AWS 资源,避免持续产生费用。

部署与验证

  1. 在示例目录执行mvn compile确认代码可编译(或直接执行cdk deploy,Maven 会自动重编译);
  2. 执行cdk deploy,等待 CloudFormation 创建 VPC、ASG、CLB 及其安全组;
  3. 由于该示例未定义CfnOutput输出,部署完成后可从 AWS 管理控制台的EC2 → Load Balancers页面查看 Classic Load Balancer 的公网 DNS 名称;
  4. 使用浏览器或curl http://<CLB-DNS>访问 80 端口,流量经 CLB 分发到 ASG 内的 Amazon Linux 实例;
  5. 验证完成后执行cdk destroy清理全部资源。

小结

通过这个 Java 示例,可以掌握一套可复用的 CDK Java 开发范式:App入口 +Stack定义 +cdk.json的mvn exec:java入口 +cdk命令行工作流。核心代码仅约 30 行,却完整刻画了「VPC 内的 ASG 后端 + 公网 Classic Load Balancer + 80 端口监听 + 健康检查 + 全网放行」这一经典架构。在此基础上,替换实例规格、调整监听端口、补充CfnOutput输出,即可快速扩展到生产场景。仓库中的 Go 版本、Python 版本、TypeScript 版本 与 C# 版本 提供了同一架构的多语言对照实现,可作为跨语言学习的参考。

【免费下载链接】aws-cdk-examples

Example projects using the AWS CDK

项目地址:https://gitcode.com/gh_mirrors/aw/aws-cdk-examples
点击查看免费下载
上一篇:飞牛影视PC版(fntv-electron):5分钟快速上手的终极桌面影视体验指南
下一篇:StofDoctrineExtensionsBundle的Sluggable扩展:创建SEO友好URL的简单方法

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询