Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云作为第三大云服务提供商,terraform-alicloud-provider 已经支持了超过 90 多个 Resource 和 Data Source,覆盖20多个服务和产品,吸引了越来越多的开发者加入到阿里云Terraform生态的建设中。
HashiCorp Terraform 是一个IT基础架构自动化编排工具,可以用代码来管理维护 IT 资源。Terraform的命令行接口 (CLI) 提供一种简单机制,用于将配置文件部署到阿里云或其他任意支持的云上,并对其进行版本控制。它编写了描述云资源拓扑的配置文件中的基础结构,例如虚拟机、存储帐户和网络接口。Terraform 的命令行接口(CLI)提供一种简单机制,用于将配置文件部署到阿里云或任何其他支持的云并对其进行版本控制。
Terraform是一个高度可扩展的工具,通过 Provider 来支持新的基础架构。您可以使用Terraform来创建、修改、删除ECS、VPC、RDS、SLB等多种资源。
目前阿里云已经将OSS的module发布到了GitHub上。目前OSS提供的主要功能有Bucket管理,以及日常的文件对象管理。例如:
1.创建Bucket
2.设置Bucket ACL
3.设置Bucket CORS
4.设置Bucket Logging
5.设置Bucket 静态网站托管
6.设置Bucket Referer
7.设置Bucket Lifecycle
1.文件上传
2.设置文件服务端加密方式
3.设置ACL
4.设置对象元数据信息
1.OSS Module在GitHub上下载地址:GitHub下载地址
2.OSS Terraform Module介绍:Module介绍
接下来我们就从简单的示例 开始了解,Terraform是如何管理Bucket和文件对象。
在使用Terraform的简单模板语言定义、预览和部署云基础结构前,您需要安装预配置Terraform。
【安装步骤】如下:
1.前往 Terraform官网 下载适用于您的操作系统的程序包;
2.将程序包解压到/usr/local/bin。如果将可执行文件解压到其他目录,则需要将路径加入到全局变量:
3.运行 terraform
验证路径配置。
将显示可用的Terraform选项的列表,类似如下所示,表示安装完成。
username:~$ terraform
Usage: terraform [-version] [-help] [args]
4.为提高权限管理的灵活性和安全性,建议您创建RAM用户,并为其授权。
**注意**:请不要使用主账号进行操作!!!
常见的terraform命令是 terraform init
, terraform plan
, terraform apply
。
需要为每个terraform项目创建1个独立的执行目录。所以,我们创建terraform-test目录。该目录下所有*.tf 文件都会被terraform加载,因此,在初始化配置之前需要有1个.tf文件。
mkdir terraform-test
cd terraform-test
Terraform在运行时,会读取该目录空间下所有.tf以及.tfvars 文件。因此,没有必要将所有配置信息写在1个配置文件中。用户可以按照实际用途将配置信息写入到不同的文件中。例如:
provider.tf -- provider 配置
terraform.tfvars -- 配置 provider 要用到的变量
varable.tf -- 通用变量
resource.tf -- 资源定义
data.tf -- 包文件定义
output.tf -- 输出
Step1:如下我们将创建provider.tf 文件存放用户的身份认证信息。
provider "alicloud" {
region = "cn-hanghzou"
access_key = "your-access-key-here"
secret_key = "your-secret-key-here"
}
说明:以下示例中都会用到provider.tf文件,请不要删除该文件。此外,建议将AK信息单独存放到provider.tf文件,不建议将AK信息与对象操作放在同一个tf文件中。
Step2:我们以创建1个Bucket为例。如下我们创建1个test.tf文件,内容如下:
resource "alicloud_oss_bucket" "bucket-acl"{
bucket = "figo-chen-2020"
acl = "private"
}
您可以从该链接查看到bucket所有配置信息。 如果bucketfigo-chen-2020不存在,则运行 terraform apply
后将自动创建该bucket。若已经存在Bucket,则强制进行重命名操作。
注意:资源的操作行为与Terraform的状态有关。若无,则创建该Bucket,若有,则强制进行重命名操作。重命名操作会被拆分为“删除+新建”2个操作步骤。
新建terraform工作目录,并创建配置文件后。terraform apply
、 terraform plan
等命令是无法执行的。需要先进行初始化操作。
Terraform init
执行 terraform init
命令后,会在当前目录创建.terraform
目录。并依据 *.tf文件中的配置信息下载对应的插件。
示例输出信息如下:
root@figo-hangzhou:~/terraform-test# terraform init
Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "alicloud" (1.24.0)...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.alicloud: version = "~> 1.24"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
1. 新建配置文件,并执行初始化后,就可以执行相关Terraform命令了。Terraform提供了预览功能,允许在正式执行之前查看将要执行那些操作。
terraform plan
输出信息如下:
root@figo-hangzhou:~/terraform-test# terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ alicloud_oss_bucket.bucket-acl
id:
acl: "private"
bucket: "figo-chen-2020"
creation_date:
extranet_endpoint:
intranet_endpoint:
location:
logging_isenable: "true"
owner:
referer_config.#:
storage_class:
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
2.若要执行工作目录中的配置文件,请运行如下命令:
terraform apply
输出信息如下:
root@figo-hangzhou:~/terraform-test# terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ alicloud_oss_bucket.bucket-acl
id:
acl: "private"
bucket: "figo-chen-2020"
creation_date:
extranet_endpoint:
intranet_endpoint:
location:
logging_isenable: "true"
owner:
referer_config.#:
storage_class:
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
alicloud_oss_bucket.bucket-acl: Creating...
acl: "" => "private"
bucket: "" => "figo-chen-2020"
creation_date: "" => ""
extranet_endpoint: "" => ""
intranet_endpoint: "" => ""
location: "" => ""
logging_isenable: "" => "true"
owner: "" => ""
referer_config.#: "" => ""
storage_class: "" => ""
alicloud_oss_bucket.bucket-acl: Creation complete after 1s (ID: figo-chen-2020)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
如上已经成功的创建了 figo-chen-2020 这个bucket,并且ACL是Private。
3.若要显示删除已存在的资源,请运行如下命令:
terraform destroy
resource "alicloud_oss_bucket" "that"{
bucket = "figo-chen-2019"
acl = "private"
}
resource "alicloud_oss_bucket" "bucket-logging" {
bucket = "figo-chen-2018"
acl = "private"
logging {
target_bucket = "${alicloud_oss_bucket.that.bucket}"
target_prefix = "log/"
}
logging_isenable = true
}
说明:若Bucket不是通过terraform创建。则通过 如下命令导入现有的Bucket。
terraform import alicloud_oss_bucket.bucket bucket-name
1.编辑mail.tf文件,在此文件中编辑导入Bucket的ACL等其他信息。例如:
resource "alicloud_oss_bucket" "bucket"{
bucket = "test-hangzhou-2025"
acl = "private"
}
2.执行terraform import命令,如下是导入“test-hangzhou-2025”这个bucket的命令:
terraform import alicloud_oss_bucket.bucket test-hangzhou-2025