コンテンツにスキップ

Terraform - Resource

概要

main.tfなどでresourceとして構築するインフラストラクチャオブジェクトを定義する方法について、詳細をまとめます

全体像

以下にVPCとsubnetを作成する例を示します

resource "aws_vpc" "my_vpc" {
  cidr_block = "172.16.0.0/16"

  tags = {
    Name = "tf-example"
  }
}

resource "aws_subnet" "my_subnet" {
  vpc_id            = aws_vpc.my_vpc.id
  cidr_block        = "172.16.10.0/24"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "tf-example"
  }
}

基本構文

resource "<リースの種類>" "<リソース名>" {・・・}の形式でリソースを定義します

  1. <リソースの種類>

    構築したいインフラストラクチャオブジェクトを定義します
    プロバイダ毎に定義されているので、ドキュメントを参照して記述します

  2. <リソース名>

    Terraform上でリソース情報を管理するための名称となります
    実環境に反映されるといったことはありません 各リソースを管理するため、実行単位で一意である必要があります

  3. {・・・}

    リソース毎にパラメータを記述します
    構築したいリソースがどのようなパラメータを持つかはドキュメントを参照します
    記述方法よりも構築対象のことをどれだけ理解できているかが重要です
    実際に手で構築してみて設定した内容とドキュメントのパラメータを照らし合わせるとより理解が進みます
    なお、パラメータによってデフォルト値が定義されていますが、プロバイダ側のデフォルト値と異なるケースもあるので注意が必要です

参照

<リソースの種類>.<リソース名>.paramの形式でリソースのパラメータを参照できます
全体像で例示したように、構築するインフラストラクチャによっては依存関係が存在します

  • 例)subnetを作成するには先にVPCを作成し、そのVPC-IDをパラメータとして渡す

こういったケースでは、依存先リソースのパラメータを指定する必要があり、そういった場面で参照を行います
Terraformは、記載されたリソースの依存関係を自動的に識別し、どのリソースから作成するかを自動的に判別/構築してくれます

ケースによっては、依存関係を明示する必要があるので、そうったケースではdepends_on = <リソースの種類>.<リソース名>というパラメータで先に構築すべきリソースを明言することも可能です

  • 例)セキュリティグループAはセキュリティグループBをインバウンドルールで許可する

循環参照

以下の例のようにお互いがお互いのリソースを参照するような場合、Terraformは循環参照としてエラーを返しリソースの構築ができないケースがあります

  • セキュリティグループAはセキュリティグループBをインバウンドで許可する
  • セキュリティグループBはセキュリティグループAをアウトバウンドで許可する

このようなケースの場合、どちらのリソースを先に構築すべきかをTerraformが判別できず、エラーとなるので留意する必要があります
上記の例でいえば、

  1. セキュリティグループA/Bにルールを指定せずに作成
  2. 作成したセキュリティグループにルールをあとから定義する

といったかたちで回避することができます
循環参照が発生した場合はなにがなにを参照しているかを確認し、相互依存しないようにリソースの定義を見直しましょう

変数

リソースに指定するパラメータの値は変数を利用できます
リソースと同一ファイル上で記述できますが、管理が煩雑になるために分離することが一般的です
変数についての詳細は、04_Variablesで説明します