1.9K Views
May 29, 23
スライド概要
2019年12月19日
ビヨンド社内勉強会 #4
システムソリューション部 SREチーム
寺岡 佑樹
日本・中国・カナダを拠点に、AWS や GCP・Azure などのマルチクラウドに対応した、クラウド / サーバーの構築・移行、24時間365日の運用保守 / 監視、負荷テスト、Webシステム開発、サーバーサイド / API 開発 など、クラウド / サーバーに特化したサービスをご提供いたします。 ● コーポレートサイト https://beyondjapan.com ● YouTube https://www.youtube.com/c/beyomaruch ● X https://x.com/beyondjapaninfo ● Instagram https://www.instagram.com/beyondjapan_24365
TerraformのModuleを作成してみた 社内勉強会 #4 2019/12/18 株式会社ビヨンド 寺岡 佑樹
自己紹介 resource “my_profile” “nezumisannn” { name = “Yuki.Teraoka” nickname = “ねずみさん家。” } company = “beyond” job = “Site Reliability Engineer” twitter = “@yktr_sre” skills = [“terraform”,”packer”]
Terraformとは
Terraformとは ・インフラオーケストレーションツール ・コードを記述してインフラの構築を行う ・コードの記述はHCLと呼ばれる独自言語で記述する ・Hashicorpが開発したOSSでGolangで記述されている
Moduleを書く理由
Moduleを書く理由 ・コードの再利用性を高める ・よく使うリソースを抽象化する ・インフラエンジニアでもコードを書けるようになると良い
実際に書いてみる
実際に書いてみる ・AWSのVPCを作成するモジュールを書いてみる https://nezumisannn.io/blog/terraform-module-vpc/
. ├── network │ モジュール側 └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf 呼び出し側
. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf
variables.tf variable "access_key" { 呼び出し側 provider.tf description = "AWS Access Key" 変数の値は環境変数から 読み込まれる } provider "aws" { variable "secret_key" { access_key = var.access_key description = "AWS Secret Key" secret_key = var.secret_key } region variable "role_arn" { = var.region 環境変数名にTF_VAR_と いうprefixをつける TF_VAR_access_keyなど description = "AWS Role ARN for Assume Role" assume_role { role_arn = var.role_arn } variable "region" { description = "AWS Region" } default } } = "ap-northeast-1"
. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf
呼び出し側 module "vpc" { source = "./network/vpc" vpc_config = { name = "example" cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true } } ・sourceで読み込むモジュールの相対パスを指定する ・VPC作成に必要な値をobject型でモジュールに渡す ・モジュール側の処理は抽象化されているため 必要な値を渡すだけでVPCが作成される
. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf
モジュール側 ・呼び出し元から渡ってきた変数を受け取る ・ver0.11では1変数につき1つのデータ型しか扱えなかった ・ver0.12からobjectという型が追加されたため 異なる複数のデータ型を同時に扱えるようになった variable "vpc_config" { type = object({ name = string cidr_block = string enable_dns_support = bool enable_dns_hostnames = bool }) }
. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf
モジュール側 resource "aws_vpc" "this" { cidr_block = var.vpc_config.cidr_block enable_dns_support = var.vpc_config.enable_dns_support enable_dns_hostnames = var.vpc_config.enable_dns_hostnames tags = { Name = var.vpc_config.name } } ・VPCリソースを記述する ・各項目の値は呼び出し元から渡ってきた変数 の値を格納する
. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf
モジュール側 output "vpc" { value = aws_vpc.this } ・モジュールの処理で作成されたリソースの情報を呼び出し側に返す ・ver0.11では1outputに対して1つの値しか返せなかった ・ver0.12では1outputで複数の値を返すことができる ・返り値の型もobject型
. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf
モジュール側 output "vpc_id" { value = module.vpc.vpc.id } ・モジュール側から返された値を受け取る ・module.[module_name].[object_name].[object_key]とすることで 返されたobjectの中から特定の値を出力することができる
ここまで書いたら
ここまで書いたら ・terraform init ・terraform plan ・terraform apply ・terraform destroy
最後に
最後に ・手が足りないのでModuleを書くの手伝ってください。。。 ・AWSだけでもなるはやで運用に乗せたい。。。
終わり