【适合初学者】Terraform的基础知识
Terraform是什么?
IaCを実現するツール
インフラの初期プロビジョニング、更新、破棄をコード管理できる
メリット
バージョン管理ができる
他者との共有、再利用ができる
構成をスムーズに変更できる
他のプロバイダへの移行がしやすい
最初的准备
在macOS上安装Terraform(请根据各个环境适当选择安装方法)。
brew install tfenv
Terraformのバージョンに追随するためにもtfenvを使うのがおすすめです。
tfenv list-remote
現在利用可能なTerraformのバージョンを列挙します
tfenv install x.xx.x
リストから対象のバージョンを選択します。
tfenv use x.xx.x
インストールしたものの中で使うTerraformのversionを指定します。
提供者的准备
-
- プロパイダーとは
AWSやGoogleCloudなどのプラットフォームやソフトウェア、ハードウェアのAPIと対話するためのプラグイン。
変更したい対象のものを指定する。
どんなプロバイダーがあるかは下記を参照してください
https://registry.terraform.io/browse/providers
本次主要以使用频率高的AWS为中心进行说明。
在AWS的情况下
为了在AWS上进行更改,需要提前获取认证信息,所以我会先处理对应的事务。
创建IAM用户
请根据以下公式创建IAM用户。
请仅限于适当的权限。
如果泄漏密钥将会带来严重后果。
请谨慎操作。
设置 AWS CLI。
如果您还没有安装AWS CLI,请使用以下命令来安装。
请执行以下命令在您的计算机上安装 AWS 命令行工具:brew install awscli
接下来,我们将使用Terraform来设置AWS的profile。YOUR_PROFILE_NAME可以是任何值,我们选择一个易于理解的名称。这次我们使用test。(在后面的tf文件中指定了profile = test。)
$ aws configure --profile YOUR_PROFILE_NAME
AWS Access Key ID[None]: IAMで作成したアクセスキーID
AWS Secret Access Key[None]: IAMで作成したシークレットアクセスキー
Default region name[None]: ap-northeast-1
Default output format[None]: json
# 下記のコマンドで接続ができるか確認してください。
$ aws sts get-caller-identity --profile YOUR_PROFILE_NAME
# Terraformで使用するAWS_PROFILEを環境変数に設定
$ export AWS_PROFILE=YOUR_PROFILE_NAME
用Terraform建立
现在,我们已经准备好随时开始使用Terraform了。
但是,如果随意创建资源的话,管理将变得复杂。
在介绍管理更方便的目录结构的同时,我们将解释如何使用Terraform。
关于目录结构
例子
- service (例: サービス毎にディレクトリを区切る)
- backend.tf (Terraformのstate管理用)
- outputs.tf (他のディレクトリや他のリポジトリで現ディレクトリのリソース設定を使いたい場合に定義する)
- provider.tf (どこのプロバイダーを指定するか。 awsやgcpなど)
- remote_state.tf (他のディレクトリやリポジトリのTerraformのstate情報を取得する)
- variables.tf (変数を定義。全体で共通して使うものなど。)
- xxx.tf (s3やecsなどAWSのサービス毎にファイルを区切る)
backend.tfに記載されたstateの保存先と見比べて、記載のコードとの変化を見る
terraform plan時にでてくる変更点はstateで保持されている内容とコードの差分
上記ファイルの準備ができたらterraform initを実行する(初回だけ)
ワークスペースを初期化するコマンドで、aws providerなどのダウンロード処理が走る
文件的写作方法
后端.tf
terraform {
backend "s3" {
bucket = "terraform-state-bucket"
key = "terraform.state.test"
region = "ap-northeast-1"
profile = "test"
}
}
当使用Terraform创建或更改资源时,会创建一个名为state的文件来管理基础架构的状态。
对于个人使用而言,将state文件保存在本地是没有问题的,但如果多人共享使用,就需要创建共享文件夹并在某个地方进行管理。
为了指定共享文件夹,我们有了一个名为backend的选项。
本次我们使用AWS的S3进行管理,因此需要指定S3存储桶的名称,并指定保存文件的键名。
输出.tf
output "alb_dns" {
value = aws_alb.alb.dns_name
}
可以使用它来定义在其他项目中使用的值。详细信息可以参考这篇文章。
“output” 的名称可以是任何名称。它将作为获取时的名称。建议使用容易理解的名称。
“value” 中包含的内容与指定常规资源相同,指定目标资源(请参考xxx.tf进行详细说明)。
以上示例是针对AWS的ALB的示例。
provider.tf的意思是提供者。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.65"
}
}
}
# Configure the AWS Provider
provider "aws" {
region = "ap-northeast-1"
profile = "test"
}
provider "aws" {
alias = "virginia"
region = "us-east-1"
profile = "test"
}
使用required_providers指定了提供者。如果想要改变region和profile,则可以通过在块内使用alias来实现,在其他文件中也可以进行更改。
如果在每个资源的配置中未指定提供者,则将应用默认设置。
通过在每个资源中声明provider = aws.virginia这样的形式来应用。
remote_state.tf 远程状态.tf
data "terraform_remote_state" "hogehoge" {
backend = "s3"
config = {
bucket = "terraform-state-bucket"
key = "terraform.state.test"
region = "ap-northeast-1"
profile = "test"
}
}
-
- 外部から参照したいstateを取得する
s3でstate管理している場合はs3のバケットを指定すればOK
变量.tf
locals {
project_name = "hoge"
}
定義需要共同使用的变量。可以在其他文件中以以下方式调用:
local.project_name
xxx.tf(按服务分的文件)
-
- Terraformの公式ドキュメントを参照するのが良い。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs
以下是VPC的示例。
在这种情况下,需要创建一个名为vpc.tf的文件。
resource "aws_vpc" "example" {
cidr_block = "10.0.0.0/16"
}
资源“aws_vpc”“example”具有固定的值作为初始的aws_vpc。根据所使用的服务而定。example作为资源命名可以自行决定。
由于每个服务的块内容都不相同,所以只需参考官方文档并进行描述即可。
terraform命令
经常使用的东西
terraform plan 実行前に、記載したコードでどんな変更があるかを確認できる
terraform apply コードで記載したものを実際に反映する
terraform destroy リソースを削除します。
使用起来很方便的东西
terraform fmt コードの自動整形をしてくれる
terraform import すでに作られているもの(AWSコンソール上等で)をコード管理できる
その他、全容についてはterraform -hで確認してください。
其它提示
-
- どのリソースに対しても付けられるオプションに、lifecycleというのがあります。
リソースの変更時に特定の挙動を指定できるオプション。
例えばprevent_destroyをつけておくと、消すときにエラーが出るようになるので、誤った操作が起きないように、とりあえずつけておくと安心です。
詳しくは公式ドキュメントを参照してください!lifecycleについて
lifecycle {
prevent_destroy = true
}
请参考
-
- Terraformのディレクトリパターン集
-
- Terraformにおけるディレクトリ構造のベストプラクティス
- Terraformのメリットや仕組み、用語など基本情報をまとめてみた