Terraform에서 AWS 환경에 Apache 서버 생성

13591 단어 TerraformAWS
최근 Terraform을 만지는 경우가 많았기 때문에 복습을 겸해 시험해 보았습니다.
거의 Terraform만으로 Apache 서버의 기동까지 실시합니다.

환경



Terraform v0.14.10
aws provider v3.36.0

사전 준비



tfstate용 S3 버킷 생성



이번 tfstate 파일의 저장처에 S3를 지정하므로, 사전에 그것에 대한 S3 버킷을 작성해 둡니다.
Terraform으로 작성할 수도 있습니다만, 공식으로 「Terraform은 인프라를 관리하는 관리 툴이므로, Terraform가 사용하는 인프라는, Terraform가 관리하는 인프라의 외측에 존재하는 것이 이상입니다.(DeepL 번역) "라고합니다. Terraform을 수정할 때 실수로 파손시키거나 하는 것을 피하기 위해서군요.
htps //w w. 테라후 rm. 이오 / 드 cs / 똥구게 / 센친 gs / 바 c 켄 ds / s3. html # 무 l 치 아코 흠 t 아 ws

SSH 액세스용 공개키・비밀키 작성



생성할 EC2 인스턴스에 액세스할 수 있도록 키를 생성합니다.
$ ssh-keygen -C ""

구현



아래에 작성한 코드를 기재합니다.

디렉토리 구성
.
├── aws_instance.tf
├── aws_internet_gateway.tf
├── aws_key_pair.tf
├── aws_route_table.tf
├── aws_route_table_association.tf
├── aws_security_group.tf
├── aws_subnet.tf
├── aws_vpc.tf
├── files
│   └── user_data.sh
└── main.tf

main.tf
terraform {
  required_version = "~> 0.14"
  backend "s3" {
    bucket  = "XXXXX" # 作成したバケット名
    region  = "ap-northeast-1"
    key     = "terraform.tfstate"
    encrypt = true
  }
}

provider "aws" {
  region = "ap-northeast-1"
}
# VPC
resource "aws_vpc" "test" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "test-vpc"
  }
}

# サブネット
resource "aws_subnet" "test" {
  vpc_id                  = aws_vpc.test.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "ap-northeast-1a"
  map_public_ip_on_launch = true

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

# インターネットゲートウェイ
resource "aws_internet_gateway" "test" {
  vpc_id = aws_vpc.test.id

  tags = {
    Name = "test-igw"
  }
}

# ルートテーブル
resource "aws_route_table" "test" {
  vpc_id = aws_vpc.test.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.test.id
  }

  tags = {
    Name = "test-route-table"
  }
}

resource "aws_route_table_association" "test" {
  subnet_id      = aws_subnet.test.id
  route_table_id = aws_route_table.test.id
}

# キーペア
resource "aws_key_pair" "test" {
  key_name   = "test-key"
  public_key = "ssh-rsa XXXXX" # 事前に作成した公開鍵を貼り付ける
}

# EC2インスタンス
resource "aws_instance" "apache" {
  ami                         = "ami-06098fd00463352b6" # AmazonLinux 2 (x86)
  instance_type               = "t3.nano"
  subnet_id                   = aws_subnet.test.id
  user_data                   = file("./files/user_data.sh")
  key_name                    = aws_key_pair.test.key_name

  vpc_security_group_ids = [
    aws_security_group.web.id,
    aws_security_group.ssh.id
  ]

  tags = {
    Name = "test-server"
  }
}

# セキュリティグループ
resource "aws_security_group" "web" {
  name   = "web"
  vpc_id = aws_vpc.test.id

  ingress {
    description = "allow http"
    from_port   = "80"
    to_port     = "80"
    protocol    = "tcp"
    cidr_blocks = ["x.x.x.x/32"] # 必要なIP制限を設定
  }

  egress {
    from_port   = "0"
    to_port     = "0"
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_security_group" "ssh" {
  name   = "ssh"
  vpc_id = aws_vpc.test.id

  ingress {
    description = "allow ssh"
    from_port   = "22"
    to_port     = "22"
    protocol    = "tcp"
    cidr_blocks = ["x.x.x.x/32"] # 必要なIP制限を設定
  }

  egress {
    from_port   = "0"
    to_port     = "0"
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

user_data.sh
#!/bin/bash
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd

확인



실제로 액세스해 보겠습니다.

$ ssh -i ~/test_rsa [email protected]
Warning: Permanently added 'x.x.x.x' (ECDSA) to the list of known hosts.
Last login: Sat Apr 10 17:25:59 2021 from p6403009-ipoe.ipoe.ocn.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-0-1-137 ~]$ 

브라우저에서의 HTTP 액세스로 Apache의 테스트 페이지가 보이고, SSH로의 액세스도 사전에 작성한 비밀키를 사용해 문제 없게 할 수 있었습니다.

요약



사전의 S3 버킷 작성을 제외하고 Terraform만으로 Apache 서버의 기동까지를 실시했습니다.
인프라 환경을 코딩하는 것은 재미 있습니다. 계속 정진하고 싶습니다.

참고


  • htps : // 레기 스트리. 테라후 rm. 이오 / p 로즈 rs / 하시코 rp / 아 ws / 아 st / 두 cs
  • htps //w w. 아마존. 이. jp/dp/B07XT7LJLC
  • 좋은 웹페이지 즐겨찾기