Terraform + AWSのチュートリアルをやって学んだことメモ

September 19, 2022
AWS / Terraform

Terraformとは、HashiCorp社により開発されているオープンソースのインフラ自動構築ツールです。

AWSなどのクラウドサービス上のインフラリソース(サーバやネットワークなど)をコードで定義することで、

オペレーションミスを防ぎ、インフラ構築作業の効率化を図ることが出来ます。

業務でがっつりインフラ構築をする機会はないのですが、多少は知識がないと色々と業務に支障があるので、

まずは最初の一歩ということで、Terraform + AWSのチュートリアルをやってみました。

チュートリアルの紹介

Get Started - AWS

8つのセクションに分かれていて、大体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/settings

terraform {}にterraform自体の設定(version等)を記述します。terraform内ではvariablesは使えません。

required_providersを必ず定義する必要があり、必須のproviderをrequired_proviersに記述します。

チュートリアルではawsをrequired_providersに定義しています。required_providersは少なくとも1つのproviderを定義する必要があり、providerの名前はmodule内でユニークである必要があります。チュートリアルではawsと命名していますが、仮にtestに命名変更し、45行目もtestに変更しても動作します。

また、required_providersourceversionという子要素を保持します。

sourceは利用するproviderのaddress(例えばhashicorp/aws)を定義します。versionはsourceのversionです。

source[<HOSTNAME>/]<NAMESPACE>/<TYPE>の形式で記述します。

hashicorp/awsregistry.terraform.io/hashicorp/awsのshorthandです。public registyはこちらにあります。AWS以外にもAzureやkubernetis等もあります。

Providersについて

https://www.terraform.io/language/providers/configuration

terraformとSaaS等のクラウドサービスとを連携させるための定義です。

チュートリアルではawsというproviderと連携するように定義しています。このawslocal 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のモジュールです。

こちら に公式docがあります。

aws_instance以外にもEC2インスタンスの公開鍵/秘密鍵を作成してくれる aws_key_pairや、Elastic IPを付与してくれるaws_eip等もあります。

Terraformの文法

https://www.terraform.io/language

Providersごとのdocument

  • AWS
https://registry.terraform.io/providers/hashicorp/aws/latest/docs
  • Azure
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs
  • kubernetes
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs

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


Profile picture

React, Vue, TypeScript, Node.js, PHP, Laravel, AWS, Firebase, Docker, GitHub Actions, etc...