ππ» μ΄μ κΈ μ°Έκ³
0. provider μ§μ
provider "aws" {
# access_key = "μμ μ Key λ₯Ό μ
λ ₯" # Cloud9 μ μ¬μ©νλ©΄ IAM Role μ νμ©νκ² λ©λλ€. λ§μΌ Mac μ¬μ©μλ IAM μμ λ°κΈν΄μΌ ν©λλ€.
# secret_key = "μμ μ Key λ₯Ό μ
λ ₯"
region = "ap-northeast-2"
}
ν λΌνΌμμ μ¬μ©νλ providerλ AWS, Azure, GCP λ±μ λ§νλ€. μλμ λ§ν¬μμ νμΈν μ μλ€.
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 |
---|
λκΈ