LoginSignup
3
1

More than 3 years have passed since last update.

Terraformを2ヶ月学んで覚えたことを自分なりにoutputする(基礎編)

Last updated at Posted at 2019-12-13

自分がこの2ヶ月前後で学んだ内容について記載します。(基礎編。 長くなるため、応用的な話はまた次回。)
ただ、個人的主観も入れてあるため、何かあれば突っ込んでもらえるとありがたいです。
また、基本的な話しかしない(これを読むと、何が書かれているのかが少しでもわかるようになる想定です。)ため、突っ込んだ話はやりません。 興味がある方は教科書を読んでみるといいです(わかりやすくてすごくおすすめ)

使った教科書

実践TerraformはPragmatic terraform on AWSの増量版(カラー印刷)。
なので、買うなら実践Terraformをおすすめする。

基礎的なお話

単語の名称について

以下の単語を多用するため、事前にその意味を記載する

  • provider
    • 使用するサービスのこと。 AWSやGCPなどを指す。
  • resource
    • EC2やECSなどユーザがコンソール上で操作できる要素を指す。

tfStateファイルについて

  • terraformの構成を記述したファイル。 .terraform/にあります
  • このファイルをもとにresourceの追加や削除が行われるため、基本的には触らないのがおすすめ。

使用するコマンドについて

  • terraform init
    • まずはじめに実行するであろうコマンド。
    • terraformで設定している内容(providerやbackendなどの設定)の初期化を行ってくれる。
    • ちなみにproviderやbackendを変更したときは必ず実行しないといけない
  • terraform plan
    • 書いたterraformコードをもとに実行計画(providerでどう反映されるかをまとめたもの)が作られる。
    • 実行計画の見方
      • +resourceが追加される
      • -resourceが削除される
      • -/+はresourceが再構築される(※この変更が一番危険なため、出てたら要注意)
    • 反映自体はまだされないので、安心して実行しよう。
  • terraform apply
    • 実際にproviderに反映する。
    • Terraform applyして初めて気づくエラーも多々ある(例: サブネットの競合など)
    • やるときは実行計画を入念に確認して実行しよう
  • terraform destory
    • terraformで構築した内容をすべて削除する
    • terraformで構築した箇所をprovider側で変更した場合、削除できなくなるので注意

コードで記載する内容について

  • 基本的な構文 以下の通り。
  定義する要素 "要素の名前(何でもOK)" {
    オプション = "値"
  }
  • providerについて
    • terraformで使用するproviderを設定する。
  provider "aws" {
    region = "ap-northeast-1"
  }
  • backendについて
    • tfstateファイルをproviderのステート管理サービスに格納することができる
    • このメリットについてはリモートステートを参照。
  terraform {
    backend "s3" {
      region = "ap-northeast-1"
      bucket = "hoge-terraform"
      key    = "hoge-network.tfstate"
    }
  }
  • resourceについて
    • EC2やECSなどユーザがコンソール上で操作できる要素を構成する。
    • 主にresourceを記述して、設定を入力していく。
  // サブネットを構成するresource
  resource "aws_subnet" "hoge_subnet" {
    count                   = 1
    vpc_id                  = 'hogehoge'
    availability_zone       = 'hogehoge'
    cidr_block              = '10.12.111.111'
    map_public_ip_on_launch = false

    tags = {
      Name = hoge_subnet
    }
  }
  • dataについて
    • providerにある既存のリソースを取得できるブロック。
    • 既存のリソースのidを参照して構築したい場合に使用する
  data "terraform_remote_state" "データ名" {
    backend = "s3"

    config = {
      region = "ap-northeast-1"
      bucket = "hoge-hoge-terraform"
      key    = "hoge-vpc.tfstate"
    }
  }
  • variableについて
    • terraformで設定できる変数。
    • 実行時に変数の上書きが可能。(コマンド実行時に変数を設定して実行することができるため)
    • 変数の実体はtfvarsで管理する(詳しくは応用的な話を参照)
    • たとえ自明であってもdescriptionはつけておくことをおすすめする。
    • 変数がどの型で来るのかを明示的に表示させることも可能(バリデーションの役割にもなる)
    • 型は以下の通り(あくまで一例。 詳しくはこちらを参照)
      • string
      • number
      • bool
      • List(Type)
  variable "変数名" {
    description = "設定する環境の接頭語"
    type = string
  }
  • localについて
    • terraformで設定できる変数
    • variableとは違い、コマンド実行時に上書きできない変数。
  locals {
    hogehoge = "hoge"
  }
  • outputについて
    • resourceの実行結果を表示するブロック。
    • 後述するmoduleの値から値を取得したいときに使用される
    • descriptionはつけておいたほうがいい(なんの値なのかを明示させるため)
  output "hogehoge_subnet_id" {
    description = "hogehoge用プライベートサブネットのid"
    value       = aws_subnet.hoge_private_subnet.id
  }
  • moduleについて
    • resource, dataなどの塊を再利用可能にさせるために使用する。
    • 読み込むリソースのパス、 module内で使用されているvariableを設定し、構築できる
  module "manage_public_subnet" {
    source                 = "./hoge"
    name                   = hoge
    vpc_id                 = "hogehoge"
    availability_zones     = "hogehoge"
    cidr_blocks            = ["10.10.111.111", "10.10.111.112"]
    gateway_id             = "hogehoge"
    destination_cidr_block = "10.11.111.111"
  }

以上。
応用的な話はまた次回書きます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1