Terraform | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Fri, 28 Apr 2023 14:09:31 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png Terraform | さゆフィクション http://it.kensan.net/it 32 32 [入門編]Terraformを実践で使う際のポイント https://it.kensan.net/terraform_best_practice.html Thu, 30 Mar 2023 12:30:02 +0000 http://3.113.9.194/it/?p=666 Terraformを実践で使う際のポイントについて記載します。

具体的には

  • ファイル構成
  • 実行手順

の順に、記載していきます。

Terraformとは?という方は以下の記事をご参照ください。

Terraformとはーインフラストラクチャを安全に管理できるTerraformの使い方について理解する
「Terraformとは?」「Terraformを触ったみたい」というような方向けの記事です。「Terraformとは?について」「Terraformのインストール」「AWSのリソースをTerraformで管理してみる」の構成でTerraformについて記載していきます。

細かな文法については以下の記事を参考にさせていただくのが良いかと思います

入門Terraform

ではまずファイル構成から記載していきます。

以降、S3バケットを作成する例で記載していきます。

ファイル構成

次のように複数ファイルへ分割することができます。
Terraformは拡張子「tf」のファイルを自動的に読み込んでくれます。
Terrafermファイル構成例

Terrafermファイル構成例

上記の例はS3バケットを作成するのみの単純な構成となっています。

それぞれのファイルの役割について記載していきます

  • provider.tf
    • 以下のような情報を記載します。
      • terraformバージョン
      • AWSプロバイダーの定義
      • tfstateファイルを管理する場所の定義
  • variables.tf
    • ローカル変数の管理
  • aws_s3_bucket.tf
    • 実際に作成するAWSリソースの情報を管理
    • 「AWS_{サービス名}.ft」というファイル名で作成する
    • 今回の例ではS3バケットを作成するため「aws_s3_bucket.tf」というファイル名にしています。

provider.tfについて詳しく見ていく

まず、provider.tfのファイルの中身は以下のようになります。


# terraformバージョンを固定
terraform {
  required_version = "1.3.9"
}

# AWSプロバイダーの定義
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}


#tfstateファイルを管理するS3バケットを定義
terraform {
  backend "s3" {
    bucket = "{バケット名}"                #バケット名
    key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
    region = "ap-northeast-1"
  }
}
  • Terraformバージョンの固定
  • AWSプロバイダーのバージョンを定義
  • tfstateファイルをS3で管理

上記がポイントになります。

次にprovider.tfのファイルの中身について詳しく見ていきます。

terraformバージョンを固定について

以下の記述は、Terraformのバージョンは固定するための記述となります。
Terraformのバージョンは固定することで、バージョン違いによるトラブルを避けることができます。

# terraformバージョンを固定
terraform {
  required_version = "1.3.9"
}

AWSプロバイダーの定義について

以下の記述はプロバイダーの定義をしています。

プロバイダーについてもバージョンを記載しておきます。


# AWSプロバイダーの定義
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

tfstateファイルを管理する場所の定義について

まず、tfstateファイルについて記載します。

tfstateファイルはTerraformが生成するファイルで、現在のインフラの状態を記録しています。

tfstateファイルは

  • terraform apply
  • terraform destroy

などインフラリソースを操作する際に参照される大事なファイルです。

tfstateファイル管理のポイント
    tfstateファイルは、デフォルトでローカルに保存されますが、チーム開発では、リモートストレージでtfstateファイルを管理する必要があります。
    今回の例ではS3にtfstateを保存しています。
    
    #tfstateファイルを管理するS3バケットを定義
    terraform {
      backend "s3" {
        bucket = "{バケット名}"                #バケット名
        key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
        region = "ap-northeast-1"
      }
    }
    

    {バケット名}にはS3バケット名を記載します。

    variables.tfファイルについて詳しく見ていく

    まず、variables.tfのファイルの中身は以下のようになります。

    
    locals {
      s3_bucket_name = {
        public = "{バケット名}"
      }
    }
    

    ローカル変数を管理しています。

    本記事ではS3バケットを作成していきますので、

    S3のバケット名をローカル変数に格納しています。

     

    aws_s3_bucket.tfファイルについて詳しく見ていく

    まず、aws_s3_bucket.tfのファイルの中身は以下のようになります。

    
    resource "aws_s3_bucket" "terraform_test_public" {
      bucket = local.s3_bucket_name.public
      lifecycle {
        prevent_destroy = true
      }
    }
    

    ローカル変数(variables.tfで記載した変数)のバケット名でバケットを作成するファイルです。

    リソース作成時の注意ポイント

    Terraformで作ったリソースは、terraform destroyで簡単に削除できてしまいます。そのため、「prevent_destroy = true」で、terraform destroyで削除できないように保護しています。

    実行手順

    改めて、実行するTerraformファイルについて記載します

    用意するファイルは以下の3つです。

    ファイル名:provider.tf

    
    # terraformバージョンを固定
    terraform {
      required_version = "1.3.9"
    }
    
    # AWSプロバイダーの定義
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 4.0"
        }
      }
    }
    
    
    #tfstateファイルを管理するS3バケットを定義
    terraform {
      backend "s3" {
        bucket = "{tfstateファイルを管理するS3バケット名}"                #バケット名
        key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
        region = "ap-northeast-1"
      }
    }
    

    ファイル名:variables.tf

    
    locals {
      s3_bucket_name = {
        public = "{作成するバケット名}"
      }
    }
    

    ファイル名:aws_s3_bucket.tf

    
    resource "aws_s3_bucket" "terraform_test_public" {
      bucket = local.s3_bucket_name.public
      lifecycle {
        prevent_destroy = true
      }
    }
    

    次にTerraformを実行していきます。

    tfstateファイルを管理するS3バケットの作成

    実行の準備として、以下のコマンドで作成し、tfstateファイルを管理するS3を作成します。

    tfstateファイルを管理するS3の作成は手動で行う必要があります。

    aws s3 mb s3://{tfstateファイルを管理するS3バケット}

    terraform initの実行

    次にterraform initを実行します。
    ワークスペースを初期化するコマンドです。
    Terraform を実行するためには、1番初めに terraform init でワークスペースを初期化することが必須となっていて、必要なpluginのダウンロード処理などが実行されます。
    実行するコマンド:terraform init

    terraform fmtの実行

    Terraformはコードフォーマットが標準機能としてありますので、これを実行します。
    実行するコマンド:terraform fmt

    terraform validateの実行

    Terraformはバリデーション機能も標準機能としてありますので、これを実行します。
    実行するコマンド:terraform validate

    tflintの実行

    TerraformのLinterです。不正なコードを検出できます。
    こちらはインストールが必要です。
    インストールコマンド:brew install tflin

    インストール後にtflintを実行します。

    実行するコマンド:tflint

    terraform planの実行

    Terraform による実行計画を参照するコマンド。
    実行するコマンド:terraform plan

    terraform applyの実行

    .tf ファイルに記載された情報を元にリソースを作成するコマンド。
    実行するコマンド:terraform apply
    

    上記コマンドでS3作成ができたかと思います。

    次は削除してみます。

    terraform destroyの実行

    .tf ファイルに記載された情報を元にリソースを削除するコマンド。
    実行するコマンド:terraform destroy

    ただし、S3リソースを保護しているため、以下のエラーになると思います。

    Resource aws_s3_bucket.terraform_test_public has lifecycle.prevent_destroy set, but the plan calls for this resource to be destroyed. To avoid this error and continue with the plan, either disable lifecycle.prevent_destroy or reduce the scope of the plan using the -target flag.

    aws_s3_bucket.tfファイルを以下の通りに修正します。

    
    resource "aws_s3_bucket" "terraform_test_public" {
      bucket = local.s3_bucket_name.public
      lifecycle {
        prevent_destroy = false
      }
    }
    

    上記のように「prevent_destroy=false」に修正後に以下のコマンドを実行します

    実行するコマンド:terraform apply
    

    その後、以下のコマンドで削除できます

    実行するコマンド:terraform destroy
    

    まとめ

    まとめると、Terraformでのインフラ構築では以下の順で、作業を進めていくことになります。

    1. Terraformファイルの作成
      • Terraformバージョンを固定する
      • プロバイダーバージョンを指定する
      • tfstateファイルはS3で管理するようにする
      • インフラリソースは簡単に削除できないように、削除保護設定をしておく
    2. tfstateファイルを管理するS3バケットの作成
      • tfstateを管理するS3バケットは手動で作成する
    3. terraform initの実行
      • ワークスペースの初期化
    4. terraform fmtの実行
      • ソースファイルのフォーマット
    5. terraform validateの実行
      • バリデーションする
    6. tflintの実行
      • Linter実行
    7. terraform planの実行
      • ドライラン
    8. terraform applyの実行
      • インフラ構築を実行!!

    より実践的な記事もありますので、よろしければ、ご参照くださいー

    Terraformを実践的な使い方ーCloudFrontからS3へのアクセス制御をOACを使って正しく設定する編
    「S3+CloudFrontで静的サイト構築」をTerraformで構築します。S3へのアクセス制御は「Origin access control settings(OAC AWS推奨のやつ)」を使います。Terraformは実践的な書き方で記載しているので、色々な環境構築の応用できます

    ↓公式サイト↓

    Terraform by HashiCorp
    Terraform is an infrastructure as code tool that enables you to safely and predictably provision and manage infrastructure in any cloud.
    ]]>
    TerraformでEC2上にWordPressを簡単に構築するーコピペでTerraformでWordPress構築 https://it.kensan.net/terraform-ec2-wordpress.html Sun, 05 Mar 2023 07:29:44 +0000 http://3.113.9.194/it/?p=682 TerrafromでEC2上にWordPressを構築していきます!

    コピペでEC2上にTerrafromでWordPressを構築できるように記載しています。

    EC2のAMIでは「WordPress Certified by Bitnami and Automattic」を指定してWordPressを構築します。

    Terraformとは?という方は以下の記事をご参照ください。

    Terraformとはーインフラストラクチャを安全に管理できるTerraformの使い方について理解する
    「Terraformとは?」「Terraformを触ったみたい」というような方向けの記事です。「Terraformとは?について」「Terraformのインストール」「AWSのリソースをTerraformで管理してみる」の構成でTerraformについて記載していきます。

    AWSマネージメントコンソール画面から構築したい場合は以下の記事をご参照ください。

    AWSのEC2に簡単にWordPressをインストールする方法(AMIでWordPressを使用)
    簡単にAWSのEC2にWordPressをインストールする方法です。5分で動作確認までできます。 ハマるポイントとしては、WordPressログイン時のパスワードの確認くらいです。 AMIはWordPress Certified by Bitnami and Automatticを使用します

    それではWordPressを構築するTerraformのソースコードを書いていきます。

    Terraformのソースコード

    3つのファイルを使用します。

    • provider.tf
      • 以下のような情報を記載します。
        • terraformバージョン
        • AWSプロバイダーの定義
        • tfstateファイルを管理する場所の定義
    • variables.tf
      • ローカル変数の管理
    • aws_ec2.tf
      • EC2/セキュリティグループ/VPCを管理

    ファイル名:provider.tf

    
    # terraformバージョンを固定
    terraform {
      required_version = "1.3.9"
    }
    
    # AWSプロバイダーの定義
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 4.0"
        }
      }
    }
    
    
    #tfstateファイルを管理するS3バケットを定義
    terraform {
      backend "s3" {
        bucket = "{tfstateファイルを管理するS3バケット名}"                #バケット名
        key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
        region = "ap-northeast-1"
      }
    }
    

    ファイル名:variables.tf

    
    locals {
      ec2 = {
        instance_type = "t3.micro",
        ami           = "ami-0cf92f9f22d78344c"
      }
    }
    

    AMIは「WordPress Certified by Bitnami and Automattic」を指定してます。

    ファイル名:aws_ec2.tf

    
    # EC2インスタンス作成
    resource "aws_instance" "wordpress" {
      ami                         = local.ec2.ami
      instance_type               = local.ec2.instance_type
      subnet_id                   = aws_subnet.public_1a.id
      vpc_security_group_ids      = [aws_security_group.wordpress.id]
      associate_public_ip_address = "true"
    }
    # VPC作成
    resource "aws_vpc" "wordpress" {
      cidr_block = "10.0.0.0/16"
    }
    # サブネット作成
    resource "aws_subnet" "public_1a" {
      vpc_id = aws_vpc.wordpress.id
    
      # Subnetを作成するAZ
      availability_zone = "ap-northeast-1a"
    
      cidr_block = "10.0.1.0/24"
    
    }
    # ルートテーブル作成
    resource "aws_route_table" "public_rt" {
      vpc_id = aws_vpc.wordpress.id
      route {
        cidr_block = "0.0.0.0/0"
        gateway_id = aws_internet_gateway.igw.id
      }
    }
    # インターネットゲートウェイ作成
    resource "aws_internet_gateway" "igw" {
      vpc_id = aws_vpc.wordpress.id
    }
    # ルーティングテーブル作成
    resource "aws_route_table_association" "public_rt_associate" {
      subnet_id      = aws_subnet.public_1a.id
      route_table_id = aws_route_table.public_rt.id
    }
    
    # セキュリティグループ作成
    resource "aws_security_group" "wordpress" {
      name   = "wordpress"
      vpc_id = aws_vpc.wordpress.id
    
      ingress {
        description = "allow http"
        from_port   = "80"
        to_port     = "80"
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
      }
      ingress {
        description = "allow ssh"
        from_port   = "22"
        to_port     = "22"
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
      }
    
      egress {
        from_port   = "0"
        to_port     = "0"
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]
      }
    }
    

    次に、Terraformを実行して、WordPressを構築していきます。

    Terraformの実行

    以下のコマンドを実行していきます。

    // tfstateファイルを管理するS3バケット作成
    aws s3 mb s3://{tfstateファイルを管理するS3バケット}
    
    //ワークスペースを初期化する
    terraform init
    
    // コードフォーマット
    terraform fmt
    
    // バリデーション
    terraform validate
    
    // 不正なコードを検出
    tflint
    
    // 実行計画を確認
    terraform plan
    
    // リソース作成
    terraform apply

    WordPress管理者アカウントのパスワード確認

    1. EC2インスタンス一覧画面から作成したWordPressインスタンスを選択
    2. 以下の通りメニューをたどり、システムログを開く
      • アクション->モニタリングとトラブルシューティング->システムログを取得
    3. システムログを「Setting Bitnami application password to」で検索し、WordPress管理者のパスワードを調べる

    WordPress EC2システムログ

    動作確認

    1. EC2インスタンス詳細画面を開き、「http://パブリック IPv4 アドレス/wp-admin」をブラウザのアドレスバーに入力する(httpsだとアクセスできないので注意)
    2. WordPressログイン画面が表示されるのでユーザ名は「user」、パスワードはシステムログで調べたパスワードを入力し、ログインできれば完了

    あと片付け

    以下のコマンドで作成したリソースを削除します。

    terraform destroy

    まとめ

    EC2上にWordPressを構築する手段として、コピペでTerrafromで構築する方法を記載しました。

    画面操作に慣れている方はとっつきづらいかもしれませんが、Terraformに慣れている方にとっては本記事に記載のTerraformでの構築の方が楽かもと思ってます!

    ]]>
    Terraformを実践的な使い方ーCloudFrontからS3へのアクセス制御をOACを使って正しく設定する編 https://it.kensan.net/terraform-cloudfront-oac.html Sat, 04 Mar 2023 08:51:25 +0000 http://3.113.9.194/it/?p=674 Terraformを使ってS3+CloudFront構成の静的サイトを構築してみます。

    • やること
      • S3+CloudFrontで静的サイト構築
      • Origin access control settings(OAC)を使ってアクセス制御(AWS推奨のやつ)
    • どうやってやるか
      • Terraformを使います
        • Terraformの使い方は以下の点に注意し、実践的な方法で記載
          • Terraformバージョンを固定する
          • プロバイダーバージョンを指定する
          • tfstateファイルはS3で管理するようにする
          • インフラリソースは簡単に削除できないように、削除保護設定をしておく
          •  tfstateファイルを管理するS3バケットの作成
            • tfstateを管理するS3バケットは手動で作成する
          •  実行前に以下のコマンドを実行し、安全にインフラ構築する
            • terraform fmt
            • terraform validate
            • tflint
            • terraform plan

    AWSマネージメントコンソール画面から、S3+CloudFrontでOAC使う方法は以下の記事をご参照ください。

    AWS CloudFrontからS3へのアクセス制御をOACを使って正しく設定する
    S3のコンテンツをCloudFront経由で配信する際、CloudFrontからS3へのアクセス制御をOAC(Origin access control settings)を使って正しく設定する方法を記載。OACは現在推奨されている設定なので、S3+CloudFrontでサイト公開する際のスタンダードな方法です。

    Terraformの基本的な使い方は以下の記事をご参照ください

    [入門編]Terraformを実践で使う際のポイント
    Terraformを実践で使う際のポイントについて記載します。 チームで安全にTerraformを扱うには、tfstateの管理やリソース保護も必要になってきますので、この点にも触れています。 具体的には「ファイル構成」「実行手順」の順に、記載していきます。

    本記事では「TerraformでCloudFrontからS3へのアクセス制御をOrigin access control settings(OAC)を使って正しく設定する方法」を題材に、実践でTerraformを使う際のポイントを記載しています。色々な環境構築の基礎知識となり、応用可能な情報となります。

    まずは、Terraformソースコードを作成していきます。

    Terraformソースコード

    4つのファイルを使用します。

    • provider.tf
      • 以下のような情報を記載します。
        • terraformバージョン
        • AWSプロバイダーの定義
        • tfstateファイルを管理する場所の定義
    • variables.tf
      • ローカル変数の管理
    • aws_s3_bucket.tf
      • S3バケットを管理
    • aws_cloudfront_distribution.tf
      • CloudFrontを管理

    次に、4つのファイルに記載する内容について記載していきます。

    ファイル名:provider.tf

    
    # terraformバージョンを固定
    terraform {
      required_version = "1.3.9"
    }
    
    # AWSプロバイダーの定義
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 4.0"
        }
      }
    }
    
    
    #tfstateファイルを管理するS3バケットを定義
    terraform {
      backend "s3" {
        bucket = "{tfstateファイルを管理するS3バケット名}"                #バケット名
        key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
        region = "ap-northeast-1"
      }
    }
    

    ファイル名:variables.tf

    
    locals {
      s3_bucket_name = {
        public = "{作成するバケット名}"
      }
    }
    

    ファイル名:aws_s3_bucket.tf

    
    # S3バケット作成
    resource "aws_s3_bucket" "terraform_develop" {
      bucket = local.s3_bucket_name.public
      # 削除保護
      lifecycle {
        prevent_destroy = true
      }
    }
    # バケットポリシー
    resource "aws_s3_bucket_policy" "terraform_develop" {
      bucket = aws_s3_bucket.terraform_develop.id
      policy = data.aws_iam_policy_document.s3_develop_policy.json
    }
    
    # CloudFrontからのアクセスのみを許可
    data "aws_iam_policy_document" "s3_develop_policy" {
      statement {
        principals {
          type        = "Service"
          identifiers = ["cloudfront.amazonaws.com"]
        }
        actions   = ["s3:GetObject"]
        resources = ["${aws_s3_bucket.terraform_develop.arn}/*"]
        condition {
          test     = "StringEquals"
          variable = "aws:SourceArn"
          values   = [aws_cloudfront_distribution.terraform_develop.arn]
        }
      }
    }
    

    ファイル名:aws_cloudfront_distribution.tf

    
    # OAC作成
    resource "aws_cloudfront_origin_access_control" "terraform_develop" {
      name                              = "terraform_develop"
      origin_access_control_origin_type = "s3"
      signing_behavior                  = "always"
      signing_protocol                  = "sigv4"
    }
    # ディストリビューション作成
    resource "aws_cloudfront_distribution" "terraform_develop" {
      enabled = true
      # オリジン設定
      origin {
        origin_id   = aws_s3_bucket.terraform_develop.id
        domain_name = aws_s3_bucket.terraform_develop.bucket_regional_domain_name
        // OACを設定
        origin_access_control_id = aws_cloudfront_origin_access_control.terraform_develop.id
      }
      # 削除保護
      lifecycle {
        prevent_destroy = true
      }
      # ビヘイビア設定
      default_cache_behavior {
        target_origin_id       = aws_s3_bucket.terraform_develop.id
        viewer_protocol_policy = "redirect-to-https"
        cached_methods         = ["GET", "HEAD"]
        allowed_methods        = ["GET", "HEAD"]
        forwarded_values {
          query_string = false
          headers      = []
          cookies {
            forward = "none"
          }
        }
      }
      restrictions {
        geo_restriction {
          restriction_type = "none"
        }
      }
      viewer_certificate {
        cloudfront_default_certificate = true
      }
    }
    

    Terraformを実行して環境構築していきます!

    Terraformの実行

    以下のコマンドを実行していきます。

    // tfstateファイルを管理するS3バケット作成
    aws s3 mb s3://{tfstateファイルを管理するS3バケット}
    
    //ワークスペースを初期化する
    terraform init
    
    // コードフォーマット
    terraform fmt
    
    // バリデーション
    terraform validate
    
    // 不正なコードを検出
    tflint
    
    // 実行計画を確認
    terraform plan
    
    // リソース作成
    terraform apply

    動作確認

    以下の2点確認できればOKです。

    • S3にindex.htmlファイルを作成して、「https://ディストリビューションドメイン名/index.html」でアクセスできる
    • S3のオブジェクト URLでアクセスできないこと

    あと片付け

    Terraformファイル(.tfファイル)での、S3とCloudFrontの設定について、「prevent_destroy」を以下の通り変更します

    • 変更前:prevent_destroy = true
    • 変更後:prevent_destroy = false

    削除不可の状態(削除保護されている状態)から削除可能に変更後、削除を行うイメージです。

    以下のコマンドで作成したリソースを削除します。

    terraform apply
    
    terraform destroy
    

    まとめ

    「CloudFrontからS3へのアクセス制御をOrigin access control settings(OAC)を使って正しく設定する」方法を、Terraformの実践的な使い方で記載しました。

    色々な環境構築に応用できるかと思います。Terraformの実践的な使い方のポイントを再度あげておきます

    • Terraformバージョンを固定する
    • プロバイダーバージョンを指定する
    • tfstateファイルはS3で管理するようにする
    • インフラリソースは簡単に削除できないように、削除保護設定をしておく
    •  tfstateファイルを管理するS3バケットの作成
      • tfstateを管理するS3バケットは手動で作成する
    • 実行前に以下のコマンドを実行し、安全にインフラ構築する
      • terraform fmt
      • terraform validate
      • tflint
      • terraform plan

     

    最後にCloudFrontのOACに関する公式記事を載せておきます。

    Amazon CloudFront オリジンアクセスコントロール(OAC)のご紹介 | Amazon Web Services
    本記事は、「Amazon CloudFront introduces Origin Access Contro
    ]]>
    Terraformとはーインフラストラクチャを安全に管理できるTerraformの使い方について理解する https://it.kensan.net/terraform-howto.html Fri, 03 Mar 2023 22:25:30 +0000 http://3.113.9.194/it/?p=658 Terraformについての記事です。

    • Terraformとは?という方
    • Terraformを触ったみたいという方

    上記のような方向けの記事です。

    要するにTerraform入門編です!

    具体的には以下のような内容を記載していきます。

    この記事で記載すること

    Terraformとは?について
    Terraformのインストール
    AWSのリソースをTerraformで管理してみる
    →S3バケットを作成してみます!

      Terraformの実践的な使い方については以下の記事をご参照ください。

      [入門編]Terraformを実践で使う際のポイント
      Terraformを実践で使う際のポイントについて記載します。 チームで安全にTerraformを扱うには、tfstateの管理やリソース保護も必要になってきますので、この点にも触れています。 具体的には「ファイル構成」「実行手順」の順に、記載していきます。

      まず「Terraformとは?」についてです。

      Terraformとは

      Terraformとは、インフラのコード化とインフラ構築を自動化を行うためのオープンソースのツールです。自動化することで、安全かつ効率的にインフラ構築ができるようになります。クラウドプロバイダー(AWS、Google Cloud、Microsoft Azureなど)など、さまざまなインフラプロバイダーに対して、構成を管理できます。

      対応しているクラウドプロバイダーは以下サイトから確認できます。

      Terraform Registry

      Terraformは、HCL(HashiCorp Configuration Language)と呼ばれる独自の言語を使用して、インフラ構成を定義します。HCLは人間が読み書きしやすくようになっています。

      要するに、Terraformはインフラス構成を管理するツールで、

      • 安全
      • 効率的

      にインフラ構成を管理できるツールです。

      Terraformを使うと、

      • インフラ構成をコード化できます
        • コード化することによりバージョン管理することが可能になります
          • バージョン管理することにより変更履歴が追跡可能になります
      • インフラ構築の自動化ができます
        • 人間が画面操作でインフラ構築をすると作業ミスが発生する可能性がありますが、Terraformでこれを排除

      上記のようなことが可能となります。

      また、Terraformは

      • 実行前に実行計画を見ることができます
        • ドライランができるということです
      • 実行計画を見ることができるため、誤りがあれば実行前に気付くことができる
        • ヒューマンエラーを回避できる

      という使う上でのメリットがあります。

      次にTerraformのインストール方法を書いていきます。

      Terraformのインストール

      Macでは、以下のコマンドでインストールできます。

      brew install terraform

      インストール完了後は、以下のコマンドを実行し、バージョンが表示されれば問題なくインストールされたこととなります。

      terraform --version

      次にTerraformでAWS上にS3バケットを作成と削除をしていきます!

      TerraformでS3バケットを作成して、削除してみます。

      まずはAWSリソースを扱うためにAWS CLIをインストールしていきます。

      AWS CLIのインストール

      以下のコマンドでインストールできます。

      curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
      sudo installer -pkg AWSCLIV2.pkg -target /

      インストール完了後は、以下のコマンドを実行し、バージョンが表示されれば問題なくインストールされたこととなります。

      aws --version

      インストールがうまくいかない場合は公式の情報をご参照ください

      AWS CLIの最新バージョンのインストールまたは更新 - AWS Command Line Interface
      AWS CLI をシステムにインストールまたはアップデートする手順。

      インストール後は以下のコマンドでAWSのアクセスキーとシークレットアクセスキーを設定します。

      aws configure

      ソースの作成

      S3バケットを作成する簡単なTerraformソースコードを作っていきます。

      以下のコマンドで作業用ディレクトリを作成し、作成したディレクトリの中にTerraformソースを作成します。

      mkdir terraform_test
      
      cd terraform_test
      
      vi main.tf

      main.tfの中身は以下のようにして保存します

      resource "aws_s3_bucket" "{S3バケット名}" {
        bucket = "{S3バケット名}"
      }
      

      {S3バケット名}の部分は作成するバケット名に変更します。

      Terraformの実行

      Terraformを実行してS3バケットを作成していきます。

      S3バケットの作成

      まずは以下のコマンドで実行準備をします

      terraform init

      次に以下のコマンドで実行計画を確認します(ドライランします)

      terraform plan

      実行計画からS3バケットが作られそうなことがなんとなくわかると思います。

      実行計画の確認ができたら、以下のコマンドで実際に実行します(S3バケット作成します)。

      terraform apply

      実行すると以下のメッセージが出てきます。

      Do you want to perform these actions?

      実行していいのか聞かれていますので、

      yes

      と入力して回答します。

      以下のようなメッセージが出てくれば成功です。

      Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
      

      AWSマネージメントコンソール画面からS3バケットが作成されていることが確認できると思います。

      次にS3バケットにタグをつけてみます。

      S3バケットの更新(タグ付けする)

      main.tfの中身にタグ情報を追記して保存します

      resource "aws_s3_bucket" "{S3バケット名}" {
        bucket = "{S3バケット名}"
        tags = {
          Name = "terraform_test"
        }
      }

      次に以下のコマンドで実行計画を確認します(ドライランします)

      terraform plan

      以下のコマンドで実際に実行します(S3にタグ名をつけます)。

      terraform apply

      実行すると再び以下のメッセージが出てきます。

      Do you want to perform these actions?
      yes

      と入力して回答します。

      以下のようなメッセージが出てくれば成功です。

      Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
      

      AWSマネージメントコンソール画面で、作成したS3バケットにタグ名がついていることを確認できると思います。

      次はS3バケットの削除をします。

      S3バケットの削除

      あと片付けとしてS3バケットを削除します。以下のコマンドを実行します。

      terraform destroy

      以下のメッセージが表示されます。

      Do you really want to destroy all resources?
      yes

      と入力してS3バケットを削除します。

      Destroy complete! Resources: 1 destroyed.

      上記メッセージが表示されればOKです。

      AWSマネージメントコンソール画面で、作成したS3バケットが削除されていることを確認できると思います。

      まとめ

      TerraformでS3の作成・変更・削除を実施しました。

      Terraformが実行計画を出してくれ、実行するときは再確認してくれるので、安心して作業できるのはないかと思います。

      ]]>