【免费下载链接】aws-cdk-examples
Example projects using the AWS CDK
本文以 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(); } }它做了三件事:
- 创建
App根构造节点; - 实例化
ClassicLoadBalancerStack,并指定该栈的 ID 为cdk-classic-load-balancer-example; - 调用
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 资源,避免持续产生费用。
部署与验证
- 在示例目录执行
mvn compile确认代码可编译(或直接执行cdk deploy,Maven 会自动重编译); - 执行
cdk deploy,等待 CloudFormation 创建 VPC、ASG、CLB 及其安全组; - 由于该示例未定义
CfnOutput输出,部署完成后可从 AWS 管理控制台的EC2 → Load Balancers页面查看 Classic Load Balancer 的公网 DNS 名称; - 使用浏览器或
curl http://<CLB-DNS>访问 80 端口,流量经 CLB 分发到 ASG 内的 Amazon Linux 实例; - 验证完成后执行
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
相关推荐
使用 AWS CDK(C/.NET)构建 Classic Load Balancer 与 Auto Scaling Group 集成示例
使用 AWS CDK(C /.NET)构建 Classic Load Balancer 与 Auto Scaling Group 集成示例 本篇技术指南以 aw
使用 AWS CDK 构建 Classic Load Balancer 与 Auto Scaling Group 负载均衡示例(TypeScript)
使用 AWS CDK 构建 Classic Load Balancer 与 Auto Scaling Group 负载均衡示例(TypeScript) 导读 本
aws-cdk-examples 实战:使用 Java 与 AWS CDK 构建 Application Load Balancer + Auto Scaling Group 高可用架构
aws cdk examples 实战:使用 Java 与 AWS CDK 构建 Application Load Balancer + Auto Scalin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考