サンプルプロジェクトの作成

  ここまででTerraform のインストール方法を学びました。それではサンプルプロジェクトを作成します。簡単なWebサーバを立ち上げながら、Terraformの流れや中身を確認します。

1. ディレクトリ・ファイル構成

  Terraformのファイルの拡張子は *.tf です。実行時、同じディレクトリの *.tf ファイルがマージされますので、基本は以下3ファイルに分けてそれぞれの用途・目的に応じた記載・運用がベターです。

main.tf  … モジュールが内包するリソース、データソースなどの定義
outputs.tf  … モジュールが出力するAttributeの定義
variables.tf  … モジュールが受け取る変数の定義

main.tf には どのプロパイダを使うかを記載します。 階層化は任意ですが、.tfから別のフォルダの.tfに記載されてる変数を取り出すためにルートディレクトリを指定することがありますのでそこは注意が必要です。apply (=実行) にて分離実行することも可能です。 例えば以下のようにプロダクトサービス毎にフォルダを作成し、それぞれのリソースを作成しても、最終的には一つへまとめれます。

├── main.tf
├── output.tf
├── variables.tf
│
├── region
│├── VPC
││├── main.tf
││├── output.tf
││└── variables.tf
││
│├── ECS
││├── main.tf
││├── output.tf
││└── variables.tf
 ・
 ・
 ・

  RAMなど他者へ渡したくない情報がある場合、別途設定ファイル( confing.tfvars など)へ記載し、実行時は -var-file引数で 設定ファイルを読み取り実行することができます。

├── main.tf
├── output.tf
├── variables.tf
├── confing.tfvars
│
├── region
│├── VPC
││├── main.tf
││├── output.tf
││└── variables.tf
││
│├── ECS
││├── main.tf
││├── output.tf
││└── variables.tf
 ・
 ・
 ・

▼設定ファイル confing.tfvars の中身

access_key = "xxxxxxxxxxxxxxxxxx"
secret_key = "xxxxxxxxxxxxxxxxxx"
region = "ap-northeast-1"
zone = "ap-northeast-1a"

  記載した設定ファイルconfing.tfvars を紐つけて実行するには以下のコマンドで実行します。詳細は以下にて後述します。

▼設定ファイルconfing.tfvars を紐つけて実行する方法

$ terraform plan -var-file="confing.tfvars"
$ terraform apply -var-file="confing.tfvars"


2. リソースの作成

  事前準備として、まずは適当なディレクトリに main.tf というファイルを作ります。

▼リソースの作成

$ mkdir ECS
$ cd ECS
$ touch main.tf

2.1 HCL (HashiCorp Configuration Language)

  Terraformのコードは HashiCorp社が設計したHCL(HashiCorp Configuration Language)という言語で実装しています。VPCやセキュリティグループ、ECSインスタンスのようなリソースは「resource」ブロックで定義します。

  上記 2 で作成した main.tf をエディタで開き、下記のように実装します。このコードはAlibaba CloudとしてVPC作成、セキュリティグループ設定、CentOS 7.4 のImageID をベースとしたECSインスタンスを作成します。

▼ECS インスタンス起動 main.tf の中身

variable "access_key" {}
variable "secret_key" {}
variable "region" {}
variable "zone" {}

provider "alicloud" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

resource "alicloud_vpc" "vpc" {
  name = "ECS_instance_for_terraform-vpc"
  cidr_block = "192.168.1.0/24"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id            = "${alicloud_vpc.vpc.id}"
  cidr_block        = "192.168.1.0/28"
  availability_zone = "${var.zone}"
}

resource "alicloud_security_group" "sg" {
  name   = "ECS_instance_for_terraform-sg"
  vpc_id = "${alicloud_vpc.vpc.id}"
}

resource "alicloud_security_group_rule" "allow_http" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "80/80"
  priority          = 1
  security_group_id = "${alicloud_security_group.sg.id}"
  cidr_ip           = "0.0.0.0/0"
}

resource "alicloud_instance" "ECS_instance" {
  instance_name   = "ECS_instance_for_terraform"
  host_name       = "ECS_instance_for_terraform"
  instance_type   = "ecs.n4.small"
  image_id        = "centos_7_04_64_20G_alibase_201701015.vhd"
  system_disk_category = "cloud_efficiency"
  security_groups = ["${alicloud_security_group.sg.id}"]
  availability_zone = "${var.zone}"
  vswitch_id = "${alicloud_vswitch.vsw.id}"
  user_data = "${file("provisioning.sh")}"
}

  ユーザデータ provisioning.sh も以下のように作成します。ECS起動後、実行してくれる処理内容になります。

▼ユーザデータ provisioning.sh の中身

#!/bin/sh
yum install -y httpd
systemctl start httpd
systemctl enable httpd

2.2 AlibabaCloudリソースの意味と説明

  上記リスト 2.1で作成したAlibabaCloudリソースについて説明します。Terraformに各種リソースを作成させるのはresource変数です。resource変数はリソース名と識別名を指定し、括弧の中にて実行内容を記載します。

2.3 variable “xxxxx” {} (外部変数)

  RAMなどの情報を他ユーザへ渡したくない場合、別途設定ファイル confing.tfvars へ以下の内容を記載します。variableは宣言変数です。この設定ファイルconfing.tfvars をリンクし実行した時、confing.tfvars の変数を外部変数として読み取ってくれます。

variable "access_key" {}
variable "secret_key" {}
variable "region" {}
variable "zone" {}

2.4 provider

  TerraformはAlibabaCloudだけでなく AWSやGCP、Azureなどにも対応しています。各クラウドサービス毎に機能や構成が全く違いますが、それを抑えるのがprovider変数の役割です。provider変数は変更することができます。

provider "alicloud" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

  Terraformを実行するためのRAMアクセスキーおよびセキュリティキーです。こちらは別途設定ファイル confing.tfvars から外部変数としてリンクします。

access_key = "${var.access_key}"
secret_key = "${var.secret_key}"

  以下はリージョンを定義します。リージョンごとに使えるサービス・使えないサービス、機能、制限事項や仕様がありますので、必ず指定する必要があります。

region = "${var.region}"

2.5 VPC

  VPCを作成するコードです。

resource "alicloud_vpc" "vpc" {
  name = "ECS_instance_for_terraform-vpc"
  cidr_block = "192.168.1.0/24"
}

  上記で記載したリソース以外にオプション(任意)でパラメータや構成を指定することもできます。

  このリソースを実行することにより、以下のVPC属性情報が出力されます。

  詳しくはAliCloudのterraform-VPCリファレンスを参照してください。

2.6 VPC_SWITCH

  VPC_SWITCHを作成するコードです。

resource "alicloud_vswitch" "vsw" {
  vpc_id            = "${alicloud_vpc.vpc.id}"
  cidr_block        = "192.168.1.0/28"
  availability_zone = "${var.zone}"
}

  VPC_SWITCHも上記で記載したリソース以外にオプション(任意)でパラメータや構成を指定することもできます。

  このリソースを実行することにより、以下のVPC_SWITCH属性情報が出力されます。

  詳しくはAliCloudのterraform-VPC_SWITCHリファレンスを参照してください。

2.7 セキュリティグループ

  セキュリティグループを作成するコードです。

resource "alicloud_security_group" "sg" {
  name   = "ECS_instance_for_terraform-sg"
  vpc_id = "${alicloud_vpc.vpc.id}"
}

  セキュリティグループも同様、上記で記載したリソース以外にオプション(任意)でパラメータや構成を指定することもできます。

  このリソースを実行することにより、以下の属性情報が出力されます。

  詳しくはAliCloudのterraform-セキュリティグループ リファレンスを参照してください。

2.8 セキュリティグループルールリソース

  先ほどはセキュリティグループを宣言しましたが、ルールは別途記載する必要があります。セキュリティグループルールリソースを作成・実装するコードです。

resource "alicloud_security_group_rule" "allow_http" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "80/80"
  priority          = 1
  security_group_id = "${alicloud_security_group.sg.id}"
  cidr_ip           = "0.0.0.0/0"
}

  セキュリティグループルールも同様、上記で記載したリソース以外にオプション(任意)でパラメータや構成を指定することもできます。

  このリソースを実行することにより、以下の属性情報が出力されます。

  詳しくはAliCloudのterraform-セキュリティグループルール リファレンスを参照してください。

2.9 ECSインスタンスリソース

  先ほどはVPCやセキュリティグループを作成しました。今度はECSインスタンスを作成してみます。

resource "alicloud_instance" "ECS_instance" {
  instance_name   = "ECS_instance_for_terraform"
  host_name       = "ECS_instance_for_terraform"
  instance_type   = "ecs.n4.small"
  image_id        = "centos_7_04_64_20G_alibase_201701015.vhd"
  system_disk_category = "cloud_efficiency"
  security_groups = ["${alicloud_security_group.sg.id}"]
  availability_zone = "${var.zone}"
  vswitch_id = "${alicloud_vswitch.vsw.id}"
}

  ECSインスタンス生成リソースは多くのオプション(任意)でパラメータや構成を指定できます。ECSインスタンスはVPCやセキュリティグループとは少し異なり、OSやバージョン選定、起動時データ引き渡しやECS使い捨て利用など様々な利用方法が実現出来るため、ここは抑えておきましょう。

  このリソースを実行することにより、以下の属性情報が出力されます。出力された属性情報をベースに他のリソースを作ることも可能です。

  他、ECSに関しては様々な入出力オプションが備わってるため、RDSやOSSなど様々なサービスと連携することも可能です。詳しくはAliCloudのterraform-ECSインスタンス リファレンスを参照してください。

2.10 他のリソースについて

  ここまではリソースのソースコードについて説明しました。他プロダクトサービスのリソースソースコード作成についてはHashiCorpによるAlibabaCloudのTerraformガイドラインを参照のうえ、各自作成してみてください。本ガイドラインにもいくつかのサンプルコードを準備しています。