【适合初学者】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のメリットや仕組み、用語など基本情報をまとめてみた
广告
将在 10 秒后关闭
bannerAds