はじめに
- 入門するのにちょうど良い動画を youtube におすすめして貰ったので、触った内容をメモしていきたいと思います。
- プラスで調べたことを一緒にメモしていきます。普段は azure の bicep で IaC をしているので比較しつつ書けたらいいなと思います。
- 参考にしたサイト
- https://developer.hashicorp.com/terraform/tutorials/aws-get-started
- https://blog.dcs.co.jp/aws/20210401-terraformaws.html#environment
- https://thinkit.co.jp/article/20286
- https://learn.microsoft.com/ja-jp/azure/developer/terraform/comparing-terraform-and-bicep?tabs=comparing-bicep-terraform-integration-features#state-and-backend
- 参考にしたサイト
インストール
- 具体的な方法はすでに記事がいっぱいあるので割愛
- tfenv を入れて、それ経由で terraform をインストールしていくのがベター
- terraform のバージョンを管理していくれるツールで、バージョンのアップデートとか切り替えが容易にできる
- 参考:
tfファイルについて
- このファイルに IaCで管理するリソースを書いていく
- 実行時のポイント
- 構文について
構文のコード例
- resource の例
resource "リソースの種類" "リソース名" { 設定項目1 = 設定値 設定項目2 = 設定値 設定項目3 = 設定値 }
- data の例
data "リソースの種類" "リソース名"{ filter = { Name = "リソース名" } }
- variables の例
# 変数定義側 variables "変数名" { type = string, default = "hoge" } # 呼び出し側 resource "Xxxx" "Xxxx" { hoge = vars.変数名 }
tfstateファイルについて
- terraform で管理しているインフラリソースをすべて記載した json 形式のファイル
- terraform.tfstate
- 今回はローカルにこのファイルおく形とする。実務では複数人がさわる環境でローカルファイルで管理するわけにもいかないので、S3上でこのファイルを管理する方法がよく使われているらしい。
bicep との大きな違いの部分だと感じました。bicep ではインフラ全体の状態を管理するようなファイルはないので、IaCの設計方針が大分変わりそうですね。
実リソースとコードの差分がすぐに出せて比較できるのは素晴らしい反面、厳密に状態が管理される前提なので設計の難易度が高めと感じました。
コードを書く
provider "aws" { region = "ap-northeast-1" }
- vpc.tf
resource "aws_vpc" "test-vpc" { cidr_block = "10.0.0.0/16" tags = { Name = "test-vpc" } } resource "aws_subnet" "test-subnet-public-ap-northeast-1a" { vpc_id = aws_vpc.test-vpc.id cidr_block = "10.0.1.0/24" availability_zone = "ap-northeast-1a" tags = { Name = "test-subnet-public-ap-northeast-1a" } } resource "aws_subnet" "test-subnet-public-ap-northeast-1c" { vpc_id = aws_vpc.test-vpc.id cidr_block = "10.0.2.0/24" availability_zone = "ap-northeast-1c" tags = { Name = "test-subnet-public-ap-northeast-1a" } }
- ec2.tf
resource "aws_instance" "sample_web_server" { ami = "ami-09d28faae2e9e7138" # Amazon Linux 2 instance_type = "t2.micro" user_data = <<EOF #! /bin/bash sudo yum install -y httpd sudo systemctl start httpd sudo systemctl enable httpd EOF }
AWS のクレデンシャル設定について
- クレデンシャル設定方法はいくつかある
- 参考: ドキュメント
- 今回はローカル完結&自分一人のお試しということで、お手軽にできる環境変数を使った設定方法で試します
- 上記ドキュメントだと
Environment Variables
の章
- 上記ドキュメントだと
- アクセスキーを有効化するので、使い終わったら無効化しておいたほうがいいかもしれません(手順は後述)
- 実務だとVault というサービスと連携させたりしているよう
AWS のクレデンシャル設定 の手順
- terraform で terraform 用のアクセスキーを作成する
- IAMユーザー画面に遷移
- 対象のユーザーを選択 or 新規作成 (用途に合わせて)
セキュリティ認証情報
タブの下の方いくとアクセスキー周りの設定箇所あるのでそこで設定
- 作成したら、アクセスキーとシークレットキーをメモっておく
- 以下コマンドをターミナルから実行して、環境変数を設定
export AWS_ACCESS_KEY_ID="Xxx" export AWS_SECRET_ACCESS_KEY="Xxx" export AWS_REGION="ap-northeast-1" terraform plan
コマンド紹介
- terraform plan
- tfstateで管理されているリソースの状態と、現在のterraformのコードの状態を比較して差分をとってくれる
- bicep とか使ってるとこれできるのめちゃ便利だなあと思う
- terraform validate
- terraform の構文チェックができる
- terraform plan でもエラーでるので基本あんま使わなさそう
- terraform fmt
- terraform のフォーマット崩れてるところを修正してくれる
- terraform apply
- このコマンドで実際にリソース作成が行われる
- terraform destroy
- ちなみにすべてではなく特定のリソースのデストロイしたいとき -t オプションで指定できる
実行
- 以下コマンドを実行する。コンソール画面とかを見ると、リソースが出来上がっているのがわかる。
terraform plan terraform fmt #tfファイルをフォーマットしてくれる terraform apply
いろいろリソース触ってみたりしてもらった後は、以下コマンドで消す。作ったものが一気に消せるの便利...!!
terraform destroy
リソース消したら AWS のアクセスキーを一応無効化しておきます
- IAMの画面に行く
- 使っていたIAMユーザーを選択
セキュリティ認証情報
タブを下に行くとアクセスキーの項目があるので、アクション
ボタンから無効化をする
おまけ
module
- オブジェクト指向でいうところのクラスみたいなイメージ
- 例: VPC と Subnet を組み合わせたテンプレートを作っておくなど
- variables 構文を使って, cidr_block を渡してあげて、その部分だけは可変にするとかもできる
workspace
- git のブランチみたいなイメージで、作業環境を
terraform workspace
コマンドでスイッチできる - 例えば、環境ごとに workspace をスイッチするとかのユースケースが一例
- develop,staging,production みたいな