Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Terraform Stacks入門 #HashiTalks

msato
November 14, 2024

Terraform Stacks入門 #HashiTalks

HashiTalks Japan 2024「Terraform Stacks入門」の資料です。

HashiConf 2024 でTerraform Stacksがパブリックベータになりました。
Terraform Stacksを使うことで、複数Workspaceが必要な構成を簡単に構築できます。
本セッションでは、以下の内容を解説します。
1. Stacksの基本概念と従来のTerraformワークスペースとの違い
- Stacksが解決する課題と利点
- 従来のワークスペース管理との比較
- Stackの導入によるワークフローの変化
2. Stacksの構成要素、基本機能
- Deployments,Components,Orchestration rules,Deferred changes
- 各定義ファイル(tfdeploy.hcl,tfstack.hcl, component block,deployment block)
- Tfstacks CLIの使い方
3. Stacksのユースケース
- マルチ環境(開発、ステージング、本番)の効率的な管理
- 依存関係を考慮したデプロイ

新機能Terraform Stacksが気になっている方に、おすすめのセッションです。

msato

November 14, 2024
Tweet

More Decks by msato

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 2 resource “my_profile” “this” { name = “佐藤雅樹” x

    = “@chari7311” company = “クラスメソッド株式会社” department = “ソリューションアーキテクト” }
  2. Terraform Stacksとは 9 • 機能: 複数Workspaceが必要なインフラ環境の管理を効率化‧簡素化 • フェーズ: パブリックベータ -

    HashiConf 2023で発表(プライベートプレビュー) - HashiConf 2024でパブリックベータ版を発表 • 注意事項 - HCP Terraformで利⽤可能(コミュニティ版への組み込みも予定あり) - 500 Resourceまでの制限あり(Standard‧Plusプランでも同様) ※本スライドの情報は、2024/11時点の情報になります。
  3. Terraform Stacks使い⽅ サンプル構成 11 サンプル構成 • API Gateway + Lambda

    + S3 • マルチアカウント構成 - 環境毎にアカウントを分割 • マルチリージョン構成 - PRODとSTGはマルチリージョン - DEVはシングルリージョン
  4. Components 13 スタックに含めるリソースを定義 component "s3" { for_each = var.regions source

    = "./s3" providers = { aws = provider.aws.configurations[each.value] random = provider.random.this } } component.tfstack.hcl
  5. 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)
  6. Deployments 15 デプロイ先を定義 deployment "prod" { inputs = { regions

    = ["us-east-1", "us-west-1"] role_arn = "<PRDアカウント IAM Role ARN>" identity_token = identity_token.aws.jwt } } deployment "stg" { inputs = { regions = ["us-east-1", "us-west-1"] role_arn = "<STGアカウント IAM Role ARN>" identity_token = identity_token.aws.jwt } } # 省略(dev) deployments.tfdeploy.hcl
  7. ├── 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
  8. Orchestration rules 22 # Production環境以外⾃動承認 orchestrate "auto_approve" "no_prod" { check

    { condition = context.plan.deployment != deployment.prod reason = "Not automatically approved prod." } } deployment.tfdeploy.hcl
  9. 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する必要がある)
  10. Deferred changes 25 provider "kubernetes" "main" { config { host

    = component.cluster.cluster_url # 省略(CAやToken) } } provider.tfstack.hcl EKSデプロイ前のk8sリソースのPlanは⾃動で延期される。
  11. 参考 29 • Terraform Stacks, explained | HashiCorp Blog •

    Stacks overview | HashiCorp Documentation • Deploy a Kubernetes cluster and application | Terraform Tutorials • Terraform Stacksの構成要素を図解してみる | Developers IO