😸

terraform使ってみた!

2024/09/29に公開

terraformを利用してEC2の最小構成を作ってみるメモ
詳しい用語の意味は割愛します。

目次

  • Terraformのインストール
  • プロジェクトのセットアップ
  • Terraformコードの作成
  • Terraformの実行
  • 動作確認
  • 変更する方法
  • クリーンアップ(削除)

前提

  • AWS CLIでプロファイル認証が済んでいること(CLIからAWSに接続します。)

Terraformのインストール

  1. TerraformをDL(今回はWindows64bit環境のため、AMD64を選択)
  2. 環境変数pathに「c:\terraform\」を追加
  3. 「c:\terraform\」配下にexeファイルを配置
確認
$ terraform --version

Terraformコードの作成

  • 今回はVPC、サブネット、EC2を作成する
  1. 「c:\terraform\」配下に「terraform-deploy」のフォルダを作成し「tf」ファイルを作成
    コード
    [mai.tf]
     # プロバイダーの設定
    provider "aws" {
      region = "ap-northeast-1" # 東京リージョン
    }
    
    # VPCの作成
    resource "aws_vpc" "main_vpc" {
      cidr_block = "10.0.0.0/16"
    
      tags = {
        Name = "terraform1"
      }
    }
    
    # サブネットの作成
    resource "aws_subnet" "main_subnet" {
      vpc_id     = aws_vpc.main_vpc.id
      cidr_block = "10.0.1.0/24"
    
      tags = {
        Name = "terraform1"
      }
    }
    
    # 最安のEC2インスタンスの作成
    resource "aws_instance" "cheap_instance" {
      ami           = "ami-0c3fd0f5d33134a76" # 東京リージョンのAmazon Linux 2のAMI (具体的には最新のAMI IDを確認すること)
      # instance_type = "t2.micro"              # 最安のインスタンス(フリーティア対    応)
      instance_type = "t3.micro"
    
      subnet_id = aws_subnet.main_subnet.id
    
      tags = {
        Name = "terraform1"
      }
    }
    
    タグとは?

    お時間ある方はどうぞ。

確認
$ aws resourcegroupstaggingapi get-resources --tag-filters Key=Name,Values=terraform1
{
    "ResourceTagMappingList": [
        {
            "ResourceARN": "arn:aws:resource-groups:ap-northeast-1:990606419933:group/terraform1-resource-group",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "terraform1"
                }
            ]
        },
        {
            "ResourceARN": "arn:aws:ec2:ap-northeast-1:990606419933:subnet/subnet-0f8c372dfdc08dbe9",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "terraform1"
                }
            ]
        },
        {
            "ResourceARN": "arn:aws:ec2:ap-northeast-1:990606419933:vpc/vpc-048fcedd3b326b341",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "terraform1"
                }
            ]
        }
    ]
}

Terraformの実行

  1. 影響の確認(tfファイルとAWS上のリソース作成状況を比較し、差分を表示)
    terraform plan
    
  2. Terraformの適用
    terraform apply
    ※yesを押下
    

動作確認

  1. AWSコンソール上で確認
    確認


    図: リソースが作成されている

  2. コマンドで確認
    確認
    $ aws resourcegroupstaggingapi get-resources --tag-filters Key=Name,Values=terraform1
    {
        "ResourceTagMappingList": [
            {
                "ResourceARN": "arn:aws:resource-groups:ap-northeast-1:xxxxxxxxxx:group/terraform1-resource-group",
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "terraform1"
                    }
                ]
            },
            {
                "ResourceARN": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxxxx:subnet/subnet-0f8c372dfdc08dbe9",
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "terraform1"
                    }
                ]
            },
            {
                "ResourceARN": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxx:vpc/vpc-048fcedd3b326b341",
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "terraform1"
                    }
                ]
            }
        ]
    }
    

変更する方法

  1. リソースの変更(tfファイルを一部変更)
    • インスタンスのスペックを変更してみる
    変更コード
    # instance_type = "t2.micro"              # 最安のインスタンス(フリーティア対応)
    instance_type = "t3.micro"
    
  2. 影響の確認(tfファイルとAWS上のリソース作成状況を比較し、差分を表示)
    terraform plan
    instance_type                        = "t2.micro" -> "t3.micro"
    
  3. Terraformの適用
    terraform apply
    ※yesを押下
    

クリーンアップ(削除)

  • 削除する方法は主に3つ
    • tfファイルからリソースを削除orコメントアウトする方法
    • CLIで指定したリソースを削除するコマンドを打つ方法
      ※IaC利用してるのに個別のコマンドは打つメリットないので割愛
    • CLIですべてのリソースを削除するコマンドを打つ方法
  • 運用を考えると「1. tfファイルからリソースを削除orコメントアウトする方法」が主だろう
  • やってみる
    • 「tfファイルからリソースを削除orコメントアウトする方法」
      • インスタンスを削除
      変更コード
        # 例えば、このインスタンス定義を削除
        # resource "aws_instance" "cheap_instance" {
        #   ami           = "ami-0c3fd0f5d33134a76"
        #   instance_type = "t2.micro"
        #   subnet_id     = aws_subnet.main_subnet.id
        #   tags = {
        #     Name = "terraform101-instance"
        #   }
        # }
      
    • 「CLIですべてのリソースを削除するコマンドを打つ方法」
      • インスタンスを削除
        $ terraform destroy
      

Discussion