Terraform에서 AWS 환경에 Apache 서버 생성
거의 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 서버의 기동까지를 실시했습니다.
인프라 환경을 코딩하는 것은 재미 있습니다. 계속 정진하고 싶습니다.
참고
Reference
이 문제에 관하여(Terraform에서 AWS 환경에 Apache 서버 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryu022304/items/9d820c5e4229e0966f89텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)