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

Terraform tutorial

Avatar for higashi higashi
June 18, 2020

Terraform tutorial

- 準備
- resource の使い方
- variable の使い方
- datasource の使い方
- module の使い方
- terraform-aws-module の使い方

Avatar for higashi

higashi

June 18, 2020
Tweet

More Decks by higashi

Other Decks in Technology

Transcript

  1. Terraform tutorial •チュートリアルを通して理解できる事 Terraform を使って AWS に簡単なインフラを構築する 方法がなんとなくわかるようになります。 •resource を使ってサービスを構築できる

    •variable を使って resource の値を変数にできる •datasource を使ってリソースから値を参照できる •module を使って resource を抽象化できる •terraform-aws-module を使って簡単に抽象化できる IaC
  2. 準備 •Terraform ファイルのダウンロード あらかじめ用意した Terraform ファイルを Git リポジト リからダウンロードしてください。 IaC

    wget https://github.com/higaTousan/tutorial_terraform/archive/master.zip unzip master.zip cd tutorial_terraform-master
  3. 準備 •接続確認 構築先の AWS アカウントへ接続できるか確認します。 Account の値が構築先 AWS アカウントと同じであれ ば大丈夫です。

    terraform apply 前に必ず aws sts get-caller- identity コマンドで接続先を確認することをお勧めしま す。 IaC aws sts get-caller-identity { "UserId": " ABCDEFGHIJKLMNOPQRST ", "Account": ”123456789012", "Arn": "arn:aws:iam::123456789012:user/higaTousan" }
  4. 準備 •簡単な説明 - .tf ファイル •terraform のメインファイルになります。 •複数に分けてもよいです。 – .tfvars

    ファイル •.tf ファイルで宣言した変数の値を記載したファイル •[ 例 ] region = “ap-northeast-1” – .tfstate ファイル (terraform init 後に生成される) •差分ファイル •Terraform は差分を適切に検出し、必要な分だけ変更し ます。.tfstate の扱いは重要ですが今回は割愛します。 IaC
  5. Terraform の基本 •Terraform を実行するコマンド ファイルを作成した後、実行するコマンドは主に 3 つで す。 – terraform

    init – terraform plan – terraform apply •各コマンドの詳細は resource の使い方で説明 します。 IaC
  6. resource の使い方 •resource とは resource は aws の各コンポーネントを作成するときに 使用する要素です。 例:

    aws_instance その他のリソースはドキュメントを参照してください。 https://www.terraform.io/docs/providers/aws/index.html IaC resource "aws_instance" "web" { ami = "ami-a1b2c3d4" instance_type = "t2.micro" }
  7. resource の使い方 •ディレクトリ内容 – aws.tf …. プロバイダ情報 – vpc.tf …

    VPC の情報 – terraform.tfvars … 変数をまとめたファイル IaC
  8. resource の使い方 •vpc.tf – resource 引数1 引数2 •引数1 … リソースタイプ

    •引数2 … 同じリソースと被らないユニークな名前 https://www.terraform.io/docs/providers/aws/d/vpc.html IaC resource "aws_vpc" "test-vpc" { cidr_block = "10.0.0.0/16" instance_tenancy = "default" enable_dns_hostnames = true tags = { Name = "test-vpc" } }
  9. resource の使い方 •terraform plan テスト実行です。本番実行した場合、何が作成される か表示されます。 IaC $ terraform plan

    <省略> Terraform will perform the following actions: # aws_vpc.test-vpc will be created + resource "aws_vpc" "test-vpc" { + arn = (known after apply) + assign_generated_ipv6_cidr_block = false + cidr_block = "10.0.0.0/16" + default_network_acl_id = (known after apply) + default_route_table_id = (known after apply) + default_security_group_id = (known after apply) + dhcp_options_id = (known after apply) + enable_classiclink = (known after apply) + enable_classiclink_dns_support = (known after apply) + enable_dns_hostnames = true + enable_dns_support = true + id = (known after apply) + instance_tenancy = "default" + ipv6_association_id = (known after apply) + ipv6_cidr_block = (known after apply) + main_route_table_id = (known after apply) + owner_id = (known after apply) + tags = { + "Name" = "test-vpc" } } Plan: 1 to add, 0 to change, 0 to destroy.
  10. resource の使い方 •terraform apply 本番実行です。実際にリソースが作成されます。 確認のメッセージが出ますので、yes と入力すると作成 されます。 IaC $

    terraform apply <省略> Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value:
  11. variable の使い方 •ディレクトリ内容 – aws.tf …. プロバイダ情報 – vpc.tf …

    VPC の情報 – variables.tf … 変数宣言をまとめたファイル – terraform.tfvars … 変数の値をまとめたファイル – .gitignore … リポジトリに push しないファイル一覧 IaC
  12. variable の使い方 •var.region は variables.tf で宣言 aws.tf の上部で変数宣言をしてもよいのですが、私は、 variable.tf に変数をまとめています。やり方は自由です。

    デフォルトの値を us-west-2 として変数に設定してい ます。 IaC variable "region" { description = "AWS region" default = "us-west-2" }
  13. variable の使い方 •terraform.tfvars で値を渡す variable.tf でデフォルト値を決めていますが、最終的に terraform.tfvars で値を渡しています。変数への値の渡 し方は4つあります。 •

    コマンドの引数で渡す • ファイルで渡す • 環境変数で渡す • デフォルト値を渡す ファイルを指定して渡すのが一般的です。 IaC $ cat terraform.tfvars region = "ap-northeast-1"
  14. variable の使い方 •[ 実践 ] VPC CIDR を変数に置き換えよう vpc.tf の

    cidr_block の値を変数に置き換えて、変数に 値を渡してみましょう。 IaC resource "aws_vpc" "test-vpc" { cidr_block = "10.0.0.0/16" instance_tenancy = "default" enable_dns_hostnames = true tags = { Name = "test-vpc" } } output "test-vpc_aws_vpc" { value = aws_vpc.test-vpc.id } region = "ap-northeast-1"
  15. datasource の使い方 •ec2.tf の中身 datasource を使って最新の Amazon Linux2 の AMI

    ID を取得しています。 IaC data "aws_ami" "amazon_linux2" { most_recent = true owners = ["amazon"] filter { name = "name" values = [ "amzn2-ami-hvm-*-x86_64-gp2", ] } filter { name = "owner-alias" values = [ "amazon", ] } } resource "aws_instance" "example" { ami = data.aws_ami.amazon_linux2.image_id instance_type = "t3.micro" subnet_id = aws_subnet.test-subnet.id }
  16. datasource の使い方 •実行 us-west-2 に ec2 が作成されます。 – aws sts

    get-caller-identity – terraform init – terraform plan – terraform apply 確認できたら削除しましょう。 – terraform destroy IaC
  17. module の使い方 •ディレクトリ構成 http_server ディレクトリ配下の main.tf ファイルに http サーバを構築する resource

    をまとめています。module は ec2.tf ファイルから呼び出します。 IaC . ├── README.md ├── aws.tf ├── ec2.tf ├── http_server │ └── main.tf ├── subnet.tf ├── terraform.tfvars ├── variables.tf └── vpc.tf
  18. module の使い方 •http_server/main.tfの中身 main ブランチの ec2_private.tf とほぼ同じですが、呼 び出し元の ec2.tf からインスタンスタイプを指定した

    いので、インスタンスタイプを変数で指定しています。 IaC resource "aws_instance" "default" { ami = data.aws_ami.amazon_linux2.image_id vpc_security_group_ids = [aws_security_group.default.id] instance_type = var.instance_type user_data = <<EOF #!/bin/bash yum install -y httpd systemctl start httpd.service EOF }
  19. module の使い方 •ec2.tf の中身 module と記述し、module の場所を source で指定し ます。ルートディレクトリを指定すると、その配下の

    tf ファイルが読み込まれます。module で指定した変数 (var.instance_type) に値を渡します。 IaC module "dev_server" { source = "./http_server" instance_type = "t3.micro" } output "public_dns" { value = module.dev_server.public_dns }
  20. module の使い方 •実行 – aws sts get-caller-identity – terraform init

    – terraform plan – terraform apply 実行すると、オレゴンリージョンに apache がインストー ルされた Amazon Linux2 が作成されます。 IaC
  21. module の使い方 •EC2 へアクセスしてみる Outputs に public_dns が表示されるのでブラウザでア クセスしてみましょう。Aapache の

    Test Page が表示 されます。 例: http://ec2-12-345-67-89.us-west-2.compute.amazon.com IaC $ terraform apply module.dev_server.data.aws_ami.amazon_linux2: Refreshing state... <省略> Apply complete! Resources: 2 added, 0 changed, 1 destroyed. Outputs: public_dns = ec2-12-345-67-89.us-west-2.compute.amazonaws.com test-vpc_aws_vpc = vpc-12345678901234567
  22. module の使い方 •確認できたら削除しておきましょう。 – terraform destroy IaC $ terraform destroy

    module.dev_server.data.aws_ami.amazon_linux2: Refreshing state... <省略> Plan: 0 to add, 0 to change, 4 to destroy. <省略> Destroy complete! Resources: 4 destroyed.
  23. terraform-aws-module の使い方 •terraform-aws-module の使い方 – module は便利だが作るのが手間 – すでに完成された module

    を利用するのが手取早い Terraform Registry には有志によって作成された module が登録されています。 https://registry.terraform.io/ IaC
  24. terraform-aws-module の使い方 •2種類の module - Terraform Registry – HashiCorp によって検証された

    module – ユーザーコミュニティによって作成された module 「検証済みのモジュールは、承認される前にHashiCorp による認定および互換性テストを受けており、信頼でき るHashiCorpパートナーによって保守されています。」 There are two categories of modules available in the Module Registry: Verified modules and Community modules. Verified modules have undergone certification and compatibility testing by HashiCorp prior to being accepted and are maintained by trusted HashiCorp partners. Community modules can be contributed by any user, but have not been validated by HashiCorp directly. (https://www.hashicorp.com/blog/hashicorp-terraform-module-registry/ ) IaC
  25. terraform-aws-module の使い方 •ec2.tf IaC data "aws_ami" "amazon_linux2" { most_recent =

    true owners = ["amazon"] filter { name = "name" values = [ "amzn2-ami-hvm-*-x86_64-gp2", ] } filter { name = "owner-alias" values = [ "amazon", ] } } module "ec2" { source = "terraform-aws-modules/ec2-instance/aws" instance_count = 1 name = "test-ec2" ami = data.aws_ami.amazon_linux2.image_id instance_type = "t3.micro" subnet_id = aws_subnet.test-subnet.id }
  26. terraform-aws-module の使い方 使いたい module を Terraform Registry で見つけ出し、module 要素の source

    で使用するモジュールを指定します。 例: source = “terraform-aws-modules/ec2-instance/aws” terraform init のタイミングで module がダウンロードされます。 IaC module "ec2" { source = "terraform-aws-modules/ec2-instance/aws" instance_count = 1 name = "test-ec2" ami = data.aws_ami.amazon_linux2.image_id instance_type = "t3.micro" subnet_id = aws_subnet.test-subnet.id }
  27. terraform-aws-module の使い方 instance_count, name などその他のインプット情報は module ページの Inputs を 参照するとよいです。

    terraform-aws-modules/ec2-instance というモジュールを使用 ( https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/2.15.0?tab=inputs ) 少ない記述で ec2 が起動します! IaC module "ec2" { source = "terraform-aws-modules/ec2-instance/aws" instance_count = 1 name = "test-ec2" ami = data.aws_ami.amazon_linux2.image_id instance_type = "t3.micro" subnet_id = aws_subnet.test-subnet.id }
  28. terraform-aws-module の使い方 •実行 – aws sts get-caller-identity – terraform init

    – terraform plan – terraform apply 実行すると、オレゴンリージョンに ec2(test-ec2) が 作成されます。 IaC
  29. tfstate IaC •tfstate とは – Terraform が管理するインフラの状態を保存した ファイル – JSON

    形式 – terraform apply 時に自動生成(更新)される – apply 時に tfstate ファイルから前回のインフラの 状態と TF ファイルの内容との差分をみて plan 結 果を出力する – デフォルトの保存場所は コマンドを実行した場所
  30. tfstate IaC •tfstate にある/なしで実行する挙動が変わる tfstate は前回コマンドを実行した時のインフラの状態 が記録されています。tfstate と tf ファイルの差をみて

    実行の挙動がかわります。 tf ファイルに tfstate に リソースと tf の差異 plan 結果は ある ある ない なにもしない ある ある ある 更新する ある ない 差異は確認しない 新規作成する ない ある 差異は確認しない 削除する 表: the world as code 「 Terraform state 概論 」より参照 https://chroju.github.io/blog/2019/12/13/terraform_state_introduction/
  31. AWS tfstate IaC tfstate tf ec2 ec2 terraform apply 記録

    部長!サーバ2台追 加で立ててください。
  32. AWS tfstate IaC tfstate tf ec2 ec2 ec2 ec2 3台追加に

    なっちゃった よ!! ec2 ec2 ec2 記録 あれれ、なんで?! ec2 部長!なにやってん すか!!!2台追 加ですよ!!
  33. tfstate IaC •tfstate は共有しましょう – Terraform Backend S3 Backends type

    S3 https://www.terraform.io/docs/backends/types/s3.html [qiita] Backend の S3 や DynamoDB 自体を terraform で管理するセットアップ方法 https://qiita.com/saiya_moebius/items/a8f8aa3683c2347d607c terraform { backend "s3" { bucket = "S3バケット名” key = "terraform.tfstate” region = ”ap-northeast-1” lock_table = "DynamoDBテーブル名" } }