0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのTerraform

Posted at

はじめに

IT業界未経験からインフラエンジニアへの転職を目指すmmと申します。
今回は私が始めてTerraformでAWSリソースを作成した際に記録していた手順を記事としてまとめてみました。
Qiitaへの投稿も含めて初心者のため誤っているところが多々あると思います。
その際は指摘いただけると幸いです:bow_tone1:

実行環境

  • Windows 11 Home
  • Gitは導入済み

Terraformとは

HashiCorp社が提供するマルチクラウド対応のインフラ構成ツールです。
.tfという拡張子のファイルにHCL(HashiCorpConfigurationLanguage)という独自の言語で処理を記述し、実行することでインフラ環境を自動構築できます。

<メリット>

  • インフラの構成を宣言的に定義(コードで最終的な状態を指定する)することができる
  • インフラの設定をコード管理できるので、デプロイと変更の履歴を確認することができる
  • 作成作業を自動化できるので時間短縮が望めるだけでなく、開発環境、テスト環境、本番環境の不一致をなくすことができる

今回行うこと

今回作成するAWSリソースの構成図です。

構成図.png

  • CRUD処理ができる簡易なプログラムのシステム構成図を想定
  • S3はプログラムのデータ保存先として利用を想定
  • RDSはマルチAZ構成とし可用性や耐障害性を高める構成とした

設定ファイルはGitHubに投稿済です。
こちらからご覧ください。

手順

1. AWS CLIのインストール

Terraformを使用するためにはAWS コマンドラインインターフェイス(以下、AWS CLI)がインストールされている必要があります。AWS CLIを使用して、自分が使用しているコマンドラインからAWSサービスの制御ができるようになります。
下記サイトから、自分のOSに合ったインストーラーをダンロードしインストールを実行します。
AWS公式サイト
下記コマンドでインストールしたバージョンが表示されれば完了です。

$ aws --version

2. AWSアクセスキーの作成

警告
こちらの方法はAWSのベストプラクティスでも推奨されておらず、IAMロールの使用が推奨されています。当時は、とりあえずTerraformを触ってみたかったのでアクセスキーを作成する方法を選択しております。
IAMロールを使用した場合の記事は作成中です:bow_tone1:

TerraformからAWSのサービスに接続するためのIAMユーザーとアクセスキーを作成します。作成したらアクセスキーIDとシークレットアクセスキーを認証情報(credentials)に登録します。
認証情報は~/.aws/credentialsで確認できます。

aws configure --profile [環境の名称] #今回の環境用に認証情報を設定
AWS Access Key ID: #アクセスキーID
AWS Secret Access Key: #シークレットアクセスキー
Default region name: ap-northeast-1 #リージョンを選択(今回はap-northeast-1を選択)
Default output format: json #書式はjsonを選択

3. tfenvのインストール

次にTerraformのバージョン管理ツールであるtfenvをインストールします。
tfenvを使用することで、複数プロジェクト間でバージョンの一貫性を保ちつつ最適なバージョンを使用できます。
下記サイトを参照し、インストールを実行します。
公式サイト

まずソースをクローンします。

$ git clone https://github.com/tfutils/tfenv.git .tfenv

次はパスを通します。ホームディレクトリ(C:\Users[ユーザ名])に.bashrcファイルを作成し、PATHの環境変数設定を行います。
Windowsの形式ではそのままパスをコピーしても使用できないので、下記のように書き直します。

$ export PATH=$PATH:/c/Users/[ユーザ名]/.tfenv/bin

ターミナルを再起動し、下記のコマンドでコマンド一覧が表示されればtfenvのインストールは完了です。

$ tfenv

4. Terraformのインストール

インストール可能なTerraformのバージョンを確認します。

$ tfenv list-remote

任意のバージョンを指定してインストールします。

$ tfenv install [指定するバージョン]

最後に現在の環境で使用するバージョンを指定して完了です。

$ tfenv use [指定するバージョン]

5. S3の作成

次にtfstateファイルを保存するS3をマネジメントコンソールで事前に作成しました。
tfstateファイルとは、Terraformが管理しているリソースの現在の状態を表すファイルです。
個人開発ではローカルに保存しても問題ないですが、今回は複数人での開発を想定して保管先を作成したS3に設定します。
参考サイト

今回はprovider.tfという名称のファイルに以下のように記述します。

provider.tf
# ------------------------------------------------------------
#  Terraform configuraton #ここでtfstateファイルの保存先を指定する。
# ------------------------------------------------------------
terraform {
  required_version = ">=[バージョン指定]"
  backend "s3" {
    bucket = "作成したS3のバケット名" #backendで作成したS3を指定します
    region = "ap-northeast-1"
    key    = "terraform.tfstate" #保存するファイル名を指定します
  }
}
# ------------------------------------------------------------
#  Provider #プロバイダーを指定します。今回はAWSリソースを作成するのでAWSを選択。
# ------------------------------------------------------------
provider "aws" {
  region  = "ap-northeast-1"
}

6. Terraformの初期化

先ほど作成したprovider.tfファイルが格納されたディレクトリで、terraform initコマンドを実行します。
ワークスペース(今から自分が作業する仮想の作業部屋)が初期化され、使用されるプラグイン(今回はAWSプロバイダー)などがカレントディレクトリの.terraform内にダウンロードされます。

$ terraform init

7. Terraformのコードの作成

いよいよTerraformで管理・作成するAWSリソースをコードで定義していきます!
公式サイトを見ながら順番にリソースを定義していきます。
以下、自分が作成した一部のコードを抜粋しました。
すべてのコードはこちらを参照ください。

# ------------------------------------------------------------
#  VPC
# ------------------------------------------------------------
resource "aws_vpc" "vpc" {
  cidr_block           = "10.0.0.0/16"
  instance_tenancy     = "default"
  enable_dns_support   = "true"
  enable_dns_hostnames = "true"

  tags = {
    Name = "${var.tag_name}-vpc"
  }
}
# ------------------------------------------------------------#
#  rds
# ------------------------------------------------------------#
resource "aws_db_instance" "rds" {
  identifier                  = "${var.tag_name}-rds"
  engine                      = "mysql"
  engine_version              = "8.0.35"
  multi_az                    = true
  username                    = "foo"
  #マスターパスワードを自動生成
  manage_master_user_password = true
  instance_class              = "db.t3.micro"
  storage_type                = "gp2"
  allocated_storage           = 20
  db_subnet_group_name        = aws_db_subnet_group.db_subnet_group.name
  publicly_accessible         = false
  vpc_security_group_ids      = [aws_security_group.rds_sg.id]
  port                       = 3306
  parameter_group_name       = aws_db_parameter_group.db_parameter_group.name
  option_group_name          = aws_db_option_group.db_option_group.name
  backup_retention_period    = 0
  skip_final_snapshot        = true
  auto_minor_version_upgrade = false
  tags = {
    Name = "${var.tag_name}-rds"
  }
}

コードを記述したらterraform fmtでフォーマットをかけましょう。これで.tfファイル全体にフォーマットをかけ、コードの一貫性を保つことができます。

$ terraform fmt

8. Terraformの実行

AWSリソースを作成していきます。まずはterraform planを実行し、リソースの追加・更新・削除の実行計画を確認します。

$ terraform plan

エラーが表示されず、内容にも問題がなければterraform planを実行し、実際にリソースの追加・更新・削除を行います。

$ terraform apply

succes.png

無事リソースが作成できました!

9. Terraformのクリーンアップ

最後に、今回作成したリソースをterraform destroyコマンドを実行して削除しておきます。

$ terraform destroy

destroy.png
全てのリソースが削除できました!

工夫できた点と反省点

  • 複数人で開発する環境を想定し、tfstateファイルをS3に保存する構成としました。

  • RDSのマスターパスワードをmanage_master_user_passwordを利用して設定し、Secrets Managerにパスワードが自動生成されるようにしました。

  • 今回はとりあえずTerraformに挑戦する事が目的だったこともあり、複数リソースを作成する際に必要な数量分だけリソースを追記する方法を選択しました。次回は組込関数などを用いて、同じ内容を複数回記述せずに済むよう工夫したいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?