24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

terraformの書き方入門(ファイル構成と構文)

Posted at

terraformの書き方をざっくりまとめます。

##基本的な構成

.
├── main.tf   //メインのファイル(リソース作ったりするファイル)
├──valiables.tf  //変数ファイル
└──outputs.tf  //作成したリソースの情報を変数として保持するファイル

terrafirmはカレントディレクトリにある.tfファイルをすべて読むので、一つのファイルにまとめて書いても実行できるがメインの処理と変数を分けて記載しておく。

##各ファイルの記載内容と構文
###main.tf
data
コード内で使うデータを、すでにあるリソースから取得する。

#data "${要求するリソース名:aws_vpc}" "${エクスポートするローカル名:example_name}" 
data "aws_vpc" "example"{
  #要求する条件
  id = "vpc-01b2caf4c15eaab98"
}
data "aws_subnet_ids" "example_subnet" {
#↑のaws_vpcのexampleで指定したid
  vpc_id = data.aws_vpc.example.id
  name   = "aqua-all"
}

resource
これから作成するリソースについて記載する。

resource "aws_network_interface" "interface1" {
  count = 1
  subnet_id = tolist(data.aws_subnet_ids.aqua-all.ids)[count.index]
}

module
利用するリソースの情報を一つにまとめたもの

module "ec2" {
  source = "../../"

  instance_count = 1

  name          = "terraform-test"
  ami           = ${var.ami}
  instance_type = "c5.large"
  subnet_id     = tolist(data.aws_subnet_ids.aqua-all.ids)[0]
  vpc_security_group_ids      = [data.aws_security_group.aqua-all.id]
  associate_public_ip_address = true
  placement_group             = aws_placement_group.web.id

  user_data_base64 = base64encode(local.user_data)

  root_block_device = [
    {
      volume_type = "gp2"
      volume_size = 30
    },
  ]

  ebs_block_device = [
    {
      device_name = "/dev/sdf"
      volume_type = "gp2"
      volume_size = 5
      encrypted   = true
    }
  ]

  tags = {
    "Env"      = "Private"
    "Location" = "Secret"
  }
}

valiables.tf

provider
プロバイダー(どのクラウド環境を使うか)の設定

provider "aws" {
  region = "ap-northeast-1"
}

**locals **
ローカル変数の指定

variable
変数の定義

#variable "${変数名}" 
variable "foo" {}
#default値を指定することもできる。
variable "vpc_cidr" {
  default = "172.16.0.0/16"
}
ここで作成した変数は、${var.変数名}でアクセスできる。
resource "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.vpc_cidr}"
  acl = "private"
}

値の代入方法は
・ 実行時に指定
・ コマンド引数による指定
・ 環境変数による指定
・ 設定ファイルによる指定
の4種類ある。下記参照
https://qiita.com/ringo/items/3af1735cd833fb80da75

outputs.tf

main.tfで作成したリソースの情報を使って他のリソースを作りたい時がある。そのため、作成したリソースの情報を変数として保持して使えるようにするためのファイル。

output
作成したリソースの情報の出力

output "public_dns" {
  #説明書き(任意)
  description = "List of public DNS names assigned to the instances"
  #どのリソースで作成される値かを指定
  value  = module.ec2.public_dns
}

参照

Terraformはサンプルコードも公式ドキュメントも充実しているので、こちらを参照
▼サンプルコード
https://github.com/terraform-providers

▼公式ドキュメント
https://www.terraform.io/docs/configuration/resources.html

24
23
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
24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?