Terraformとは、HashiCorp社により開発されているオープンソースのインフラ自動構築ツールです。
AWSなどのクラウドサービス上のインフラリソース(サーバやネットワークなど)をコードで定義することで、
オペレーションミスを防ぎ、インフラ構築作業の効率化を図ることが出来ます。
業務でがっつりインフラ構築をする機会はないのですが、多少は知識がないと色々と業務に支障があるので、
まずは最初の一歩ということで、Terraform + AWSのチュートリアルをやってみました。
チュートリアルの紹介
Get Started - AWS8つのセクションに分かれていて、大体1時間程で終わるかと思います。
特にハマるポイントもなく、terraform applyを実行するとTerraformでEC2インスタンスを作成・更新が出来るので、terraformでインフラ構築してみた感は味わえます。
ただ、Terraformの設定ファイル(main.tf)の記述ルールのボリュームは膨大で相当な学習コストがかかりそうなので、
取り急ぎ、チュートリアルの中で登場するメインどころの3つのブロックについて自分なりの解釈をメモします。
チュートリアルの中で使うmain.tfはこんな感じです↓
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}Terraform Blockについて
https://www.terraform.io/language/settingsterraform {}にterraform自体の設定(version等)を記述します。terraform内ではvariablesは使えません。
required_providersを必ず定義する必要があり、必須のproviderをrequired_proviersに記述します。
チュートリアルではawsをrequired_providersに定義しています。required_providersは少なくとも1つのproviderを定義する必要があり、providerの名前はmodule内でユニークである必要があります。チュートリアルではawsと命名していますが、仮にtestに命名変更し、45行目もtestに変更しても動作します。
また、required_providerはsourceとversionという子要素を保持します。
sourceは利用するproviderのaddress(例えばhashicorp/aws)を定義します。versionはsourceのversionです。
sourceは[<HOSTNAME>/]<NAMESPACE>/<TYPE>の形式で記述します。
hashicorp/awsはregistry.terraform.io/hashicorp/awsのshorthandです。public registyはこちらにあります。AWS以外にもAzureやkubernetis等もあります。
Providersについて
https://www.terraform.io/language/providers/configurationterraformとSaaS等のクラウドサービスとを連携させるための定義です。
チュートリアルではawsというproviderと連携するように定義しています。このawsはlocal nameと呼ばれ、
terraform {}内のrequired_providersで定義しておく必要があります。
Resourcesについて
https://www.terraform.io/language/resources/syntaxインフラ構成における各コンポーネント(例えばEC2)の定義をresourcesに記述します。
Resouces ブロックは2種類の文字列(resource_typeとresource_name)を並べて記述します。
チュートリアルでは、resouce_typeをaws_instanceとして、resouce_nameをapp_serverと定義しています。
prefixにあたるaws_がproviderのname(チュートリアルではaws)を参照します。
また、resource_typeとresource_nameの組み合わせはmodule内でユニークである必要があります。
aws_instanceは、EC2インスタンスの作成/更新/削除を行うhashicorp/awsのモジュールです。
aws_instance以外にもEC2インスタンスの公開鍵/秘密鍵を作成してくれる
aws_key_pairや、Elastic IPを付与してくれるaws_eip等もあります。
Terraformの文法
https://www.terraform.io/languageProvidersごとのdocument
- AWS
- Azure
- kubernetes
まだ素人に毛が生えた程度でしか理解出来ていませんが、ここから徐々にレベルを上げていきたいと思います。