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会显示将要创建的资源:

plumi up s3

⚠️ 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
    """;

该脚本会:

  1. 更新系统
  2. 安装Apache HTTP服务器
  3. 启动Web服务
  4. 创建基础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:

pulumi up ec2

4.5. 验证Web服务器部署

EC2实例启动后,需等待几分钟完成初始化(Web服务启动需要时间)。验证部署最简单的方法是在浏览器访问实例公网IP:

test

命令行验证可使用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)管理云资源。


原始标题:Introduction to Pulumi With Java | Baeldung