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

今晩から始めるTerraform

Taisei Ito
November 23, 2019

 今晩から始めるTerraform

Taisei Ito

November 23, 2019
Tweet

More Decks by Taisei Ito

Other Decks in Technology

Transcript

  1. Taisei Ito • Twitter/Github ◦ @kaedemalu • ITコンサル&インフラエンジニア @ Future

    Corp. ◦ GCP & Terraform • 好きなもの ◦ スキー ◦ クラフトビール ◦ カメラ ◦ 食べること
  2. Terraform とは • HashiCorp社製のインフラをコードで管理するツール ◦ Infrastructure as Code(IaC) ▪ ex.)

    AWS Cloudformation • HCL(HashiCorp Configuration Language)という言語で記述 されている ◦ 拡張子は .tf • 様々なベンダーに向けて使用できる ◦ 今日は(もちろん)話しませんが...。
  3. Terraform とは • HashiCorp社製のインフラをコードで管理するツール ◦ Infrastructure as Code(IaC) ▪ ex.)

    AWS Cloudformation • HCL(HashiCorp Configuration Language)という言語で記述 されている ◦ 拡張子は .tf • 様々なベンダーに向けて使用できる ◦ 今日は(もちろん)話しませんが...。
  4. 事前準備 • サービスアカウントの作成 ◦ jsonキーを発行して作業ディレクトリに配置 • 以下のコードを使ってGCEインスタンス作成します provider "google" {

    credentials = file("account.json" ) project = "project-name" } resource "google_compute_instance" "sample_instance" { name = "gdg-instance" zone = "asia-northeast1-a" machine_type = "n1-standard-1" network_interface { network = "default" } boot_disk { initialize_params { image = "debian-cloud/debian-9" } } }
  5. 冪等性をみてみる • タグを付け加えてみます ◦ “foo”と”bar”の2つ provider "google" { credentials =

    file("account.json" ) project = "project-name" } resource "google_compute_instance" "sample_instance" { name = "gdg-instance" zone = "asia-northeast1-a" machine_type = "n1-standard-1" network_interface { network = "default" } boot_disk { initialize_params { image = "debian-cloud/debian-9" } } tags = ["foo", "bar"] }
  6. 便利な機能 • terraform fmt でコードの整形ができる ◦ go fmtと機能的には一緒 provider "google"

    { credentials = file("account.json") project = "project_name" region = "us-central1" } ... provider "google" { credentials = file("account.json") project = "project_name" region = "us-central1" } ... terraform fmt
  7. 便利な機能 • workspaceの利用 ◦ 同一コードでstg or prdなどを分けることができる provider "google" {

    credentials = file("account.json" ) project = "project_name" region = "us-central1" } resource "google_compute_instance" "sample_instance" { name = "${terraform.workspace}-sample-instance" zone = "us-central1-a" machine_type = "n1-standard-1" } インスタンス名を振 り分けられる
  8. 最後に • Terraformを使う時はドキュメント必須!! ◦ リソースなど網羅されている ◦ GUIで使えるパラメーターは揃っている • バージョンで使える機能が変わる ◦

    workspaceは0.12から使えるようになった • リソースの消し忘れがなくなる ◦ terraform destroy で綺麗に削除できる
  9. 最後に • Terraformを使うに当たって公式は必須!! ◦ リソースなど網羅されている ◦ GUIで使えるパラメーターは揃っている • バージョンで使える機能が変わる ◦

    workspaceは0.12から使えるようになった • リソースの消し忘れがなくなる ◦ terraform destroy で綺麗に削除できる • 学習コスト高くない!