[실습]
- EC2를 배포하기 위한 기본 네트워크 환경을 EC2를 포함하여 배포
VPC 배포는 이전 글의 코드를 기반으로 사용했다.
코드 구조는 3개로 이루어져있다.
## main.tf
provider "aws" {
region = "ap-northeast-2"
}
data "aws_availability_zones" "az-zone" {
state = "available"
}
variable "names" {
default = "ssungz"
}
locals {
cidr_list = [
"10.10.1.0/28",
"10.10.2.0/28"
]
}
resource "aws_vpc" "ssungz-aws_vpc" {
cidr_block = "10.10.0.0/16"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "${var.names}-vpc"
}
}
resource "aws_subnet" "subnets" {
vpc_id = aws_vpc.ssungz-aws_vpc.id
count = length(local.cidr_list)
cidr_block = element(local.cidr_list, count.index)
availability_zone = element(data.aws_availability_zones.az-zone.names, count.index)
tags = {
Name = "Pub-subnet-${count.index}"
}
}
resource "aws_internet_gateway" "ssungz-igw" {
vpc_id = aws_vpc.ssungz-aws_vpc.id
tags = {
Name = "${var.names}-igw"
}
}
resource "aws_route_table" "ssungzrt" {
vpc_id = aws_vpc.ssungz-aws_vpc.id
tags = {
Name = "${var.names}-rt"
}
}
resource "aws_route_table_association" "ssung-asso1" {
subnet_id = aws_subnet.subnets[0].id
route_table_id = aws_route_table.ssungzrt.id
}
resource "aws_route_table_association" "ssung-asso2" {
subnet_id = aws_subnet.subnets[1].id
route_table_id = aws_route_table.ssungzrt.id
}
resource "aws_route" "ssungz-route" {
route_table_id = aws_route_table.ssungzrt.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.ssungz-igw.id
}
## sg.tf
resource "aws_security_group" "ssungz-sg" {
vpc_id = aws_vpc.ssungz-aws_vpc.id
name = "${var.names}-SG"
description = "Test Description"
}
resource "aws_security_group_rule" "ssungz-in" {
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.ssungz-sg.id
}
resource "aws_security_group_rule" "ssungz-out" {
type = "egress"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.ssungz-sg.id
}
## EC2.tf
data "aws_ami" "ssungz-azlx" {
most_recent = true
filter {
name = "owner-alias"
values = ["amazon"]
}
filter {
name = "name"
values = ["amzn2-ami-hvm-*-x86_64-ebs"]
}
owners = ["amazon"]
}
#
# owner-alias와 owner은 비슷하게 ami의 소유자의 별칭을 가져오는 역할을 한다.
# 단, owner-alias는 명시적인 별칭 사용에 중점을 두고,
# owners 는 계정 ID나 별칭을 사용할 수 있기 때문에 비슷하지만 차이점이 있다.
#
resource "aws_instance" "ssungz-ec2" {
depends_on = [
aws_internet_gateway.ssungz-igw
]
ami = data.aws_ami.ssungz-azlx.id
associate_public_ip_address = true
instance_type = "t2.micro"
subnet_id = aws_subnet.subnets[0].id
user_data_replace_on_change = true
user_data = <<-EOF
#!/bin/bash
wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64
mv busybox-x86_64 busybox
chmod +x busybox
#RZAZ=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone-id)
#IID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
#LIP=$(curl http://169.254.169.254/latest/meta-data/local-ipv4)
echo "<h1>RegionAz(asdf) : Instance ID(1546) : Private IP(127.0.0.1) : Web Server <\h1>" > index.html
nohup ./busybox httpd -f -p 80 &
EOF
tags = {
Name = "${var.names}-ec2"
}
}
output "ssungz-ec2-pubip" {
value = aws_instance.ssungz-ec2.public_ip
}
# 공인 IP 변수 설정
MYIP=$(terraform output -raw ssungz-ec2-pubip)
# 접속 확인
curl --connect-timeout 1 http://$MYIP
생성된 리소스 graph 확인
Local 지역 값
코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 Local(지역 값)은 외부에서 입력되지 않고, 코드 내에서만 가공되어 동작하는 값을 선언한다.
'local'은 입력 변수와 달리 선언된 모듈 내에서만 접근 가능하고, 변수처럼 실행 시에 입력받을 수 없다.
- local 선언
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
content = "${var.prefix} ${local.name}"
my_info = {
age = 20
region = "KR"
}
my_nums = [1, 2, 3, 4, 5]
}
locals {
content = "content2"
}
# 초기화 진행
$ terraform init
로컬 블록이 2개가 선언되었으므로 배포 시 에러가 발생하고 있다.
하위 로컬 블럭을 제거하거나, 하나로 병합해야한다.
단, 병합 시 content가 중복 선언될 경우 마지막에 선언된 content로 overwrite 된다.
- local 참조
data, variable과 동일하게 local.<이름>으로 참조할 수 있다.
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
}
resource "local_file" "abc" {
content = local.content
filename = "${path.module}/abc.txt"
}
locals {
content = "${var.prefix} ${local.name}"
}
다른 파일에 선언되어 있어도 서로참조할 수 있고,
파일이 다르기 때문에 여러 local을 선언할 수 있다.
- local 값으로 iam 유저 생성하기
provider "aws" {
region = "ap-northeast-2"
}
locals {
name = "ssungz-test"
team = {
group = "dev"
}
}
resource "aws_iam_user" "ssungz-iam-user1" {
name = "${local.name}1"
}
resource "aws_iam_user" "ssungz-iam-user2" {
name = "${local.name}2"
}
배포 후 iam user 생성 확인
- terraform state 확인
- aws iam list-users 로 확인
출력 Output
출력 값은 주로 테라폼 코드의 프로비저닝 수행 후의 결과 속성 값을 확인하는 용도로 사용된다.
테라폼 모듈 간, 출력 데이터 접근 요소로도 사용할 수 있다.
- Output 선언
- 모듈 내에서 생성되는 속성 값은 output 블록에 정의된다.
- 출력되는 값은 value의 값이며, 테라폼이 제공하는 조합과 프로그래밍적인 기능들에 의해 원하는 값을 출력할 수 있다.
- 주의할 점은 output 결과에서 리소스 생성 후 결정되는 속성 값은 프로비저닝이 완료되어야 최종적으로 결과를 확인할 수 있고,
terraform plan 단계에서는 적용될 값이 출력되지 않는다. - 변수 정의 시 사용 가능한 메타인수는 다음과 같다.
- description : 출력 값 설명
- sensitive : 민감한 출력 값임을 알리고 테라폼의 출력문에서 값 노출을 제한
- depends_on : value에 담길 값이 특정 구성에 종속성이 있는 경우 생성되는 순서를 임의로 조정
- precondition : 출력 전에 지정된 조건 검증
- Output 실습
resource "local_file" "abc" {
content = "abc123"
filename = "${path.module}/abc.txt"
}
output "file_id" {
value = local_file.abc.id
}
# abspath는 해당하는 파일의 시스템 경로를 절대 경로로 변환하는 함수다.
output "file_abspath" {
value = abspath(local_file.abc.filename)
}
abspath를 통해 파일이 생성될 위치의 절대 경로는 확인 할 수 있지만,
파일이 실제 스토리지에 할당된 후 확인할 수 있기 때문에 plan으로는 file_id 값을 plan으로 확인할 수 없다.
'Cloud > Terraform' 카테고리의 다른 글
[T101] Terraform 101 Study 3주차 (1) (0) | 2024.06.26 |
---|---|
[T101] Terraform 101 Study 2주차 (3) (0) | 2024.06.22 |
[T101] Terraform 101 Study 2주차 (1) (0) | 2024.06.18 |
[T101] Terraform 101 Study 1주차 (3) (0) | 2024.06.15 |
[T101] Terraform 101 Study 1주차 (2) (0) | 2024.06.10 |