Slide 1

Slide 1 text

2024/11/14 佐藤雅樹 Terraform Stacks⼊⾨

Slide 2

Slide 2 text

⾃⼰紹介 2 resource “my_profile” “this” { name = “佐藤雅樹” x = “@chari7311” company = “クラスメソッド株式会社” department = “ソリューションアーキテクト” }

Slide 3

Slide 3 text

本セッションについて 3 ● 対象者 ○ Terraformを利⽤してIaCを実践している⽅ ○ Terraform Stacksについて興味がある⽅ ● ゴール ○ Terraform Stacksの概要‧ユースケースを理解できる

Slide 4

Slide 4 text

適切な分割がされていないStatefileの課題 4 ● リソース変更の影響範囲⼤きい ● Terraform実⾏時間が⻑い ● 管理責任の分離ができない

Slide 5

Slide 5 text

Statefileを分割 5 以下の単位で分割 ● 環境 ● リソース種別 (Network,Compute等)

Slide 6

Slide 6 text

HCP Terraformで実現(Workspace) Statefile毎にWorkspaceを作成 [補⾜] HCP Terraform: Terraformを組織 で活⽤するためのプラットフォー ム Workspace: Terraformリソースを 管理する単位。実⾏やStateファイ ルを管理。 6

Slide 7

Slide 7 text

Workspace(Statefile)増加による課題 7

Slide 8

Slide 8 text

Terraform Stacksで解決 8 Terraform Stacksを使うことで以下 を効率化‧簡素化 ● 複数Workspaceの管理 ● プロビジョニング ● 依存関係の管理

Slide 9

Slide 9 text

Terraform Stacksとは 9 ● 機能: 複数Workspaceが必要なインフラ環境の管理を効率化‧簡素化 ● フェーズ: パブリックベータ - HashiConf 2023で発表(プライベートプレビュー) - HashiConf 2024でパブリックベータ版を発表 ● 注意事項 - HCP Terraformで利⽤可能(コミュニティ版への組み込みも予定あり) - 500 Resourceまでの制限あり(Standard‧Plusプランでも同様) ※本スライドの情報は、2024/11時点の情報になります。

Slide 10

Slide 10 text

Terraform Stacksのユースケース ● 複数の環境‧リージョンにデプロイしたい - 複数アカウントの デプロイパイプラインの設定を⼀元管理 ● 別Statefileのリソースを単⼀のユニットとしてデプロイしたい - NetworkとComputeでStatefileを分割しつつ、Network -> Computeの順番で依存関係を 持たせてデプロイ 10

Slide 11

Slide 11 text

Terraform Stacks使い⽅ サンプル構成 11 サンプル構成 ● API Gateway + Lambda + S3 ● マルチアカウント構成 - 環境毎にアカウントを分割 ● マルチリージョン構成 - PRODとSTGはマルチリージョン - DEVはシングルリージョン

Slide 12

Slide 12 text

Terraform Stacks 構成要素 12 Terraform Stacksには、4つの構成要素がある ● Components ● Deployments ● Orchestration rules ● Deferred cahnges

Slide 13

Slide 13 text

Components 13 スタックに含めるリソースを定義 component "s3" { for_each = var.regions source = "./s3" providers = { aws = provider.aws.configurations[each.value] random = provider.random.this } } component.tfstack.hcl

Slide 14

Slide 14 text

Components 14 component "s3" { # 省略 } component "lambda" { for_each = var.regions source = "./lambda" inputs = { bucket_id = component.s3[each.value].bucket_id } # 省略(provider定義) } component "api_gateway" { # 省略 } component.tfstack.hcl resource "aws_lambda_function" "hello_world" { function_name = random_pet.lambda_function_name.id s3_bucket = var.bucket_id # 省略 } lambda/main.tf 参照 他componentのoutputを渡せる (⾃動的に依存関係を考慮して Plan/Apply)

Slide 15

Slide 15 text

Deployments 15 デプロイ先を定義 deployment "prod" { inputs = { regions = ["us-east-1", "us-west-1"] role_arn = "" identity_token = identity_token.aws.jwt } } deployment "stg" { inputs = { regions = ["us-east-1", "us-west-1"] role_arn = "" identity_token = identity_token.aws.jwt } } # 省略(dev) deployments.tfdeploy.hcl

Slide 16

Slide 16 text

├── api-gateway │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── lambda │ ├── hello-world │ │ └── hello.rb │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── s3 │ ├── main.tf │ └── outputs.tf ├── components.tfstack.hcl ├── deployments.tfdeploy.hcl ├── outputs.tfstack.hcl ├── providers.tfstack.hcl └── variables.tfstack.hcl ディレクトリ構成 16 リソース定義 Stacks⽤の定義 component,deployment

Slide 17

Slide 17 text

HCP TerraformでStacksを作成する 17

Slide 18

Slide 18 text

VCSとの接続 18

Slide 19

Slide 19 text

Plan 19

Slide 20

Slide 20 text

Apply 20

Slide 21

Slide 21 text

Orchestration rules 21 Deploymentsの管理に使⽤できる ルール 特定条件に対して、Planの再実⾏ や⾃動承認が可能 例) ● Production環境は⼿動承認必須 ‧その他は⾃動承認

Slide 22

Slide 22 text

Orchestration rules 22 # Production環境以外⾃動承認 orchestrate "auto_approve" "no_prod" { check { condition = context.plan.deployment != deployment.prod reason = "Not automatically approved prod." } } deployment.tfdeploy.hcl

Slide 23

Slide 23 text

Deferred changes 23 依存関係を⾃動的に管理する機能 provider設定で他componentの Outputを使っていた場合、Planが 延期される ユースケース: EKSクラスターとk8s manifestを Terraformで管理する (複数ステップのデプロイが必要な パターン)

Slide 24

Slide 24 text

Workspace利⽤(Stacks不使⽤) 24 provider "kubernetes" { config { host = data.terraform_remote_state.eks.outputs.cluster_endpoint # 省略(CA,Token) } } provider.hcl Statefile(Workspace)を分ける場合、EKSデプロイ前のk8sリソースのPlanはエ ラーになる(EKS側の状態を意識してPlanする必要がある)

Slide 25

Slide 25 text

Deferred changes 25 provider "kubernetes" "main" { config { host = component.cluster.cluster_url # 省略(CAやToken) } } provider.tfstack.hcl EKSデプロイ前のk8sリソースのPlanは⾃動で延期される。

Slide 26

Slide 26 text

Deferred changes 26

Slide 27

Slide 27 text

まとめ 27 ● Terraform Stacksを使うことで、複数Workspaceが必要な構成を簡単に構 築‧管理できるようになりました ● 現在パブリックベータで無料で試せます ● 試してFBしていきましょう! [チュートリアル ]Deploy a Stack with HCP Terraform

Slide 28

Slide 28 text

宣伝: クラスメソッド主催 IaCウェビナー 28

Slide 29

Slide 29 text

参考 29 ● Terraform Stacks, explained | HashiCorp Blog ● Stacks overview | HashiCorp Documentation ● Deploy a Kubernetes cluster and application | Terraform Tutorials ● Terraform Stacksの構成要素を図解してみる | Developers IO