๐๐ป ์ด์ ๊ธ ์ฐธ๊ณ
Cloud9์์ ํคํ์ด ์์ฑ ํ AWS์ ๋ฑ๋ก
ํคํ์ด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. 1. AWS ์ฝ์์์ ํคํ์ด ์์ฑ -> Cloud9 ์ธ์คํด์ค๋ก ๊ฐ์ง๊ณ ์ค๊ธฐ 2. Cloud9 ์ธ์คํด์ค์์ ํคํ์ด ์์ฑ -> AWS์ ๋ฑ๋กํ๊ธฐ ์ฐ๋ฆฌ๋ 2๋ฒ์งธ ๋ฐฉ๋ฒ(SSH
taetoungs-branch.tistory.com

0. provider ์ง์
provider "aws" {
# access_key = "์์ ์ Key ๋ฅผ ์
๋ ฅ" # Cloud9 ์ ์ฌ์ฉํ๋ฉด IAM Role ์ ํ์ฉํ๊ฒ ๋ฉ๋๋ค. ๋ง์ผ Mac ์ฌ์ฉ์๋ IAM ์์ ๋ฐ๊ธํด์ผ ํฉ๋๋ค.
# secret_key = "์์ ์ Key ๋ฅผ ์
๋ ฅ"
region = "ap-northeast-2"
}
ํ ๋ผํผ์์ ์ฌ์ฉํ๋ provider๋ AWS, Azure, GCP ๋ฑ์ ๋งํ๋ค. ์๋์ ๋งํฌ์์ ํ์ธํ ์ ์๋ค.
Terraform Registry
registry.terraform.io
access key, secret key๊ฐ ์๋ ๊ฒฝ์ฐ ์์ฑ๊ฐ์ผ๋ก ์ ๋ ฅํ ์ ์๋ค. ํ์ฌ ์ค์ต์์๋ Cloud9์์ AWSCloud9SSMInstanceProfile Role์ ์ฌ์ฉํ๋ฏ๋ก ์๋ตํ๋ค.
1. AWS์ public key ๋ฑ๋ก
# aws์ importํ๋ ๋ช
๋ น์ด๋ ๊ฐ์๊ฑฐ -> ์ด๋ฏธ ๊ฐ์ ์ด๋ฆ์ ํคํ์ด๊ฐ ์
๋ก๋๋์ด์์ผ๋ฉด ์ถฉ๋๋จ
resource "aws_key_pair" "key-pair" {
key_name = "terraform-key"
public_key = file("/home/ec2-user/.ssh/tf-key.pub")
}
์ด์ ๊ธ์์ AWS CLI ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ Cloud9์ ์์นํ public key๋ฅผ importํด์ฃผ๋ ๋ช ๋ น์ด์ ๋์ผํ ์์ ์ ์ํํ๋ค.
public key๋ฅผ ํ๋์ฝ๋ฉ์ผ๋ก ์ง์ ๋ฃ์ด์ค ์๋ ์๊ฒ ์ง๋ง ๋ณด์์ ๊ทธ๋ ๊ฒ ์ฌ์ฉํ์ง ์๋๋ค. ์ด ์ฝ๋์์๋ Cloud9์ /home/ec2-user/.ssh ๋๋ ํ ๋ฆฌ์ ์๋ public keyํ์ผ์ ์ฐธ์กฐํ๋๋ก ์์ฑํ๋ค.
2. AMI ์ง์
data "aws_ami" "amzn2" {
most_recent = true
filter {
name = "name"
values = ["amzn2-ami-hvm-2.0.*-x86_64-gp2"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["amazon"] # Canonical
}
AWS์์ ๊ฐ์ฅ ์ต๊ทผ์ Amazon Linux 2, HVM ๊ฐ์ํ, x86_64 ์ํคํ ์ฒ, gp2 ๋ณผ๋ฅจ ํ์ ์ ๊ฐ์ง AMI ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
3. ๋ณด์๊ทธ๋ฃน ์์ฑ
resource "aws_security_group" "sg_web" {
name = "sg_web"
description = "Allow web inbound traffic"
vpc_id = "<VPC ID>" # ์ฌ์ฉํ๊ณ ์ํ๋ VPC ID ์
๋ ฅ
ingress {
description = "Web from VPC"
from_port = 0
to_port = 0
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"]
}
tags = {
Name = "allow_web"
}
}
๐๐ป ๋ช ๋ น์ด ์ค๋ช
ํด๋น ํ
๋ผํผ ์ฝ๋๋ AWS์ ๋ณด์ ๊ทธ๋ฃน์ ์์ฑํ๊ธฐ ์ํ ์ฝ๋์
๋๋ค. ๊ฐ ๋ถ๋ถ์ ๋ํด ์์ธํ๊ฒ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
1. ๊ธฐ๋ณธ ์ ๋ณด :
resource "aws_security_group" "sg_web" {
name = "sg_web"
description = "Allow web inbound traffic"
vpc_id = "<VPC ID>" # ์ฌ์ฉํ๊ณ ์ํ๋ VPC ID ์
๋ ฅ
- `resource "aws_security_group" "sg_web"`: AWS ๋ณด์ ๊ทธ๋ฃน ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ์ ์ธ์
๋๋ค. ์ด ๋ฆฌ์์ค์ local name์ "sg_web"์
๋๋ค.
- `name`: ์์ฑ๋ ๋ณด์ ๊ทธ๋ฃน์ ์ด๋ฆ์
๋๋ค.
- `vpc_id`: ํด๋น ๋ณด์ ๊ทธ๋ฃน์ด ์ฐ๊ฒฐ๋ VPC์ ID์
๋๋ค. `<VPC ID>`๋ ์ค์ VPC ID๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
2. ์์ ๊ท์น (Ingress) :
ingress {
description = "Web from VPC"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
- `from_port` ๋ฐ `to_port`: ์์ ์ ํ์ฉํ๋ ํฌํธ ๋ฒ์์
๋๋ค. ์ฌ๊ธฐ์๋ 0์ผ๋ก ์ค์ ๋์ด ์์ด ์ค์ ํฌํธ ์ ๋ณด๊ฐ ๋๋ฝ๋์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- `protocol`: "-1"์ ๋ชจ๋ ํ๋กํ ์ฝ์ ํ์ฉํ๋ค๋ ์๋ฏธ์
๋๋ค.
- `cidr_blocks`: ์์ ์ ํ์ฉํ๋ IP ์ฃผ์ ๋ฒ์์
๋๋ค. "0.0.0.0/0"์ ๋ชจ๋ IP ์ฃผ์์์์ ์ ๊ทผ์ ํ์ฉํจ์ ์๋ฏธํฉ๋๋ค.
3. ๋ฐ์ ๊ท์น (Egress) :
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
- `from_port` ๋ฐ `to_port`: ๋ฐ์ ์ ํ์ฉํ๋ ํฌํธ ๋ฒ์์
๋๋ค. 0์ผ๋ก ์ค์ ๋์ด ์์ผ๋, ํ๋กํ ์ฝ์ด "-1"๋ก ์ค์ ๋์ด ์์ด ๋ชจ๋ ํฌํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
- `protocol`: "-1"์ ๋ชจ๋ ํ๋กํ ์ฝ์ ํ์ฉํ๋ค๋ ์๋ฏธ์
๋๋ค.
- `cidr_blocks`: ๋ฐ์ ์ ํ์ฉํ๋ IP ์ฃผ์ ๋ฒ์์
๋๋ค. ์ฌ๊ธฐ์๋ "0.0.0.0/0"์ ๋ชจ๋ IP ์ฃผ์๋ก์ ์ ๊ทผ์ ํ์ฉํจ์ ์๋ฏธํฉ๋๋ค.
4. ํ๊ทธ (Tags) :
tags = {
Name = "allow_web"
}
- `tags`: AWS ๋ฆฌ์์ค์ ์ถ๊ฐํ ์ ์๋ ๋ฉํ๋ฐ์ดํฐ์
๋๋ค. ์ฌ๊ธฐ์๋ Name ํ๊ทธ์ "allow_web" ๊ฐ์ ๋ถ์ฌํ์์ต๋๋ค.
"sg_web"์ด๋ผ๋ ์ด๋ฆ์ AWS ๋ณด์ ๊ทธ๋ฃน์ ์์ฑํ๋ค. ์ด ๋ณด์๊ทธ๋ฃน์ ๋ชจ๋ IP์์ TCP ํ๋กํ ์ฝ๋ก์ ์์ ์ ๊ทผ์ ํ์ฉํ๊ณ , ๋ชจ๋ IP๋ก์ ๋ชจ๋ ํ๋กํ ์ฝ ๋ฐ ํฌํธ๋ก์ ๋ฐ์ ์ ํ์ฉํ๋ ์ค์ ์ ๊ฐ์ง๊ณ ์๋ค. (์๋ ์ด๋ ๊ฒ ๋ค ์คํํด๋์ผ๋ฉด ์๋์ง๋ง ์ค์ต ์ํฉ์ด๋ฏ๋ก ์ ์ฒดํ์ฉ์ ํด๋์๋ค.)
4. ์ธ์คํด์ค ์ ์
resource "aws_instance" "example-2a" {
ami = data.aws_ami.amzn2.id # ์ด์ ์ ์ ์๋ aws_ami ๋ฐ์ดํฐ ์์ค์์ amzn2 AMI์ ID๋ฅผ ์ฐธ์กฐ
instance_type = "t2.micro"
key_name = "tf-key"
vpc_security_group_ids = [aws_security_group.sg_web.id] # ์ด์ ์ ์ ์๋ aws_security_group ๋ฆฌ์์ค์์ sg_web ๋ณด์ ๊ทธ๋ฃน์ ID๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
subnet_id = "ap-northeast-2a์ ์๋ธ๋ท id"
availability_zone = "ap-northeast-2a"
user_data = file("./userdata.sh")
tags = {
Name = "Terraform-ec2-2a"
}
}
resource "aws_instance" "example-2c" {
ami = data.aws_ami.amzn2.id
instance_type = "t2.micro"
key_name = "tf-key"
vpc_security_group_ids = [aws_security_group.sg_web.id]
subnet_id = "ap-northeast-2c์ ์๋ธ๋ท id"
availability_zone = "ap-northeast-2c"
user_data = file("./userdata.sh")
tags = {
Name = "Terraform-ec2-2c"
}
}
ap-northeast-2 ๋ฆฌ์ ์ ์๋ ๋ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฉ ์์ญ(2a์ 2c)์ EC2 ์ธ์คํด์ค๋ฅผ ๊ฐ๊ฐ ํ๋์ฉ ์์ฑํ๋ค.
๋ ์ธ์คํด์ค ๋ชจ๋ ๋์ผํ AMI, ์ธ์คํด์ค ์ ํ, ํค ์ด๋ฆ, ๋ณด์ ๊ทธ๋ฃน ๋ฐ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ์ฐจ์ด์ ์ ๋ค๋ฅธ ์๋ธ๋ท, ๊ฐ์ฉ ์์ญ์ ์์นํ๋ค๋ ๊ฒ์ด๋ค.
user_data๋ EC2 ์ธ์คํด์ค ์์ ์ ์คํํ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ํ ์ ์๋ค.
./userdata.sh๋ผ๋ ํ์ผ์ ์์ฑํด์ user_data์ ๊ฐ์ผ๋ก ์ง์ ํด์ค๋ค.
5. user_data ์คํฌ๋ฆฝํธ ์์ฑ
#!/bin/sh
# Install a LAMP stack
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum -y install httpd php-mbstring
# Start the web server
chkconfig httpd on
systemctl start httpd
# Install the web pages for our lab
if [ ! -f /var/www/html/immersion-day-app-php7.tar.gz ]; then
cd /var/www/html
wget https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz
tar xvfz immersion-day-app-php7.tar.gz
fi
# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
cd /var/www/html
mkdir vendor
cd vendor
wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
unzip aws.zip
fi
# Update existing packages
yum -y update
Amazon Linux 2 AMI์์ LAMP(Linux, Apache, MariaDB, PHP) ์คํ์ ์ค์นํ๊ณ ์ค์ ํ๋ ์คํฌ๋ฆฝํธ์ด๋ค.
์ด ์คํฌ๋ฆฝํธ๋ ํ ๋ผํผ์ผ๋ก ์์ฑ๋ ์ EC2 ์ธ์คํด์ค์์ ์คํ๋๋ค.

๋ก๋๋ฐธ๋ฐ์ ์์ฑ ๋ฐ ์ฐ๊ฒฐ ์์ ์ ๋ค์ ๊ธ์์ ์ด์ด์ ์์ฑํ๊ฒ ๋ค! ๐พ
'DevOps > Terraform' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Terraform] 2. ๋ก๋๋ฐธ๋ฐ์ ์์ฑ ๋ฐ ์ฐ๊ฒฐ (0) | 2023.08.08 |
---|
๋๊ธ