LoginSignup
2
0

More than 1 year has passed since last update.

TerraformでAWS環境構築まで

Last updated at Posted at 2023-04-29

記事の目的

  • Terraformについての学習備忘録用
  • TerraformでAWS環境構築までのフローの振り返り用

前提条件

TerraformでAWS環境を構築するには最低でも以下の前提条件があります

  • Terraform CLIをインストールしていること
  • AWS CLIをインストールしていること
  • AWS accountと関連する認証情報でリソースが作成できる状態にあること

記事の概要

  • S3バケット作成(.tfsatateファイル保存用)
  • S3バケット参照設定
  • terraform init(初期化)
  • VPC構築をコードで記載
  • サブネット構築をコードで記載
  • terraform plan(実行内容確認)
  • terraform apply(リソース構築実行)
  • terraform destroy(リソース破棄)

Terraformとは何かなどの基本的な部分やインストールについてはTerraform基本的な説明でまとめているので、こちらみてみて下さい:raised_hands:
Terraform公式ドキュメント

S3バケット作成(.tfsatateファイル保存用)

Terraformで管理しているインフラソースをすべて記録している.tfsatateファイルを保存しておくために、まずはS3バケットを先に作成していく必要があります

AWS S3サービス画面に遷移しバケット作成を選択

上部の検索欄にS3と入力するとS3選択できS3画面に行けます
スクリーンショット 2023-04-27 23.39.35.png
今回はテストように.tfsatateファイルを保存したいだけなので、「バケット名」を入力したら他は特に変更せず「作成」を選択して作成しています
スクリーンショット 2023-04-27 23.40.56.png
「作成」選択後下の画像のようにバケットが作成できているかと思います
スクリーンショット 2023-04-27 23.41.21.png
これでTerraformで管理しているインフラソースをすべて記録している.tfsatateファイルを保存するバケットの作成は完了になります

S3バケット参照設定

作成したS3バケットを.tfsatateファイルの保存場所に指定しますよ!という設定を行なっていきます。

AWSプロバイダー情報を記載する.tfファイルを作成

まずは、「作成したS3バケットを.tfsatateファイルの保存場所に指定しますよ!」だったり、AWSプロバイダー情報などのインフラの構成記載するファイルを作成します。
ファイルを作成する場所については、好きなディレクトリを作成しその配下に好きな名前で.tfファイルを作成していきます
今回は下記のような構成でディレクトリをファイルを構成しています。

terra
┗ backend.tf    ←追加

S3バケットの設定

Terraform公式ドキュメント(Amazon S3)の「Example Configuration」部分をコピーして一旦backend.tfに貼り付けます
スクリーンショット 2023-04-28 0.00.33.png
貼り付けた後、先ほど作成したバケット情報を設定していきます

  • required_version : Terraformのバージョン指定 
  • bucket : バケット名
  • key : バケットのどこに保存するかの指定(今回はバケット直下にファイルを直接おくためファイル名記載しています) 
  • region : AWS リージョン指定

required_versionについては使用しているTerraformのバージョンを設定して下さい

backend.tf
terraform {
    required_version = "1.4.6" 
  backend "s3" {
    bucket = "terraform-tfstate-pikimarutest"
    key    = "terraform.tfstate"
    region = "ap-northeast-1"
  }
}

これでどこにtfstateを置くかの設定が完了しました

プロバイダーの設定

terra
┗ backend.tf
┗ provider.tf    ←追加

プロバイダーにはMicrosoft AzureAmazon Web Services(AWS)Google Cloud Platform(GCP)等ありますが今回はAWSであるのでbackend.tfと同じ階層にprovider.tfを作成し、provider.tf内に下記を記載していきます
Terraform公式ドキュメント(Provider Configuration)
スクリーンショット 2023-04-29 21.04.43.png

  • region : AWS リージョン指定 
provider.tf
provider "aws" {
  region = "ap-northeast-1"
}

terraform init(初期化)

ターミナルでbackend.tfが存在する階層で下記コマンドを実行

terraform init

初期化に成功するとしたの画像のように出てくるかと思います
スクリーンショット 2023-04-29 21.28.06.png
また、backend.tfと同じ階層に'.terraform'といディレクトリが作成されるかと思います
これで初期化が完了となります!!

【補足】エラーが出た場合

スクリーンショット 2023-04-29 21.28.26.png
このようなエラーが出た場合、AWSアクセスキーIDとシークレットアクセスキーを設定する必要用があるので、下記のコマンドを実行しアクセスキーIDとシークレットアクセスキーを設定していきます

aws configure

上記コマンド実行すると下記が順番に表示されるかと思うのでそれぞれ入力していきます

AWS Access Key ID [None]: YOUR_ACCESS_KEY
AWS Access Key ID [None]: YOUR_SECRET_KEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
  • AWS Access Key ID : アクセスキーを入力
  • AWS Access Key ID : シークレットアクセスキーを入力
  • Default region name : ap-northeast-1と入力
  • Default output format :jsonと入力

※アクセスキーとシークレットアクセスキーについてはAWSのIAMから「アクセスキーを作成」にて作成した際に表示されるものを使用して下さい

VPC構築をコードで記載

初期化ができたのでここから構築するサービスをコードで記載していきます
まずはVPCの構築内容を記載するのでvpc.tfファイルを作成します

terra
┗ terraform  ←初期化時に作成されています
┗ backend.tf
┗ provider.tf
┗ vpc.tf          ←追加

Terraform公式ドキュメント(VPC)を参考に設定していきます
スクリーンショット 2023-04-29 22.02.25.png

  • aws_vpc : 作成するサービスを指定している
  • pre : 名前の設定(好きな名前で良い)
  • cidr_block : IPv4 CIDR ブロックの設定
  • pre-vpc : タグの設定(好きな名前で良い)
vpc.tf
resource "aws_vpc" "pre" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "pre-vpc"
  }
}

AWS上で作成する場合、赤枠の部分を上記で設定しています
スクリーンショット 2023-04-29 22.02.25.png

サブネット構築をコードで記載

初期化ができたのでここから構築するサービスをコードで記載していきます
まずはVPCの構築内容を記載するのでvpc.tfファイルを作成します

terra
┗ terraform  ←初期化時に作成されています
┗ backend.tf
┗ provider.tf
┗ vpc.tf          
┗ subnet.tf        ←追加

Terraform公式ドキュメント(subnet)を参考に設定していきます
スクリーンショット 2023-04-29 22.02.25.png

  • aws_subnet : 作成するサービスを指定している
  • pre_1a : 名前の設定(好きな名前で良いが、アベイラビリティーゾーンが分かるような名前が良い)
  • vpc_id : サブネットを作成するVPCの指定(先ほど作成したVPCの名前をaws_vpc.名前.idというふうに設定)
  • cidr_block : IPv4 CIDR ブロックの設定
  • availability_zone : アベイラビリティーゾーンの設定
  • pre-subnet : タグの設定(好きな名前で良い)
subnet.tf
resource "aws_subnet" "pre_1a" {
  vpc_id     = aws_vpc.pre.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "pre-subnet"
  }
}

AWS上で作成する場合、赤枠の部分を上記で設定しています
スクリーンショット 2023-04-29 22.12.58.png

terraform plan(実行内容確認)

terraform planはterraformで記載したコードの内容と管理されているtfstateの内容を比較して差分(変更内容)を出してくれます。
実行した際に構築する内容を確認する際に使用し、必ず下記コマンドを実行して内容確認を行います!

terraform plan

管理されているtfstateはまだないはずなので、ここまで記載したVPCとサブネットの2つを追加しますといったPlan: 2 to add, 0 to change, 0 to destroy.という文言が出ているかと思います
スクリーンショット 2023-04-29 22.35.56.png

【補足】構文チェックterraform validate

これは補足なので実行しなくても良いですが、下記のコマンドを実行することで
これまで書いたコードの記載方法等に間違えがないかを確認できます

terraform validate

問題なければ下のように表示されます。また問題があれば該当箇所を表示してくれるので修正します
スクリーンショット 2023-04-29 22.42.10.png
terraform planでもエラーは出してくれるので念の為実行する感じで問題なさそう、、

terraform apply(リソース構築実行)

下記のコマンドで実際にこれまで記載したリソースの構築を実行します

terraform apply

コマンドを実行するとterraform plan同様変更内容が表示されるので、問題なければ「Enter a value:」の部分にyesを記載して実行します
スクリーンショット 2023-04-29 22.49.29.png
下のように表示されれば実行成功です!!
スクリーンショット 2023-04-29 22.42.10.png

AWS画面で確認

AWSコンソールに移動してVPCとサブネットを確認すると実際に作成されているかと思います:ok_hand:
スクリーンショット 2023-04-29 22.53.01.png
スクリーンショット 2023-04-29 22.53.24.png
最初の方で.tfsatateファイルの保存先のS3バケット設定をしたバケットに行き「ダウンロード」を実行するとjsonファイルで構築した内容(terraformの全て)を確認することができます
スクリーンショット 2023-04-29 23.06.35.png

【補足】この状態でterraform plan

terraform plan

これは補足なので実行しなくても良いですが、現在の状態で再度上記のコマンドを実行すると
下のように表示され何も変更がなく管理ができていることを確認することができます!
スクリーンショット 2023-04-29 23.02.23.png

terraform destroy(リソース破棄)

ここまでで、TerraformでAWS環境構築までを行なってきたのでここからはお片付けになります。
単純にこれまでTerraform記載したものを全て削除しterraform planを実行すると削除できますが、
コードを残しておいてコマンドで削除する方法を行っていきます
下記のコマンドを実行することで、コード上にあるTerraformで管理している全てのリソースを削除することができます

terraform destroy`

コマンドを実行後、問題なければ「Enter a value:」の部分にyesを記載して実行します
当たり前ですが本当に削除されるので、削除時は確認を行なった上で削除するようにして下さい:disappointed_relieved:
スクリーンショット 2023-04-29 23.19.38.png
下のように表示されれば削除完了になります。
スクリーンショット 2023-04-29 23.24.26.png
コマンド一つで全て削除されるのは怖いですが、逆にコマンド一つで全て削除できるのはめっちゃ便利だなとも思います。
削除し忘れとかでコストが発生したりするするので:disappointed_relieved:

AWS画面で確認

AWSコンソールに移動してVPCとサブネットを確認すると実際に削除されているかと思います
スクリーンショット 2023-04-29 23.27.54.png
スクリーンショット 2023-04-29 23.28.04.png

【補足】terraform destroy -target=リソース.名前

全てではなくて指定したものだけ削除したい場合はterraform destroy -target=リソース.名前コマンドを実行することで指定したリソースのみ削除することができます。
例として指定のサブネットのみ削除するコマンドを下記に記載しています

terraform destroy -target=aws_subnet.pre_1a
2
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
2
0