自动化基础设施配置:Terraform与Pulumi实战
立即解锁
发布时间: 2025-08-26 01:53:05 阅读量: 13 订阅数: 29 AIGC 


Python for DevOps: Mastering Automation and Cloud Computing
# 自动化基础设施配置:Terraform 与 Pulumi 实战
## 1. 引言
在当今的云计算环境中,自动化基础设施配置(Infrastructure as Code,简称 IaC)变得越来越重要。它可以提高效率、减少人为错误,并确保环境的一致性。本文将介绍两种流行的 IaC 工具:Terraform 和 Pulumi,并通过部署一个静态网站的实例,展示它们在实际场景中的应用。
## 2. 相关工具概述
### 2.1 支持多云的工具
Terraform 和 Pulumi 都支持多个云服务提供商,具有广泛的适用性。而 AWS CDK 则主要针对 AWS 云服务。
### 2.2 Python 相关工具
- **Troposphere**:允许使用 Python 代码指定 CloudFormation 堆栈模板,然后将其导出为 JSON 或 YAML 格式,但它仅负责模板生成,需要使用 CloudFormation 来配置堆栈。
- **Stacker**:底层使用 Troposphere,不仅能生成 CloudFormation 堆栈模板,还能进行堆栈的配置。
## 3. 手动配置基础设施
为了更好地理解自动化配置的优势,我们首先手动完成静态网站的部署。具体步骤如下:
1. **域名和托管区域设置**:使用已在 Namecheap 购买的域名 `devops4all.dev`,在 Amazon Route 53 中创建托管区域,并将 Namecheap 中的域名服务器指向 AWS DNS 服务器。
2. **S3 存储桶配置**:创建两个 S3 存储桶,分别用于根 URL(`devops4all.dev`)和 `www` URL(`www.devops4all.dev`),并配置存储桶以支持静态网站托管,设置适当的权限。上传 `index.html` 文件和 JPG 图像到根存储桶。
3. **SSL 证书配置**:在 `us - east - 1` 区域使用 AWS Certificate Manager(ACM)服务为根域名和所有子域名(`*.devops4all.dev`)配置 SSL 证书,通过在 Route 53 托管区域添加 DNS 记录进行验证。
4. **CloudFront 分发配置**:创建一个指向根 S3 存储桶的 AWS CloudFront CDN 分发,并使用上一步配置的 ACM 证书,将 HTTP 请求重定向到 HTTPS。
5. **Route 53 记录配置**:在 CloudFront 分发部署完成后(约 15 分钟),为根域名和 `www` 域名添加 Route 53 A 类型的别名记录,指向 CloudFront 分发端点的 DNS 名称。
整个手动配置过程大约需要 45 分钟(包括 15 分钟的 CloudFront 分发传播时间)。
## 4. 使用 Terraform 自动化配置基础设施
### 4.1 Terraform 简介
Terraform 是一个成熟的 IaC 工具,具有强大的生态系统和多云配置能力。推荐使用模块来编写 Terraform 代码,HashiCorp 提供了一个公共的 Terraform 模块注册表,方便我们查找和使用现成的模块。在本示例中,我们将编写自己的模块。使用的 Terraform 版本为 0.12.1,在 Mac 上可以使用 `brew` 进行安装:
```bash
$ brew install terraform
```
### 4.2 配置 S3 存储桶
创建一个 `modules` 目录,在其下创建 `s3` 目录,包含三个文件:`main.tf`、`variables.tf` 和 `outputs.tf`。
- `main.tf`:
```hcl
resource "aws_s3_bucket" "www" {
bucket = "www.${var.domain_name}"
acl = "public - read"
policy = <<POLICY
{
"Version":"2012 - 10 - 17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::www.${var.domain_name}/*"]
}
]
}
POLICY
website {
index_document = "index.html"
}
}
```
- `variables.tf`:
```hcl
variable "domain_name" {}
```
- `outputs.tf`:
```hcl
output "s3_www_website_endpoint" {
value = "${aws_s3_bucket.www.website_endpoint}"
}
```
主 Terraform 脚本 `main.tf` 如下:
```hcl
provider "aws" {
region = "${var.aws_region}"
}
module "s3" {
source = "./modules/s3"
domain_name = "${var.domain_name}"
}
```
变量定义在 `variables.tf` 中:
```hcl
variable "aws_region" {
default = "us - east - 1"
}
variable "domain_name" {
default = "devops4all.dev"
}
```
当前目录结构如下:
```
|____main.tf
|____variables.tf
|____modules
| |____s3
| | |____outputs.tf
| | |____main.tf
| | |____variables.tf
```
运行 Terraform 的步骤如下:
1. 初始化:
```bash
$ terraform init
```
2. 生成执行计划:
```bash
$ terraform plan
```
3. 应用计划:
```bash
$ terraform apply
```
### 4.3 配置 SSL 证书
创建 `modules/acm` 目录,包含 `main.tf`、`variables.tf` 和 `outputs.tf` 文件。
- `main.tf`:
```hcl
resource "aws_acm_certificate" "certificate" {
domain_name = "*.${var.domain_name}"
validation_method = "DNS"
subject_alternative_names = ["*.${var.domain_name}"]
}
```
- `variables.tf`:
```hcl
variable "domain_name" {
}
```
- `outputs.tf`:
```hcl
output "certificate_arn" {
value = "${aws_acm_certificate.certificate.arn}"
}
```
在 `main.tf` 中添加对 `acm` 模块的引用:
```hcl
provider "aws" {
region = "${var.aws_region}"
}
module "s3" {
source = "./modules/s3"
domain_name = "${var.domain_name}"
}
module "acm" {
source = "./modules/acm"
domain_name = "${var.domain_na
```
0
0
复制全文
相关推荐










