「TerraformのModuleを作成してみた」

1.9K Views

May 29, 23

スライド概要

2019年12月19日
ビヨンド社内勉強会 #4
システムソリューション部 SREチーム
寺岡 佑樹

profile-image

日本・中国・カナダを拠点に、AWS や GCP・Azure などのマルチクラウドに対応した、クラウド / サーバーの構築・移行、24時間365日の運用保守 / 監視、負荷テスト、Webシステム開発、サーバーサイド / API 開発 など、クラウド / サーバーに特化したサービスをご提供いたします。 ● コーポレートサイト https://beyondjapan.com ● YouTube https://www.youtube.com/c/beyomaruch ● X(Twitter) https://twitter.com/beyondjapaninfo ● Instagram https://www.instagram.com/beyondjapan_24365

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

TerraformのModuleを作成してみた 社内勉強会 #4 2019/12/18 株式会社ビヨンド 寺岡 佑樹

2.

自己紹介 resource “my_profile” “nezumisannn” { name = “Yuki.Teraoka” nickname = “ねずみさん家。” } company = “beyond” job = “Site Reliability Engineer” twitter = “@yktr_sre” skills = [“terraform”,”packer”]

3.

Terraformとは

4.

Terraformとは ・インフラオーケストレーションツール ・コードを記述してインフラの構築を行う ・コードの記述はHCLと呼ばれる独自言語で記述する ・Hashicorpが開発したOSSでGolangで記述されている

5.

Moduleを書く理由

6.

Moduleを書く理由 ・コードの再利用性を高める ・よく使うリソースを抽象化する ・インフラエンジニアでもコードを書けるようになると良い

7.

実際に書いてみる

8.

実際に書いてみる ・AWSのVPCを作成するモジュールを書いてみる https://nezumisannn.io/blog/terraform-module-vpc/

9.

. ├── network │ モジュール側 └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf 呼び出し側

10.

. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf

11.

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"

12.

. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf

13.

呼び出し側 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が作成される

14.

. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf

15.

モジュール側 ・呼び出し元から渡ってきた変数を受け取る ・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 }) }

16.

. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf

17.

モジュール側 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リソースを記述する ・各項目の値は呼び出し元から渡ってきた変数 の値を格納する

18.

. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf

19.

モジュール側 output "vpc" { value = aws_vpc.this } ・モジュールの処理で作成されたリソースの情報を呼び出し側に返す ・ver0.11では1outputに対して1つの値しか返せなかった ・ver0.12では1outputで複数の値を返すことができる ・返り値の型もobject型

20.

. ├── network │ └── vpc │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── network.tf ├── outputs.tf ├── provider.tf ├── terraform.tfstate ├── terraform.tfstate.backup └── variables.tf

21.

モジュール側 output "vpc_id" { value = module.vpc.vpc.id } ・モジュール側から返された値を受け取る ・module.[module_name].[object_name].[object_key]とすることで 返されたobjectの中から特定の値を出力することができる

22.

ここまで書いたら

23.

ここまで書いたら ・terraform init ・terraform plan ・terraform apply ・terraform destroy

24.

最後に

25.

最後に ・手が足りないのでModuleを書くの手伝ってください。。。 ・AWSだけでもなるはやで運用に乗せたい。。。

26.

終わり