【AWS】【IaC】Terraformでコード化されたEC2インスタンスのdeploy手順を実行

2024/11/10に公開

はじめに

友人のエンジニアと話している中で、「インフラならやっぱIaCだよね。terraformなんかでコード化できるといいよね。」といったお話になり、実際にその設定を行い、検証したいと思います。

対象の方

IaC(Infrastrudture as Code:インフラのコード化)に興味がある方

環境

AWS
AmazonLinux2023
macbookpro2019

内容

terraformをローカルのmacbookpro2019へインストールし、ローカルからAWSへIaCを行い、
・EC2の初期設定
をサンプルコードをchatGPT4から取得し、ローカルからAWSの自身の環境へコマンドラインからdeployすることを目標とします。

本題

1 terraformをローカルへインストール

ターミナルを開き、ローカルで

mkdir terraform
cd terraform

などでterraform用ディレクトリを作成、移動し、terraformをインストールします。
下記の
【初心者向け】MacにTerraform環境を導入してみた(inomaso様著) の
https://dev.classmethod.jp/articles/beginner-terraform-install-mac/
を参照し、下記を実行

brew install tfenv

※brewがinstallできていなければ、homebrewのインストールが必要です。過去にinstallしたかどうか、忘れてしまった場合、

brew --version

から確認可能です!

tfenv --version

で、バージョン情報が確認できればインストール完了です。

tfenvはyumやdnfのようなパッケージマネージャーなので、

tfenv install
tfenf list

などで、一度パッケージをinstallした後、listで利用可能なパッケージを確認します。

tfenv use 1.9.8

でterraformの使用するversionを選択し、

terraform --version

でバージョン表示がなされれば、terraformコマンドは今後利用可能です。

2 awscliを利用できるように、ローカルに設定

上記を行うために、ローカルでawsコマンドが利用できる状態にします。

aws ec2 describe-instances

でec2インスタンスのインスタンス情報が表示されるよう設定します。
最初、利用できないと思います。

brew install awscli

で、awscliをインストールし、再度上記を行うと、利用できないと思います。
そのため、下記で~/.awsの中のconfigを設定するコマンドを実行します。

aws configure

すると、アカウントIDを聞かれます。
今わからない場合、Enterを連打し、コマンドを終えます。

アクセスキー
シークレットアクセスキー

が必要となるため、IAMでユーザー作成(権限はなるべく最小限がベスト)し、aws_cliの権限許可用のユーザー作成をします。

・1、2つ目の入力欄 → アクセスキー/シークレットアクセスキー
A IAM > ユーザー > username
でユーザー作成後、
B アクセスキーの作成
でアクセスキー/シークレットアクセスキーを取得。
・3つ目の入力欄 → ap-northeast-1
その後、regionをap-northeast-1(東京の場合)など、取得したregion名を入力する。AWSのURLからもコピペ可。
・4つ目の入力欄 → json
最後にjsonで出力するファイル形式を入力する。デフォルトですでにjsonとなっており、空白+EnterでもOK。(指定しておいた方が確実)

上記の流れでaws configure用の設定を終え、再度

aws ec2 describe-instances

を行うと、情報が表示されるはずです。

3 chatGPT4で生成されたテンプレートファイルを、AWSへterraform経由でdeploy

chatGPT4様から得た下記のコードをテンプレートとして、main.tfを作成します。

vi main.tf

から、iでinsert(挿入)モードにして、下記のコードを貼り付け、
:wqで保存し、quit(やめる)します。

# Terraformのバージョン指定
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
  required_version = ">= 1.0.0"
}

# AWSプロバイダーの設定
provider "aws" {
  region = "ap-northeast-1" # 東京リージョン
}

# セキュリティグループの作成
resource "aws_security_group" "example_sg" {
  name_prefix = "example-sg-"

  # SSHの許可(ポート22)
  ingress {
    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"]
  }
}

# EC2インスタンスの作成
resource "aws_instance" "example" {
  ami           = "[ami]" # Amazon Linux 2のAMI ID(東京リージョン用)
  instance_type = "t2.micro"

  # セキュリティグループをアタッチ
  security_groups = [aws_security_group.example_sg.name]

  tags = {
    Name = "ExampleInstance"
  }
}

この保存後、下記を実行すると terraform apply で失敗します。

terraform init
terraform plan
terraform apply

上記のmain.tfファイル内の「ami」が違ったようです。

上記のEC2インスタンス、サイドバー内のAMIカタログ、クイックスタート(45)から、
Amazon Linux 2のAMIをコピーし、上記コードの[ami]を修正します。

その後、

terraform apply

で、下記の Enter a value を yes と入力します。

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

下記の表示で、「Resources: 1 added」。成功です!!

aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Creation complete after 13s [id=i-0fd5092a1ca716c23]

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

下記のように、EC2インスタンスができていて、

セキュリティグループも設定されています。
デフォルトVPCに紐づいていることも確認できます。

ということで、

terraformをローカルのmacbookpro2019へインストールし、ローカルからAWSへIaCを行い、
・EC2の初期設定
をサンプルコードをchatGPT4から取得し、ローカルからAWSの自身の環境へコマンドラインからdeployすることを目標とします。

が達成できました。

次は、ECSのfargateの初期設定を、上記と同じ手順でコード化、deployできるといいと思います。
その後、CI/CDを手がける段階に少し触れられれば、良い順序かと思っています。

更新順序が若干アトランダムですが、宣言したトピックは少しずつ進めていますので、暖かく見守っていただけますと幸いです。
引き続き、よろしくお願いいたします。

ちなみに、githubへあげておけば、
https://github.com/JunSecondStart/terraform
laprasというエンジニア向けの転職サイトでアピールもできます。
https://lapras.com/person

以上、junのIaCへの第一歩でした!

Discussion