使用Terraform初次创建Alibaba Cloud资源
在这篇文章中所要写的内容
最近我有机会在阿里云上构建资源,但平时对阿里云和Terraform的使用都不是很熟悉,所以我会总结一下我进行资源构建前所做的事情。
在使用阿里巴巴云构建资源时所采取的步骤
步骤1:选择适合的IaC工具
出于公司内部的要求,我们推荐使用基础设施即代码(IaC)的方法,并且使用CloudFormation来管理和运维AWS上的资源。基于这个前提,我们决定在这次的AlibabaCloud项目中,也采用资源代码化的方式,并最终实现自动化构建。
有几个选择,但这次我们比较了两个。
一个是我们团队正在使用的Terraform,另一个是阿里云的资源编排服务(ROS)。
▼Terraform
阿里巴巴云供应商
资源编排服务
ROS是类似于AWS的CloudFormation的服务,可以根据模板创建堆栈并构建/管理资源。
虽然很粗略,但我尝试比较了Terraform和ROS。(截至2021年2月)
细致地查看变更差异等可能会有一些不同,但总体印象几乎没有变化。
基于最近的团队背景,我们正在使用Terraform对各种工具(如Datadog、PagerDuty)的配置代码进行化。由于可以统一技术栈,这一点非常吸引人,因此我们决定采用Terraform。
第二步:思考Terraform文件的组织结构
我认为有很多种方法可行,但这次我正在尝试以下这种方式。
$ tree
.
└── terraform
└── alibaba
├── README.md
├── main.tf //AlibabaCloudのリソースを定義
├── staging
│ ├── backend.tf //バックエンドを指定
│ └── terraform.tfvars //variables.tfで定義した変数の値を指定
└── variables.tf //利用する変数を定義
由于资源有限,我们假设将所有内容都写在main.tf中进行构建。
步骤3:创建适用于Terraform的用户
在使用AWS的CLI进行堆栈操作时,需要创建IAM用户并准备相应的凭证等。在这方面,阿里云也是类似的。
请提供一个中国本土的文本版本
由于阿里巴巴云计算提供了资源访问管理(RAM)服务,该服务可用于管理用户ID并限制其访问权限。我们将使用这个服务。
RAM的概述
用户是RAM用户,权限是通过将RAM策略与用户关联提供的,
此外,还提供了RAM角色和用户组来进行束缚,所以我认为这与AWS的IAM大致相同的概念。
因为需要执行terraform,所以我在web控制台上创建了一个用户(RAM用户),如下所示。
通过程序创建用户时,会生成访问密钥,请妥善保留。
阿里巴巴云提供了托管的System Policy和自定义的Custom Policy,用户可以选择使用其中之一。
※(与Terraform的话题无关)这次为了工程师和其他开发人员登录到Alibaba Cloud的环境,我们将提供SSO(单点登录)方式,因此没有为每个RAM用户创建账号。但是,如果不采用SSO,则需要单独创建RAM用户账号,最好不要使用根用户。
第四步:设置执行Terraform所需的环境变量。
将先前创建的用户认证信息设置为环境变量。
ALICLOUD_ACCESS_KEY=STEP2で作成したアクセスキーを設定
ALICLOUD_SECRET_KEY=STEP2で作成したシークレットキーを設定
ALICLOUD_REGION=リソースを構築したいリージョンのID
第五步:准备管理tfstate文件的远程后端。
tfstate文件是由terraform管理的资源的当前状态的文件。
执行Terraform计划时,Terraform会比较tfstate文件和.tf文件的内容,并输出差异。
如果不进行特别的设置,这个tfstate文件的存储位置由称为后端的资源来管理。如果没有进行设置,后端将变为本地,tfstate文件将保存在本地并进行读取。
本次我們決定使用阿里巴巴雲端服務(OSS)作為遠端後端,以便與CI工具整合並允許多人執行Terraform。這樣一來,我們可以建立共享狀態,避免在本地執行時的不便。
如果您从Web控制台创建,您可以选择所需的项目并进行创建,可以发现AWS的S3提供了相似的设置选项。
另外,OSS的名称需要像s3一样在整个OSS中是唯一的。
步骤6:建立资源
在 main.tf 文件中描述要构建的资源。
terraform {
required_version = "= 0.14.5"
backend "oss" {
}
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.114.1"
}
}
}
resource "alicloud_ram_user" "hoge" {
name = "hoge"
display_name = "hoge"
}
我使用以下命令进行了确认和应用。
# 実行内容を確認する
$ terraform plan -var-file='terraform/alibaba/staging/terraform.tfvars' terraform/alibaba
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_ram_user.hoge will be created
+ resource "alicloud_ram_user" "hoge" {
+ display_name = "hoge"
+ force = false
+ id = (known after apply)
+ name = "hoge"
}
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.
# applyする
$ terraform plan -var-file='terraform/alibaba/staging/terraform.tfvars' terraform/alibaba
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
Terraform will perform the following actions:
# alicloud_ram_user.hoge will be created
+ resource "alicloud_ram_user" "hoge" {
+ display_name = "hoge"
+ force = false
+ id = (known after apply)
+ name = "hoge"
}
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_ram_user.hoge: Modifying... [id=xxxxxxxx]
alicloud_ram_user.hoge: Modifications complete after 4s [id=xxxxxxxx]
能否使用Terraform来管理远程后端的OSS?
我先前在 web 控制台上创建的 OSS,我试着用 Terraform 创建后再指定到后端,以便能够进行代码管理。
在main.tf中创建OSS。
terraform {
required_version = "= 0.14.5"
backend "oss" {
}
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.114.1"
}
}
}
resource "alicloud_oss_bucket" "infra" {
bucket = "infra"
acl = "private"
storage_class = "Standard"
versioning {
status = "Enabled"
}
}
当后端处于本地状态时,执行上述的terraform plan&apply。一旦 OSS(对象存储服务)准备就绪,将本地创建的 tfstate 文件上传到 OSS。
当OSS可用时,请重新设置后端。
准备一个backend.tf文件
bucket = "infra"
region = "利用したいリージョンのID"
prefix = "terraform/alibaba/" #tfstateファイルをアップロードしたOSSのパス
key = "terraform.tfstate"
通过以下命令重新配置后,我们已将我们创建的OSS设置为后端。
$ terraform init -reconfigure -backend-config='terraform/alibaba/staging/backend.tf' terraform/alibaba
Initializing the backend...
Successfully configured the backend "oss"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing provider plugins...
- Reusing previous version of aliyun/alicloud from the dependency lock file
- Installing aliyun/alicloud v1.114.1...
- Installed aliyun/alicloud v1.114.1 (signed by a HashiCorp partner, key ID xxxxxxxxxxxxxxx)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/plugins/signing.html
Terraform has been successfully initialized!
虽然有可能做到,但并不是一个简单的步骤,所以我认为还可以从Web控制台开始创建,这也是一种方法。
(做完后才意识到,也许使用Terraform Import更简单…)
总结
-
- 困ったこと
RAMユーザやリモートバックエンドとしてのOSSの構成管理をどうするか
terraformの実行に必要で卵が先か鶏が先か状態になる
わかったこと
Alibaba Cloudでも構成管理を行うROSというサービスが提供されていた
terraform実行に利用するOSSやRAMユーザをコード管理したい場合はwebコンソールから作成後Terraform Importを使うのが良さそう