Pulumi 使用 Java 的簡介
1. 簡介
Pulumi是一種現代基礎設施即程式碼 (IaC) 工具,可讓開發人員使用 Java 等通用程式語言定義和管理雲端資源。與使用領域特定語言 (DSL) 的傳統 IaC 工具不同,Pulumi 利用 Java 的強大功能來創建可重複使用、模組化且類型安全的基礎架構程式碼。
在本文中,我們將使用 Pulumi 和 Java 來建立和管理 AWS 資源,包括 S3 儲存桶、EC2 執行個體和安全群組。我們也將把 EC2 執行個體公開到互聯網,更新基礎設施並銷毀所有資源。
2.使用 Java 設定 Pulumi
在開始之前,我們必須確保已經安裝了 Pulumi CLI。我們可以從官方網站安裝它。
安裝完成後,我們可以使用AWS Java模板建立新的Pulumi專案:
$ pulumi new aws-java
這將產生一個基本的專案結構。之後,我們導航到專案目錄並安裝依賴項:
$ cd my-pulumi-project
$ mvn install
現在我們已經準備好所有結構,可以開始寫程式了。
3.建立簡單的 AWS 資源
在本節中,我們將了解如何在 AWS 中建立簡單的獨立資源。之後,我們將探索如何建立稍微複雜的架構來在網路上公開 Web 服務。
Amazon S3(簡單儲存服務)是 AWS 提供的高度可擴充的物件儲存解決方案,廣泛用於儲存檔案、備份和媒體。這樣,我們可以以直接而又有影響力的方式來展示 Pulumi 的功能。使用 Pulumi,定義 S3 儲存桶就像聲明儲存桶資源一樣簡單:
var bucket = new Bucket("pulumi-bucket", BucketArgs.builder()
.build());
一旦我們在 Pulumi 中定義了 S3 儲存桶,我們就可以將其部署到 AWS。 Pulumi 提供了一個簡單的命令來執行此操作:
$ pulumi up
執行pulumi up
時,Pulumi 顯示將建立的資源:
Pulumi 分析程式碼並顯示將建立、修改或刪除哪些資源。此外,它要求確認,以便我們可以在繼續之前檢查計劃的變更。
4.創建Web伺服器
現在我們已經從 S3 儲存桶開始,讓我們更進一步,建立 Web 服務所需的基礎架構。要部署用於處理 Web 請求的 EC2 實例,我們必須設定虛擬私有雲 (VPC)、子網路、Internet 閘道和其他必要的網路元件。
4.1.創建網路基礎設施
VPC(虛擬私有雲)是 AWS 內的隔離網絡,我們可以在其中啟動 EC2 執行個體、資料庫和其他服務等資源。它允許我們定義 IP 位址範圍、建立子網路並配置路由規則來控制資源的通訊方式。
讓我們建立一個 CIDR 區塊為10.0.0.0/16
的 VPC,這意味著它可以容納許多 IP 位址:
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)。此 AWS 管理的服務將我們的 VPC 連接到公共網際網路:
var gateway = new InternetGateway("gateway", InternetGatewayArgs.builder()
.vpcId(vpc.id())
.build());
即使有了互聯網網關,子網路內的實例也不會自動知道如何存取互聯網。我們需要設定一個路由表,它就像一個交通控制系統,定義網路流量的流動方式。我們設定了一條預設路由( 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());
另外,我們將路由表連結到公用子網,以便其中的 EC2 執行個體可以使用 Internet 網關。
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());
我們將規則附加到我們先前建立的安全性群組,並允許所有流量到連接埠80
(用於 HTTP Web 流量)。我們還必須添加一條出站規則,以讓我們的服務存取互聯網:
var allowAllTrafficIpv4 = new SecurityGroupEgressRule("allowAllTrafficEgress", SecurityGroupEgressRuleArgs.builder()
.securityGroupId(securityGroup.id())
.cidrIpv4("0.0.0.0/0")
.ipProtocol("-1")
.build());
這確保我們的 EC2 執行個體可以在設定期間下載更新並安裝依賴項
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 頁面
這確保了當 EC2 執行個體啟動時,它會立即提供網頁服務,無需任何手動設定。
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) // Add user data to the instance
.build());
實例類型設定為t2.micro
,小型且經濟高效的選項。此外,此實例類型是 AWS 免費套餐的一部分。使用的 Amazon Machine Image (AMI) 是 Amazon Linux 2,這是一個輕量級且針對 AWS 最佳化的作業系統。由於該執行個體需要公開訪問,因此為其指派了一個公用 IP 位址。這使得它可以從互聯網訪問,從而允許我們稍後測試網路伺服器。
我們可以在控制台中列印指派給我們的 EC2 執行個體的公用 IP 位址:
ctx.export("publicIp", instance.publicIp());
這樣,我們無需手動檢查 AWS 控制台即可擷取執行個體的公用 IP。執行pulumi up
後,指令輸出中將顯示公網IP:
4.5.驗證 Web 伺服器部署
一旦 EC2 執行個體啟動,我們就可以驗證 Web 伺服器是否可以存取。不過,在測試之前,我們應該等待幾分鐘讓實例完成初始化。特別是,Web 伺服器可能需要一些時間才能啟動,特別是在更新和套件安裝仍在進行中的情況下。驗證部署的最簡單方法是將執行個體的公用 IP 輸入 Web 瀏覽器:
現在我們可以看到來自用戶資料腳本的訊息。
為了從命令列進行快速驗證,我們可以使用curl
向實例發送 HTTP 請求:
$ curl http://3.69.254.86/
5. 破壞基礎設施
測試我們的 Web 伺服器後,我們應該刪除已部署的資源以避免不必要的 AWS 成本。像 EC2 執行個體這樣的雲端資源只要存在,即使沒有被積極使用,也會產生費用。
Pulumi 只需一個命令就可以輕鬆拆除基礎設施:
$ pulumi destroy
此命令將:
- 終止 EC2 實例
- 刪除安全群組、VPC、子網路和路由表
- 刪除 S3 儲存桶(請注意,如果儲存桶包含文件,我們必須先手動清空該儲存桶)
Pulumi 在繼續刪除之前會提示確認。確認後,它會依序刪除所有先前建立的資源。
6. 結論
在本教學中,我們示範如何使用 Pulumi 建立和管理 AWS 基礎設施,包括 S3 儲存桶、VPC、EC2 執行個體以及安全群組和路由表等相關資源。接下來,我們分解程式碼的每個部分,以了解 Pulumi 如何使用 Java 等熟悉的程式語言簡化雲端基礎架構的配置。
透過運行pulumi up
,我們看到了部署資源是多麼容易,而使用pulumi destroy
,我們可以清理這些資源,避免在 AWS 中產生任何不必要的成本。無論我們使用 S3 配置簡單儲存還是使用更複雜的網路和運算資源(如 EC2 執行個體),Pulumi 都提供了一種靈活且強大的方式以程式設計方式管理雲端基礎架構。
本文的所有範例都可以在 GitHub 上找到。