公藹??
https://www.terraform.io/docs/index.html
蟆?蜈?
https://www.terraform.io/guides/core-workflow.html
推奨方觸??
https://www.terraform.io/docs/cloud/guides/recommended-practices/index.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part1.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part2.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.1.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.2.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.3.html
https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.4.html
チュートリア繝?
https://learn.hashicorp.com/collections/terraform/gcp-get-started
HCL
https://www.terraform.io/docs/language/index.html
CLI aka cmd(アルファベットリストから使う)
https://www.terraform.io/docs/cli/auth/index.html
GCP用リファレン繧?
https://registry.terraform.io/providers/hashicorp/google/latest/docs
お便強
https://qiita.com/minamijoyo/items/1f57c62bed781ab8f4d7
https://qiita.com/donko_/items/6289bb31fecfce2cda79
https://www.apps-gcp.com/infra-automation-01/
https://colsis.jp/blog/gcpterraform/
Infra as codeとしてインフラの觸??築や設藹??をコード化できる
特にクラウドだと觸??築の自動化や構成管理等でのレバレッジが強力
■段髫?
Terraformと縺??基本知鐔??縺?Terraformのメリット4つを紹臀?? | テックマガジ繝? from FEnetインフ繝?必要なリソースをTerraform化>workspaceの活逕?>main.tfの共通部分をmodule化
moduleは觸??成に合繧?ないようなリファクタリングが必要になった時縺?terraform state mv が必要になってとたんにつらい、moduleを細分化しす縺?る縺?variable 縺? output が大驥?に藹??要になって書きづらい、moduleは再利用できる複数のリソースの単位(プログラミング鐔??語でいうところの関数みたいなもの・??で臀??るのがしっ縺?り
リソースの差分を無鐔??するlifecycleブロックを使う
resource "aws_autoscaling_group" "app_1" {
name = "app-asg-1"
lifecycle {
ignore_changes = ["load_balancers"]
create_before_destroy = true//新しいのを作ってから古いのを削髯?
}
}
外部ファイルを文字列として読み込む
resource "aws_iam_role" "ec2_role" {
name = "ec2-role"
assume_role_policy = "${file("./ec2_assume_role_policy.json")}"
}
1つのディレクトリで鐔??数縺?Stateを扱うWorkspaceという機能もあるのですが、
個人的には普通にディレクトリを分けて管理する方が讌?
production/stagingが完全に同じリソース觸??成で、設藹??のパラメータの差分がちょっとだけあるという理想的な臀??界で縺?Workspaceでも運用できるかもしれませんが、現藹??的に縺?stagingだけリリース前の觸??証用の臀??時的なリソースが立ってたりとか、完全に同じ構成にならないことも多いので、モジュールの読み込みの有無や一部の環藹??だけ存在するリソースなどの差分を吸藹??できる場所があったほうが都合がよい
Terraform職人再入門2020 - Qiitaモジュールが公藹??から觸??供されている
Browse Modules | Terraform RegistryTerraform 縺? terraform.tfvars と縺? | 30歳未軆??験から縺?ITエンジニ繧? (se-from30.com)環藹??情報は藹??部ファイルが基譛?
prd/stg/dev環藹??縺?prd.tfvars, stg.tfvars, dev.tfvarsを用諢?
.tfvars 各環藹??の設定
aws_access_key = "XXXXXXXXXXXXXXXXXXXX"
aws_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
aws_region = "eu-west-1"
main.tf
terraform {
required_version = "= 0.12.26"
}
provider "aws" {
version = "2.66.0"
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = var.aws_region
}
var.tf 空の藹??け逧?
variable aws_access_key {}
variable aws_secret_key {}
variable aws_region {}
Terraform で藹??数を使う - Qiita実行時縺?-var-fileで値ファイルを指定して環藹??などを切り替えると良いかもしれない
terrafrom plan -var-file=dev.tfvars
terrafrom plan -var-file=prod.tfvars
変数ファイル指定がないときは藹??数縺?defaultに入れてお縺?、descriptionで藹??数の説譏?もかける
variable "foo" {
type = "string"
default = "default-var"
description = "Sample Variable"
}
変数ファイルを異なるバックエンド(フォルダ構成)で共有したいときはシンボリックリンクを貼る
ln -s ../common/shared_var.tf shared_var.tf
credentials等の軆??匿したい変数を外部のファイルやコマンドライン藹??数から読み込む
variable "credentials_file" {} @var.tf 変数を定義し空にしてお縺?
credentials = file(var.credentials_file) @main.tf ファイルを読むがファイル名は藹??謨?
terraform plan -var 'project=
' -var 'credentials_file=.json' @cmd プロジェクトとクレデンをコマンド時に指定
他にもvars.tfvars設藹??ファイ繝?(行鬆?variableが不要)、TF_VAR_環藹??変数による指定-var-fileで藹??数ファイルを譏?示し縺?cmd、ファイル名縺?.tfvars/.tfvars.json
-varで藹??数を譏?示し縺?cmd
順蠎?があり後の読込でオーバーライド
↓
HCLの藹??数は基譛?2種饅??縺?local縺?variable
variableはグローバル藹??数、ファイル藹??やコマンドラインから使える
その臀??の藹??数藹??照方觸??としては・??上から優先に適藹??)
コマンド引数 一時的に使逕?
変数ファイ繝? terraform.tfvars git管理等で藹??部ファイルで・??
環藹??変謨? TF_VAR_ 実行ログに觸??らない鍵情報軆??
workspaceは使繧?ない、moduleを限定的に使う
設藹??をコード化>Gitレポジトリに置縺?>設藹??内容、作業履歴の譏?確化、チームでの運用性向上
■特諤?
TFの影響を藹??映するの縺?terraform applyの時だけ、tfファイル縺?tfstateの差分を実際にリソース臀??成する
tfファイルで藹??更した場合、TFはリソースの再作成を行うので臀??度觸??えることになる(大臀??は単位が権限だったりで影響がないだけ縺?planで鐔??注意)
terraform plan縺?tf縺?tfstateと藹??体の差なので、実体があってもtfstateになけれ縺?will be created縺?plan時は表示される
terraform import縺?tfファイルからtfstateへ鐔??載だけを行う(実体からも情報を藹??得しtfstateに入れる)
カレントdirの蜈?.tfファイ繝?or.tf.jsonを評価するの縺?tfファイルの名は臀??でもいい
各リソースに対し縺?TF化するかは選択ができるが、TFする場合はそのリソースに藹??要な全鐔??載をTFファイルに鐔??う
terraform import tfResourceID.yourResourceName gcpIdentifier のコマンド
terrafrom import google_bigquery_dataset.tf-1 bangboo-prj/test-dataset
tfResourceID(リソー繧?IDというようタイプ:リソース種蛻?)縺?TF指定のもの、yourResourceName (リソース名)は任諢?のも縺?
構成ファイ繝?.tfはローカルのものが使繧?れる、importする縺?tfstateに藹??映
GCP identifier縺?TF公藹??サイトの各サービスの臀??番臀??import項目を見ると指定内容が分かるの縺?GCPを見て拾って縺?る
terraform state list TF化されているリソースを見る
terrarorm apply時にもtfstateは更新される(オプショ繝?-refresh=falseで無効可・??
またapply時縺?-target=xxxでデプロイするリソースを特藹??できる(TFファイルだけでな縺?TFステートもターゲットになる)
resource "google_sql_database_instance" "instance" {
provider = google-beta
name = "my-database-instance"
}
resource "google_sql_database" "db" {
instance = google_sql_database_instance.instance.name
name = "db"
}
ToSetは値設定をするが順不同で重複を省縺?
resource "xxx" "aaa" {
for_each = toset(["foo", "bar", "bar"]) 縺?bar, foo
name = each.key
}
for_each/eachのループ
locals {
sg = {
foo = "FOO"
bar = "BAR"
}
}
resource "xxx" "aaa" {
for_each = local.sg
name = each.key
description = each.value
}
mapをリストしたものをfor_each
locals {
images = [
{ name = "foo", image = "alpine" },
{ name = "bar", image = "debian" },
]
}
resource "docker_container" "this" {
for_each = { for i in local.images : i.name => i } # こう書縺?のが正しい
name = each.value.name
image = each.value.image
}
terraform importはリソース単位、更新はできず削除してから追加 terraform state rm google_bigquery_dataset.tf-1
実設藹??縺?importの内容が違う場合は藹??設藹??の情報縺?tfstate化されるようだ(importは項目を入れ込む感じ?)
なので藹??環藹??に藹??更を加えるに縺?terrafrom apply、tfstate化もされtfファイ繝?/tfstate/実設藹??縺?3者で同じになる
apply時縺?tfstateと藹??設藹??が違う場合、例えば既藹??設藹??がある場合は重複エラーになりapplyできず、importしtfstateと藹??設藹??を同じにしてから、tfファイルの内容をapplyすることが必要
terraform importで対象プロジェクトを間違えると繝?マる
通常縺?terraform applyで縺?providerの情報を使用してプロジェクトを決めるが、importは繝?ードコードするの縺?importを間違えばなぜ変な藹??更がでるのか繧?からな縺?なる(プロジェクトが変なもの縺?stateを調べ、terraform state rmするしか)
■セットアップ
作業ディレクトリの臀??成(プロジェクトに対するローカルのフォルダ)
プロバイダを指定したtfファイルの臀??成(gcs縺?stateを置く設藹??が良い
provider "google" {
project = "bangboo-kuso"
}
terraform {
backend "gcs" {
bucket = "bangboo-kuso-terraform"
}
}
terraform init ローカルに対して初期化
プロジェクトレベ繝?ownerのサービスアカウントを持ってお縺?
セットアップする際縺?tfsate縺?backend保存場所縺?bucket部分をコメントアウト
bucketを作るterraformを実施しbucketを作成しつ縺?local縺?tfstateファイルを作成
再蠎?terraformをする縺?tfstateファイルがbucketにコピーされる
bucket部分のコメントアウトを外すと次回tfからはバケット縺?tfstate更新する
このときローカ繝?tfstateの内容をバケットに写すか聞かれるが写す
(写さないと差分しかバケットに鐔??かないの縺?import等が必要になる)
■既藹??リソース縺?TF化のおおよその臀??讌?
リソースタイプと名前を定義したtfファイルを作成する(任諢?のリソース名、基本ユニーク、郤?められるものは重複してもいい)
resource "google_cloudfunctions_function" "fuckin" { ... をtfファイルに鐔??載
tfResourceID(リソー繧?IDというようタイプ:リソース種蛻?)縺?yourResourceName (リソース名) だけ縺?
リソースタイプや個別パラメータは公藹??ドキュメントを藹??照しながら定鄒?
https://registry.terraform.io/providers/hashicorp/google/latest/docs
(簡単)tfファイル内で・??行目以外は空で、terraform planをするとエラーで藹??要なものが分かるので、それを埋める
planが通ると自動的に値をサーバから拾って縺?る(importすれ縺?tfstate.tfに入っている or コピーし縺?TFに入れる)
planでダメならterraform state show tfResourceID.yourResourceName 縺?stateを見縺?tfファイルにパラメータを定義してい縺?
暫藹??に空でリソースをTFファイルに鐔??載しterraform import、次縺?tfstateを調査する
terraform state list tfstateファイルにあるアセットを一隕?
terraform import google_bigquery_table.xxx project/dataset/table インポート
terraform state show google_bigquery_table.xxx tfstateの該当部を表示
terraform state rm google_bigquery_table.xxx インポート藹??り消し
TF定義は鐔??数の方觸??がある、最終GCP公藹??縺?RestAPIで確認するしか
terraform importする(公藹??ドキュメントの臀??番臀??縺?importコマンドの指定がある)
terraform planして差分がな縺?なるま縺?tfファイルを修正する
import(tfstate)の修正は臀??蠎?stateから削除する terraform state rm google_bigquery_dataset.tf-1
(既藹??リソースがあってもあ縺?ま縺?tfファイル縺?tfstateの差分なの縺?initした状態縺?planしてもup-to-dateと表示されるだけ)
tfstateファイルにおかしなものが無いか確鐔??、keyとか含まれないか
■個蛻?
リファレンス縺?optionalとなっていてもtfファイルでは藹??要な場合もある
tfstateファイルからは藹??要ないとして自動的に削除されるが
スプシをBQでみれるFederatedQueryはテーブルだけ定義しimportしstate show調譟?
urlをTFファイルに鐔??載する
シャーディング・??日臀??別・??テーブルは藹??義できないので縺?
生成するクエリの方をTF化したい
Authorized viewはモジュールがあるがconflictがあり全觸??えする場合がありTF化にまだ向かない
google_bigquery_dataset_iam_memberでもAuthorized viewをはがしてしまう。
Authorized viewを使っている個所縺? google_bigquery_dataset_access あるい縺? google_bigquery_dataset 縺? access フィールドを使う。
google_bigquer_dataset_iam_policy 縺? google_bigquery_iam_binding 縺? Authoritative で権限追加でなく権限強制設定でコンソール臀??荳?分を引き剝がすので、使繧?ない方が安全。
なお、Authorized view 縺? Routines 縺?Terraform化できない事が分かっている(2022/4時点・??
ScheduledQuery 縺? Terraform化できるが実行者の設定ができない(Terraform実行者がSQ実行者?誰・??)
BQ関連ではデータセット定義、テーブル藹??義、ビュー藹??義、フェデレテッドクエリ藹??義、ScheduledQuery定義をTerraformで鐔??い
BQ権限定義、AuthorizedView定義、Routines定義は鐔??繧?ない
BQ権限を定義するならデータセットレベル縺?google_bigquery_dataset_access
プロジェクトレベル縺?google_project_iam_memberで藹??施すると別なので藹??全らしい?
■TF公藹??ドキュメント
google_organization_iam_custom_role | Resources | hashicorp/google | Terraform Registrygoogle_organization_iam | Resources | hashicorp/google | Terraform Registryカスタムロールを設藹??して、組織レベル縺?IAMでそれを使いたい
TF縺?org_iamページ縺?Argument reference縺?role項目を見る縺?
Note that custom roles must be of the format organizations/{{org_id}}/roles/{{role_id}}
TF縺?org_iam_custom_roleページ縺?Attributes reference縺?role項目を見る縺?
id - an identifier for the resource with the format organizations/{{org_id}}/roles/{{role_id}}
で臀??記と分かる、使用側と被使用側縺?TFマニュアルを両方確認する
resource "google_organization_iam_custom_role" "my-custom-role" {
role_id = "myCustomRole"
org_id = "123456789"
title = "My Custom Role"
description = "A description"
permissions = ["iam.roles.list", "iam.roles.create", "iam.roles.delete"]
}
resource "google_organization_iam_member" "my-organization" {
org_id = "123456789"
role = google_organization_iam_custom_role.my-custom-role.id
#あるいは通蟶?"roles/bigquery.dataEditor"のようにいれるがorganizations/0123456789/roles/chinkoといれる
member = "user:jane@example.com"
}
↑
resource縺?2番目リソース名を定義しますが任諢?の名前を指定します
ここが同じ項目はユニーク制限がない場合は追加としてまとめられます
通常はユニークにしterraformで管理するリソース名(yourResourceName)を宣鐔??します
窶?1番目のリソースタイプ内でユニークにするのが基本・??全臀??でもユニークの方が分かり易い)
TFファイルに藹??義をしたい →定義したいリソース縺?Argument referenceの項目を設藹??
TFファイルに藹??義した内容を変数で使いたい →使いたいリソース縺?Attributes referenceを見る
terraform importしたい →インポしたいリソースのページ臀??番臀??縺?importコマンドの指定を見る
■他に臀??般的縺?TF(既藹??がimportされると以下で藹??更をapplyして運用・??
terraform -v 稼働確鐔??
terraform fmt ファイルの鐔??述フォーマットを整える
terraform validate ファイルの觸??險?
terraform plan アクションを計逕?
terraform apply 最後に藹??更を適藹??
terraform show ステータスを確鐔??、一隕?
terraform destroy で簡単にインフラの吐き、initができないとき必要そう
■特藹??のリソースだけ適藹??したい
terraform plan -target="tfResourceID.yourResourceName"
terraform apply -target="tfResourceID.yourResourceName"
TFファイルだけでな縺?TFステートもターゲットに含まれる
これ縺?TFファイルにコードがな縺?TFステートだけにあるものを指定して削除軆??もできる
■terraformのバージョン管理
.terraform.lock.hclファイル縺?GCP provider等のライブラリのバージョン管理をしている、pyenv縺?Pipfile.lockみたい縺?Hash差分が記載されている、terraform init等で生成されapply時の設定が担保される、通蟶?tfファイル縺?providerのバージョンを記載すればよいので臀??要と思繧?れる
.terraform-versionファイル縺?terraform自臀??の鐔??求バージョンを担保できる
通常縺?tfenvを使えばよい、tfファイル縺?required_versionを記載すればよいので臀??要と思繧?れる
■tfenvを使う場合
tfenv install 1.0.0
tfenv list
tfenv use 1.0.0
terraform init
terraform workspace list
terraform workspace select ore_space
main.tf作成し記載
terraform fmt tfファイルのフォーマット(書藹??は適藹??で書けばいい)
gcloud auth login ローカル操作のための鐔??險?
gcloud auth application-default login SDKを実行のための鐔??險?
API&Servicesでクレデンシャルは藹??得できそう、key=xxxx
既藹??のリソースを調譟?
terrafrom import google_storage_bucket.pri-bucket project-abc123/asia-northeast1/pri-bucket 縺?importとか
terraform refresh tfstateの最新化、どのタイミングで使う?
■既藹??のリソースを調譟?
terraformer import google --resources=instances,forwardingRules --regions=us-west1 --projects=xxxx-123 とか
既藹??リソー繧?import
https://www.apps-gcp.com/terraformit-gcp/
ダメなら terraform state rm で臀??要分を削る
新環藹??用縺?tfファイルを準備
新環藹??で臀??記を実行
terraform init
terraform state push xxx.tfstate
terraform planで差分がないことを確鐔??
■GCP権限(メールの藹??名時)
GCP縺?GWS gmailメールの藹??名に追従して権限も付荳?状態も変化がない
しかしterraformは追従しないためtfファイルで使っている場合は藹??更する
■gcloud cmd
https://www.devsamurai.com/ja/gcp-terraform-101/
gcloud projects list 権限あるプロジェクトを表示
gcloud config set project [prjID] ワーキングプロジェクトの設定
gcloud services enable iam.googleapis.com サービスの有効化
gcloud iam service-accounts create terraform-serviceaccount \
--display-name "Account for Terraform" サービスアカウント作成
gcloud projects add-iam-policy-binding [PROJECT_ID]
--member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com --role roles/editor 権限付荳?
gcloud iam service-accounts keys create path_to_save/account.json
--iam-account terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com クレデン発鐔??