다음은 주말 CloudNet 테라폼 스터디 내용 참고하여 정리한 부분입니다.
https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863
<1> userdata 사용해 웹서버 만들자.
<2> 과제 1
<3> 웹서버 설정 변경하기 - userdata 변경하기
<4> 변수 사용
<5> 확인
<6> 과제 2
<7> 과제 1 풀이
<8> 과제 2 풀이
<9> 코드와 실제 형상이 다른 경우 - 형상 관리하기 (별도 작업)
<1> userdata 사용해 웹서버 만들자.
1
아마존 리눅스 AMI 사용해 만들어 보자.
ami-0425f132103cb3ed8
서울에
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0425f132103cb3ed8"
instance_type = "t2.micro"
user_data = <<-EOF
#!/bin/bash
echo "Hello, T101 Study" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
Name = "terraform-Study-101"
}
}
EOT
2
오레곤에
ami-08e2d37b6a012992 사용
cat <<EOT > main.tf
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-08e2d37b6a0129927"
instance_type = "t2.micro"
user_data = <<-EOF
#!/bin/bash
echo "Hello, T101 Study" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
Name = "terraform-Study-101"
}
}
EOT
기타)
우분트 22.04 LTS 사용 - ami-0e9bfdb247cc8de84
ap-northeast-2
백그라운드로 간단한 웹서버 띠우기
echo "Hello, T101 Study" > index.html
nohup busybox httpd -f -p 8080 &
2
terraform plan
3
terraform apply -auto-approve
4
# [터미널 3] 띠워 모니터링 하기
콘솔에서 EC2 공인 IP 확인
PIP=<각자 자신의 EC2 IP>
PIP=13.125.57.186
while true; do curl --connect-timeout 1 http://$PIP:8080/ ; echo "------------------------------"; date; sleep 1; done
5
웹서버 접속 불가.
이유 보안 그룹.
보안 그룹에 허용 포트 8080 추가.
6
서울
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0e9bfdb247cc8de84"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, T101 Study" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
Name = "aws-tts-seou-web02"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-aws-tts-seoul-web02-sg"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
7
오레곤
cat <<EOT > main.tf
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-08e2d37b6a0129927"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, T101 Study" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
Name = "Single-WebSrv"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
// aws_security_group.instance.id] 는 aws 보안그룹이 인스턴스에 들어오는것이다.
// resource "aws_instance" 은 AWS 인스턴스를 만드는 것이다.
// resource "aws_security_group" 은 AWS의 보안 그룹을 만드는 것이다.
6
terraform plan
terraform apply --auto-approve
7
보안 그룹은 id라는 정보를 내보내므로 이를 참조하는 표현식은 아래와 같음
<2> 과제 1
우분트
Userdata 이용 EC2 웹서버 배포
닉네임 포함
테라폼 코드 작성하시요
<3> 웹서버 설정 변경하기 - userdata 변경하기
1
웹서버 포트를 9090으로 변경해보자.
userdata 값 변경시에는 ec2 replace를 사용한다.
서울
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0e9bfdb247cc8de84"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, T101 Study 9090" > index.html
nohup busybox httpd -f -p 9090 &
EOF
user_data_replace_on_change = true
tags = {
Name = "Single-WebSrv9090"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = 9090
to_port = 9090
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
2
오레곤
cat <<EOT > main.tf
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-08e2d37b6a0129927"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, T101 Study 9090" > index.html
nohup busybox httpd -f -p 9090 &
EOF
user_data_replace_on_change = true
tags = {
Name = "Single-WebSrv"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = 9090
to_port = 9090
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
2
terraform plan
디스트로이하고 다시 만든다고 나온다. (주의)
아래 옵션으로 인해 다시 만든다.
user_data_replace_on_change = true
3
terraform apply -auto-approve
4
PIP=<각자 자신의 EC2 IP>
PIP=54.180.123.229
while true; do curl --connect-timeout 1 http://$PIP:9090/ ; echo "------------------------------"; date; sleep 1; done
1차 타임아웃
Mon Oct 17 07:11:07 UTC 2022
curl: (28) Connection timeout after 1001 ms
적용후 index 보임
Mon Oct 17 09:58:54 UTC 2022
Hello, T101 Study
------------------------------
Mon Oct 17 09:58:55 UTC 2022
Hello, T101 Study
------------------------------
Mon Oct 17 09:58:56 UTC 2022
Hello, T101 Study
5
삭제
terraform destroy
6
웹서버 포트 변경 시 , 변수로 처리하기 ?
7
user_data_replace_on_change = no 인 경우 동작은?
<4> 변수 사용
변수 예시
1
웹서버 포트 변수로 처리하기
cat <<EOT > variables.tf
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
}
EOT
2
처리방법 4가지
1)
변수 값으로 처리 ?
terraform plan
var.server_port
The port the server will use for HTTP requests
Enter a value: 8080
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
2)
-var 옵션
terraform plan -var "server_port=8080"
3)
환경 변수로 지정
export TF_VAR_server_port=8080
terraform plan
# 환경변수 확인
export | grep TF_VAR_
# 환경변수 지정 삭제
unset TF_VAR_server_port
4)
디폴트 값으로 처리
cat <<EOT > variables.tf
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
default = 8080
}
EOT
# plan
terraform plan
3
작업
cat <<EOT > variables.tf
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
default = 8080
}
EOT
4
cat <<EOT > main.tf
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-08e2d37b6a0129927"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "My Web Server - var test" > index.html
nohup busybox httpd -f -p \${var.server_port} &
EOF
user_data_replace_on_change = true
tags = {
Name = "Single-MyWebSrv"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-my-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
// nohup busybox httpd -f -p \${var.server_port} & 에서
\ 빼고 nohup busybox httpd -f -p ${var.server_port} & 로 복사 해야 함.
mac에서는 \ 이 필요함.
5
terraform plan
terraform apply -auto-approve
<5> 확인
1
# 리소스 상태 확인
terraform state list
aws_instance.example
aws_security_group.instance
terraform state show aws_instance.example
terraform state show aws_security_group.instance
2
# 모니터링 : EC2 정보와 curl 접속 확인
# [터미널3] 변수 PIP로 변경
PIP=<각자 자신의 EC2 IP>
PIP=13.125.57.186
PPT=8080
while true; do curl --connect-timeout 1 http://$PIP:$PPT/ ; echo "------------------------------"; date; sleep 1; done
3
# 삭제
terraform destroy -auto-approve
terraform init
<6> 과제 2
과제 1에서 변수처리로 변경하세요.
50000번 포트 사용하세요.
테라폼 코드 작성하세요
<7> 과제 1 풀이
우분트
Userdata 이용 EC2 웹서버 배포
닉네임 포함
테라폼 코드 작성하시요
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0e9bfdb247cc8de84"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
apt-get update -y
apt install apache2 -y
sudo systemctl start apache2.service
echo '<html><h1>Master seo Web Server!</h1></html>' > /var/www/html/index.html
EOF
user_data_replace_on_change = true
tags = {
Name = "Single-WebSrv4"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
protocol = "-1"
from_port = 0
to_port = 0
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance4"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
// userdata라 서버에서 실행이 되어야 해서 외부로 접속이 되어야 한다.
보안그룹 나가는건 모두 허용해야 한다는 뜻이다.
egress {
protocol = "-1"
from_port = 0
to_port = 0
cidr_blocks = ["0.0.0.0/0"]
}
<8> 과제 2 풀이
과제 1에서 변수처리로 변경하세요.
50000번 포트 사용하세요.
테라폼 코드 작성하세요
1
변수
cat <<EOT > variables.tf
variable "server_port" {
description = "The port the server will use for HTTP requests"
type = number
default = 50000
}
EOT
2
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0e9bfdb247cc8de84"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
apt-get update -y
apt install apache2 -y
sudo sed -i "s/^Listen 80/Listen 50000/g" /etc/apache2/ports.conf
echo '<html><h1>Master seo 50000 port Web Server!</h1></html>' > /var/www/html/index.html
sudo systemctl restart apache2.service
EOF
tags = {
Name = "Single-MyWebSrv8"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
protocol = "-1"
from_port = 0
to_port = 0
cidr_blocks = ["0.0.0.0/0"]
}
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-my-instance8"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
EOT
3
terraform plan
terraform apply -auto-approve
4
PIP=13.125.57.186
PPT=50000
while true; do curl --connect-timeout 1 http://$PIP:$PPT/ ; echo "------------------------------"; date; sleep 1; done
5
확인
조금 시간이 걸린다.
e Oct 18 01:36:35 UTC 2022
<html><h1>Master seo 50000 port Web Server!</h1></html>
------------------------------
Tue Oct 18 01:36:36 UTC 2022
<html><h1>Master seo 50000 port Web Server!</h1></html>
------------------------------
Tue Oct 18 01:36:38 UTC 2022
<html><h1>Master seo 50000 port Web Server!</h1></html>
------------------------------
Tue Oct 18 01:36:39 UTC 2022
<html><h1>Master seo 50000 port Web Server!</h1></html>
다음과정
https://brunch.co.kr/@topasvga/2421
감사합니다.