Terraformについて

Terraform

パブリッククラウドサービスが利用されることが当たり前になる中の流れの中で、 Infrastructure as a Codeというインフラストラクチャ構造をコード化するための Terraform などのツールが流行しているかと思います。

そこで、この記事で Terraform について、記載していきたいと思います。

Terraformとは?

Terraform とはAWS/GCPといったパブリッククラウドサービスのインフラ構造をコード化できるツールになります。サポートされているプラットフォームはこちらになります。

主要ディレクティブ一覧

  • Provider
  • Resources
  • Modules
  • Data Sources

Provider

Provider ブロックでは、各種インフラリソースを展開するターゲットのプロバイダー(AWS/GCP/Kubernetes)を設定します。

以下は、AWSを利用する場合のサンプルになります。

provider "aws" {
  access_key = "<access_key_value>"
  secret_key = "<secret_key_value>"
  region     = "<target_region_value>"
  ...
}

Resources

Resource ブロックは、Terraformの中で最も重要な要素になります。それぞれのResourceブロックでインフラオブジェクト(VPC/インスタンス/Security Group/etc...)を定義することができます。

以下は、AWSのEC2インスタンスを定義しているサンプルになります。

resource "aws_key_pair" "instance_key" {
  key_name   = "instance-key"
  public_key = file("./keypair/instance-key.pub")
}

resource "aws_instance" "nginx" {
  ami           = var.INSTANCE_AMI
  instance_type = "t2.micro"
  key_name = aws_key_pair.instance_key.key_name

  user_data = data.template_file.userdata.rendered
  lifecycle { create_before_destroy = true }
}

Modules

Module ブロックでは、モジュールは、複数のリソースをまとめて使用するためのコンテナのようなものです。

Moduleは、.tfファイルや.tf.jsonファイルをディレクトリにまとめたものです。

Source の値にて、複数のリソースをまとめて利用することができるように定義されています。

また、同じディレクトリに存在するファイル内にあるリソースについても利用することができます。

module "consul" {
  source   = "github.com/wardviaene/terraform-consul-module.git?ref=terraform-0.12"
  key_name = aws_key_pair.mykey.key_name
  key_path = var.PATH_TO_PRIVATE_KEY
  region   = var.AWS_REGION
  vpc_id   = aws_default_vpc.default.id
  subnets = {
    "0" = aws_default_subnet.default_az1.id
    "1" = aws_default_subnet.default_az2.id
    "2" = aws_default_subnet.default_az3.id
  }
}

Data Sources

Data sources ブロックでは、Terraform構成の他の場所で使用するためにデータを取得、または一定の処理をすることができます。

Data Sourcesの使用は、Terraformの外部で定義された情報、または別のTerraformの設定で定義された情報をTerraformの設定で利用することを可能にします。

以下は、インスタンス作成時に、nginxを初期化する外部スクリプトをインスタンスに渡し、実行しているサンプルになります。

data "template_file" "userdata" {
  template = file("./scripts/nginx-init.sh")
}

resource "aws_key_pair" "instance_key" {
  key_name   = "instance-key"
  public_key = file("./keypair/instance-key.pub")
}

resource "aws_instance" "nginx" {
  ami           = var.INSTANCE_AMI
  instance_type = "t2.micro"
  key_name = aws_key_pair.instance_key.key_name

  user_data = data.template_file.userdata.rendered
  lifecycle { create_before_destroy = true }
}

コメント

タイトルとURLをコピーしました