2. 设置Pulumi Java环境
首先确保已安装Pulumi CLI,可通过官网安装。然后使用AWS Java模板创建新项目:
$ pulumi new aws-java
这会生成基础项目结构。进入项目目录并安装依赖:
$ cd my-pulumi-project
$ mvn install
✅ 现在所有准备就绪,可以开始编写代码了
3. 创建简单AWS资源
本节介绍如何在AWS中创建独立资源。我们将从S3存储桶开始,后续构建更复杂的Web服务架构。
Amazon S3是AWS的弹性对象存储服务,广泛用于文件、备份和媒体存储。使用Pulumi定义S3存储桶非常简单:
var bucket = new Bucket("pulumi-bucket", BucketArgs.builder()
.build());
部署到AWS只需执行:
$ pulumi up
运行pulumi up
时,Pulumi会显示将要创建的资源:
⚠️ Pulumi会分析代码并展示资源变更计划,包括创建、修改或删除的资源,执行前需要确认操作。
4. 创建Web服务器
在创建S3存储桶的基础上,我们进一步构建Web服务所需的基础设施。要部署可处理Web请求的EC2实例,需要配置VPC、子网、互联网网关等网络组件。
4.1. 创建网络基础设施
VPC是AWS中的隔离网络环境,用于部署EC2实例、数据库等资源。它支持定义IP地址范围、创建子网和配置路由规则。
创建CIDR块为10.0.0.0/16
的VPC:
var vpc = new Vpc("vpc", VpcArgs.builder()
.cidrBlock("10.0.0.0/16")
.build());
子网是VPC的细分网络段。为使EC2实例可公开访问,需创建自动分配公网IP的公共子网:
var subnet = new Subnet("subnet", SubnetArgs.builder()
.vpcId(vpc.id())
.cidrBlock("10.0.1.0/24")
.mapPublicIpOnLaunch(true)
.build());
默认情况下VPC内资源无法访问互联网。需要创建互联网网关(IGW)连接VPC和公网:
var gateway = new InternetGateway("gateway", InternetGatewayArgs.builder()
.vpcId(vpc.id())
.build());
即使有IGW,子网内的实例仍需路由表才能访问互联网。配置默认路由(0.0.0.0/0
)将所有出站流量导向网关:
var routes = new RouteTable("routes", RouteTableArgs.builder()
.vpcId(vpc.id())
.routes(RouteTableRouteArgs.builder()
.cidrBlock("0.0.0.0/0")
.gatewayId(gateway.id())
.build())
.build());
var routeTableAssociation = new RouteTableAssociation("route-table-association", RouteTableAssociationArgs.builder()
.subnetId(subnet.id())
.routeTableId(routes.id())
.build());
4.2. 安全组:流量控制
安全组是控制EC2实例网络流量的虚拟防火墙。首先创建与VPC关联的安全组:
var securityGroup = new SecurityGroup("security-group", SecurityGroupArgs.builder()
.name("allow_public")
.vpcId(vpc.id())
.build());
此时安全组尚无规则。AWS安全组默认拒绝所有流量,需显式定义规则。为允许HTTP访问,添加入站规则:
var allowPort80Ipv4 = new SecurityGroupIngressRule("allowPort80Ingress", SecurityGroupIngressRuleArgs.builder()
.securityGroupId(securityGroup.id())
.cidrIpv4("0.0.0.0/0")
.fromPort(80)
.ipProtocol("tcp")
.toPort(80)
.build());
还需添加出站规则使服务能访问互联网:
var allowAllTrafficIpv4 = new SecurityGroupEgressRule("allowAllTrafficEgress", SecurityGroupEgressRuleArgs.builder()
.securityGroupId(securityGroup.id())
.cidrIpv4("0.0.0.0/0")
.ipProtocol("-1")
.build());
4.3. 用户数据:自动化服务器配置
启动EC2实例时可传递用户数据脚本自动执行:
String userData = """
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello World, welcome to our Pulumi deployed infrastructure.</h1>" > /var/www/html/index.html
""";
该脚本会:
- 更新系统
- 安装Apache HTTP服务器
- 启动Web服务
- 创建基础HTML页面
4.4. 启动EC2实例
配置好安全和自动化后,定义并部署EC2实例:
var instance = new Instance("my-instance", InstanceArgs.builder()
.instanceType(InstanceType.T2_Micro)
.ami("ami-0e320147c22e46f12")
.subnetId(subnet.id())
.vpcSecurityGroupIds(Output.all(securityGroup.id()))
.associatePublicIpAddress(true)
.userData(userData)
.build());
实例类型选择t2.micro
(符合免费套餐条件),使用Amazon Linux 2 AMI。分配公网IP使其可从互联网访问。
导出实例公网IP地址:
ctx.export("publicIp", instance.publicIp());
执行pulumi up
后,命令输出会显示公网IP:
4.5. 验证Web服务器部署
EC2实例启动后,需等待几分钟完成初始化(Web服务启动需要时间)。验证部署最简单的方法是在浏览器访问实例公网IP:
命令行验证可使用curl
:
$ curl http://3.69.254.86/
5. 销毁基础设施
测试完成后应销毁资源避免产生AWS费用。云资源(如EC2实例)只要存在就会持续计费。
Pulumi提供一键销毁命令:
$ pulumi destroy
该命令会:
- 终止EC2实例
- 删除安全组、VPC、子网和路由表
- 删除S3存储桶(若含文件需先手动清空)
销毁前Pulumi会要求确认,确认后将按顺序移除所有资源。
6. 总结
本教程演示了如何使用Pulumi管理AWS基础设施,包括:
- S3存储桶
- VPC网络
- EC2实例及相关资源(安全组、路由表等)
通过pulumi up
轻松部署资源,pulumi destroy
快速清理资源避免费用。无论是简单的S3存储还是复杂的EC2网络架构,Pulumi都提供了灵活强大的基础设施管理方式,让开发者能用熟悉的编程语言(如Java)管理云资源。