パブリッククラウドサービスが利用されることが当たり前になる中の流れの中で、 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 }
}
コメント