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
まだ素人に毛が生えた程度でしか理解出来ていませんが、ここから徐々にレベルを上げていきたいと思います。