기본 명령어
// 프로덕션 환경에선 중요하다
terraform plan -out file.terraform
terraform apply file.terraform
// 프로덕션에서는 주의할 것
terraform destroy
변수 유형
- string, number, bool
- List
- 배열
- map
- key - value
- set
- 유니크한 값들로 구성
- Object
- Map과 유사하지만 각 키가 다른 value 타입을 가질 수 있음
- tuple
- list와 같지만 각 요소가 다른 값들을 가질 수 있음
Terraform 변수
- secrets한 값들을 숨김
- credentials
- 변화되는 값들을 관리
- AMIs, type, value
코드 관리
variables.tf 에서 변수를 관리
terraform.tfvars , .env 처럼 비공개 변수를 관리
resource "aws_key_pair" "mykey" {
key_name = "mykey"
public_key = file(var.PATH_TO_PUBLIC_KEY)
}
resource "aws_instance" "example" {
ami = var.AMIS[var.AWS_REGION]
instance_type = "t2.micro"
key_name = aws_key_pair.mykey.key_name
provisioner "file" {
source = "script.sh"
destination = "/tmp/script.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/script.sh",
"sudo sed -i -e 's/\\r$//' /tmp/script.sh", # Remove the spurious CR characters.
"sudo /tmp/script.sh",
]
}
connection {
host = coalesce(self.public_ip, self.private_ip)
type = "ssh"
user = var.INSTANCE_USERNAME
private_key = file(var.PATH_TO_PRIVATE_KEY)
}
}
variable "AWS_REGION" {
default = "us-east-1"
}
variable "AMIs" {
type = map(string)
default = {
us-east-1 = "ami-0c7217cdde317cfec"
ap-northeast-2 = "ami-0f3a440bbcff3d043"
}
}
variable "PATH_TO_PRIVATE_KEY" {
default = "bjc-terraform-key"
}
variable "PATH_TO_PUBLIC_KEY" {
default = "bjc-terraform-key.pub"
}
variable "INSTANCE_USERNAME" {
default = "ubuntu"
}
#!/bin/bash
# sleep until instance is ready
until [[ -f /var/lib/cloud/instance/boot-finished ]]; do
sleep 1
done
# install nginx
apt-get update
apt-get -y install nginx
# make sure nginx is started
service nginx start
윈도우 서버 프로비저닝
윈도우는 AMI를 다음과 같이 불러왔다.
최신 버전을 유지하고 업데이트되는 버전과 관계없이 사용하기 위해 아래와 같이 작성되었다.
# data source to retrieve windows AMI
data "aws_ami" "windows-ami" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["Windows_Server-2019-English-Full-Base-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
filter {
name = "architecture"
values = ["x86_64"]
}
}
ami = data.aws_ami.windows-ami.image_id
aws ec2 get-password-data --instance-id i-065f3db90c2892835 --priv-launch-key bjc-terraform-key --region=us-east-1
window 관리자 암호를 얻으려고 할 때 명령어가 제대로 작동하지 않았다.
구글링 해본 결과 private key 형식이 문제였는데 기본 생성 형식인 RSA가 OpenSSH 형식으로 변경되니 정상적으로 동작하였다
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
-----BEGIN OPENSSH PRIVATE KEY-----
-----END OPENSSH PRIVATE KEY-----
aws ec2 get-password-data --instance-id i-065f3db90c2892835 --priv-launch-key bjc-terraform-key --region=us-east-1
Terraform Output
생성된 리소스의 속성을 출력해준다.
이후 스크립트에서도 속성을 사용할 수 있음
해당 명령은 로컬에서 실행됨
해당 명령을 통해 private ip를 텍스트 파일로 수집 가능
인프라 프로비저닝 후에 자동화 스크립트를 시작하는 경우에 유용함
Terraform state
인프라의 원격 상태를 유지
terraform.tfstate , terraform.tfstate.backup
현재 상태를 백업하는 tfstate와 이전 상태의 백업은 .backup
만약 terraform으로 띄운 인스턴스를 종료시키면 이후 테라폼에서 apply를 적용한다면 다시 올라간다.
테라폼의 백엔드 기능을 사용해 terraform.tfstat 파일을 원격으로 저장 가능
tfstate 파일을 저장하는 방법은 여러가지인데 잠금을 지원하는 s3, consul과 자체 terraform enterprise 등이 있다.
Lock을 걸면 충돌 문제가 발생되지 않는다.
완전히 민감한 정보를 로컬에 보관하지 않고 진행되는 원격 운영도 있으며, apply가 완전히 백엔드에서 진행되며 이러한 백엔드를 향상된 백엔드라고 한다.
백엔드를 사용하기 위해선 먼저 configure를 통해 인증되어야한다.
변수가 사용되기전에 백엔드 코드는 s3에 엑세스 되어야하기 때문임
terraform init 을 시도하면 백엔드를 초기화
- 최신 버전 상태 유지가 쉬움
- s3, consul만 잠금, 읽기 전용 원격 보관소 지원
- 이미 원격에 있는 tfstate 파일에서 읽기만 하려는 경우도 지원
정상 생성 확인
variable "AWS_REGION" {
default = "ap-northeast-2"
}
variable "AMIS" {
type = map(string)
default = {
us-east-1 = "ami-13be557e"
us-west-2 = "ami-06b94666"
eu-west-1 = "ami-844e0bf7"
ap-northeast-2 = "ami-0f3a440bbcff3d043"
}
}
# backend.tf
terraform {
backend "s3" {
bucket = "bjc-terraform-backend"
region = "ap-northeast-2"
}
}
Datasources
AWS와 같은 특정 공급자의 경우 테라폼은 데이터 소스를 제공
- 데이터 소스는 동적 정보를 제공합니다.
- 많은 데이터를 API로 제공
- 데이터소스를 통한 노출 가능
- AMI 리스트, AZ 리스트 등등
- AWS에서 사용 중인 모든 IP 주소를 제공하는 데이터 소스
- AWS 리전에 따라 트래픽을 필터링하는데 유용함
- eu-west-1과 eu-central-1에 대한 모든 IP주소 출력을 명시
data "aws_ip_ranges" "asian_ec2" {
regions = ["ap-northeast-2", "ap-northeast-3"]
services = ["ec2"]
}
data "aws_ami" "amazon_linux_2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "owner-alias"
values = ["amazon"]
}
filter {
name = "name"
values = ["al2023-ami-*"]
}
filter {
name = "architecture"
values = ["x86_64"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
output "aws_ami_id" {
value = data.aws_ami.amazon_linux_2023
}
resource "aws_security_group" "from_asia" {
name = "from_asia"
ingress {
from_port = "443"
to_port = "443"
protocol = "tcp"
cidr_blocks = slice(data.aws_ip_ranges.asian_ec2.cidr_blocks, 0, length(data.aws_ip_ranges.asian_ec2.cidr_blocks) - 1)
}
tags = {
CreateDate = data.aws_ip_ranges.asian_ec2.create_date
SyncToken = data.aws_ip_ranges.asian_ec2.sync_token
}
}
data로 aws에서 데이터를 가져와 사용 가능함
Template provider
- 템플릿 공급자는 사용자 정의 구성 파일을 만드는데 사용됨
- 테라폼 리소스 속성의 변수를 기반으로 템플릿 구축 가능
- user-data와 비슷한데 IP주소와 같은 테라폼의 정보에 의존하는 user-data를 전달하려는 경우 템플릿을 통해 제공할 수 있음
- template_file을 통해 변수를 전달 가능
- vars 를 통해 변수 또한 대체 가능
Module
모듈을 사용하여 타사 모듈을 사용할 수도 있다.
깃허브 모듈 또는 코드 일부를 재사용 가능
모듈을 확인하고 사용할 줄만 안다면 더 편해보인다.
- root 모듈과 submodule로 분류
Terraform Command
- 리소스 정의에 중점
- 수정하고 가져오고 리소스 정의를 생성하는데 사용할 수 있는 툴이 제한적
- 실행중인 인스턴스가 있지만 아직 테라폼에 없는 경우 import를 사용하여 가져올 수 있음
- 다만 수동으로 정의가 필요
- 모듈을 가져오는 get
- 리소스의 이름을 변경하는 등 상태를 수정하려면 state mv
- 리소스에 문제가 있고 다시 생성하려는 경우 taint
- terraform syntax 검증하는 vaildate
유용한 명령어
- terraform.tfstate → terraform show
Terraform with AWS
- vpc 생성
- EBS 볼륨
- 루트 볼륨 + 추가 볼륨
user-data
- 인스턴스 시작시만 가능
- consul cluster, ECS cluster
- 시작할 때 볼륨 마운트의 유용하고 인스턴스의 재부팅이 아니라 생성시에만 실행됨
- 템플릿으로 추가 가능 pv → 물리 볼륨 lv → 논리 볼륨
- 만약 인스턴스가 종료되고 다시 시작한다고 하더라도 포맷하지않고 파일을 보존
root@ip-10-0-1-22:~# pvdisplay
--- Physical volume ---
PV Name /dev/xvdh
VG Name data
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 5119
Free PE 0
Allocated PE 5119
PV UUID 2EPwfx-Zvoo-HBlp-TcTC-MpcD-XSF1-ead1u0
root@ip-10-0-1-22:~# lvdisplay
--- Logical volume ---
LV Path /dev/data/volume1
LV Name volume1
VG Name data
LV UUID AhPDnc-cln6-g3hE-RBwO-kH40-WEfB-J3ZAVq
LV Write Access read/write
LV Creation host, time ip-10-0-1-22, 2024-01-05 06:04:09 +0000
LV Status available
# open 1
LV Size 20.00 GiB
Current LE 5119
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
- Route53
resource "aws_route53_zone" "newtech-academy" {
name = var.DOMAIN_NAME
}
resource "aws_route53_record" "server1-record" {
zone_id = aws_route53_zone.newtech-academy.zone_id
name = "server1.${var.DOMAIN_NAME}"
type = "A"
ttl = "300"
records = ["104.236.247.8"]
}
resource "aws_route53_record" "www-record" {
zone_id = aws_route53_zone.newtech-academy.zone_id
name = "www.${var.DOMAIN_NAME}"
type = "A"
ttl = "300"
records = ["104.236.247.8"]
}
resource "aws_route53_record" "mail1-record" {
zone_id = aws_route53_zone.newtech-academy.zone_id
name = "www.${var.DOMAIN_NAME}"
type = "MX"
ttl = "300"
records = [
"1 aspmx.l.google.com.",
"5 alt1.aspmx.l.google.com.",
"5 alt2.aspmx.l.google.com.",
"10 aspmx2.googlemail.com.",
"10 aspmx3.googlemail.com.",
]
}
output "ns-servers" {
value = aws_route53_zone.newtech-academy.name_servers
}
RDS
- 서브넷
- RDS 리소스
- DB 파라미터 그룹
- DB 파라미터 그룹은 AWS의 관계형 데이터베이스 서비스인 Amazon RDS에서 데이터베이스 엔진의 설정을 관리하는 데 사용되는 구성
resource "aws_db_subnet_group" "mariadb-subnet" {
name = "mariadb-subnet"
subnet_ids = [aws_subnet.main-private-1.id, aws_subnet.main-private-2.id, aws_subnet.main-private-3.id]
}
resource "aws_db_parameter_group" "mariadb-parameters" {
name = "mariadb-parameters"
family = "mariadb10.4"
description = "MariaDB parameter group"
parameter {
name = "max_allowed_packet"
value = "16777216"
}
}
resource "aws_db_instance" "mariadb" {
allocated_storage = 100 # 100 GB of storage, gives us more IOPS than a lower number
engine = "mariadb"
engine_version = "10.4"
instance_class = "db.t2.small" # use micro if you want to use the free tier
identifier = "mariadb"
db_name = "mariadb"
username = "root" # username
password = var.RDS_PASSWORD # password
db_subnet_group_name = aws_db_subnet_group.mariadb-subnet.name
parameter_group_name = aws_db_parameter_group.mariadb-parameters.name
multi_az = "false" # set to true to have high availability: 2 instances synchronized with each other
vpc_security_group_ids = [aws_security_group.allow-mariadb.id]
storage_type = "gp2"
backup_retention_period = 30 # how long you’re going to keep your backups
availability_zone = aws_subnet.main-private-1.availability_zone # prefered AZ
skip_final_snapshot = true # skip final snapshot when doing terraform destroy
tags = {
Name = "mariadb-instance"
Enviroment = "test"
}
}
IAM
리소스 접근 관리를 위해 사용됨
{
"Code" : "Success",
"LastUpdated" : "2024-01-08T00:30:11Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "",
"SecretAccessKey" : "",
"Token" : "I",
"Expiration" : "2024-01-08T07:05:39Z"
}
# 인스턴스 프로필
resource "aws_iam_role" "s3-mybucket-role" {
name = "s3-mybucket-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
resource "aws_iam_instance_profile" "s3-mybucket-role-instanceprofile" {
name = "s3-mybucket-role"
role = aws_iam_role.s3-mybucket-role.name
}
# s3 프로필
resource "aws_iam_role_policy" "s3-mybucket-role-policy" {
name = "s3-mybucket-role-policy"
role = aws_iam_role.s3-mybucket-role.id
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::mybucket-c29df1",
"arn:aws:s3:::mybucket-c29df1/*"
]
}
]
}
EOF
}
Autoscaling group
- 2개의 리소스를 정의해야함
- launch configuration(서비스 종료) ⇒ launch template
- autoscaling group, 스케일링 정책
- 동적으로 증가하거나 감소하는 인스턴스를 실행하고자 하면 aws_autoscaling_policy가 필요
# resource "aws_launch_configuration" "example-launchconfig" {
# name_prefix = "example-launchconfig"
# image_id = var.AMIS[var.AWS_REGION]
# instance_type = "t2.micro"
# key_name = aws_key_pair.mykeypair.key_name
# security_groups = [aws_security_group.allow-ssh.id]
# }
resource "aws_launch_template" "example-launchtemplate" {
name_prefix = "example-launchtemplate"
image_id = var.AMIS[var.AWS_REGION]
instance_type = "t2.micro"
key_name = aws_key_pair.mykeypair.key_name
network_interfaces {
security_groups = [aws_security_group.allow-ssh.id]
}
tag_specifications {
resource_type = "instance"
tags = {
Name = "ec2 instance"
}
}
}
resource "aws_autoscaling_group" "example-autoscaling" {
name = "example-autoscaling"
vpc_zone_identifier = [aws_subnet.main-public-1.id, aws_subnet.main-public-2.id]
min_size = 1
max_size = 2
health_check_grace_period = 300
health_check_type = "EC2"
force_delete = true
# Refer to the launch template
launch_template {
id = aws_launch_template.example-launchtemplate.id
version = "$Latest"
}
tag {
key = "Name"
value = "ec2 instance"
propagate_at_launch = true
}
}
####################
# scale up alarm #
####################
resource "aws_autoscaling_policy" "example-cpu-policy" {
name = "example-cpu-policy"
autoscaling_group_name = aws_autoscaling_group.example-autoscaling.name
adjustment_type = "ChangeInCapacity"
scaling_adjustment = "1"
cooldown = "300"
policy_type = "SimpleScaling"
}
resource "aws_cloudwatch_metric_alarm" "example-cpu-alarm" {
alarm_name = "example-cpu-alarm"
alarm_description = "example-cpu-alarm"
comparison_operator = "GreaterThanOrEqualToThreshold"
# 평가 기간 evaluation_periods = "2, period = "120"
# 120초동안 cpu 사용률이 30퍼가 넘는다고 경보가 울리지 않고 120초 동안 30퍼 이상이 두 번 유지될 경우
# 경보가 발생한다
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
# 적용되는 시간 ex) 120초 동안 cpu 평균이 threshold 이상이라면 알람이 트리거됨
period = "120"
statistic = "Average"
# 비교값
threshold = "30"
dimensions = {
"AutoScalingGroupName" = aws_autoscaling_group.example-autoscaling.name
}
actions_enabled = true
alarm_actions = [aws_autoscaling_policy.example-cpu-policy.arn]
}
####################
# scale down alarm #
####################
resource "aws_autoscaling_policy" "example-cpu-policy-scaledown" {
name = "example-cpu-policy-scaledown"
autoscaling_group_name = aws_autoscaling_group.example-autoscaling.name
adjustment_type = "ChangeInCapacity"
scaling_adjustment = "-1"
cooldown = "300"
policy_type = "SimpleScaling"
}
resource "aws_cloudwatch_metric_alarm" "example-cpu-alarm-scaledown" {
alarm_name = "example-cpu-alarm-scaledown"
alarm_description = "example-cpu-alarm-scaledown"
comparison_operator = "LessThanOrEqualToThreshold"
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "120"
statistic = "Average"
threshold = "5"
dimensions = {
"AutoScalingGroupName" = aws_autoscaling_group.example-autoscaling.name
}
actions_enabled = true
alarm_actions = [aws_autoscaling_policy.example-cpu-policy-scaledown.arn]
}
스케일링 정책 참고
- OldestInstance: 이 정책은 그룹에서 가장 오래된 EC2 인스턴스의 종료를 우선시합니다. 이는 인스턴스를 정기적으로 재활용하려는 경우 또는 최신 인스턴스의 성능이나 안정성이 더 좋을 경우 유용할 수 있습니다.
- NewestInstance: **OldestInstance**와 반대입니다. 가장 최근에 시작된 인스턴스를 먼저 종료합니다. 이는 이전 인스턴스가 더 중요하거나 유지하려는 특정 구성이 있는 시나리오에서 유용할 수 있습니다.
- OldestLaunchConfiguration: 이 정책은 가장 오래된 시작 구성으로 시작된 인스턴스를 대상으로 합니다. 인스턴스를 최신 구성의 인스턴스로 점진적으로 교체하는 데 유용합니다.
- ClosestToNextInstanceHour: 이 정책은 다음 청구 시간에 가장 가까운 인스턴스를 선택하여 먼저 종료합니다. 이는 시간당 인스턴스 비용을 지불하는 경우 요금을 최소화하는 데 도움이 되도록 설계되었습니다.
- OldestLaunchTemplate: **OldestLaunchConfiguration**과 유사하게 이 정책은 가장 오래된 시작 템플릿으로 시작된 인스턴스를 대상으로 합니다. 이는 인스턴스를 최신 구성으로 최신 상태로 유지하는 또 다른 방법입니다.
- AllocationStrategy: 주로 EC2 스팟 인스턴스에 사용됩니다. 스팟 인스턴스 풀에 적용되는 할당 전략을 고려하여 종료할 인스턴스를 결정하는 데 도움이 됩니다.
- 기본값: 종료 정책을 지정하지 않으면 AWS는 기본 정책을 사용합니다. 여기에는 일반적으로 종료할 인스턴스를 결정하기 위한 위의 정책 조합이 포함됩니다.
- Lambda ARN: AWS Lambda 함수의 Amazon 리소스 이름(ARN)을 지정하여 사용자 지정 종료 정책을 호출할 수도 있습니다. 이를 통해 AWS의 기본 정책이 지원하지 않는 복잡한 종료 논리를 정의할 수 있습니다.
Load Balancer
ELB 자체가 스케일 됨
- SSL 터미네이터
- 여러 가용 영역에 분산되어 존재
- 애플리케이션 수준에 따라 트래픽을 라우팅
resource "aws_elb" "my-elb" {
name = "my-elb"
subnets = [aws_subnet.main-public-1.id, aws_subnet.main-public-2.id]
security_groups = [aws_security_group.elb-securitygroup.id]
listener {
instance_port = 80
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
}
health_check {
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 3
target = "HTTP:80/"
interval = 30
}
cross_zone_load_balancing = true
connection_draining = true
connection_draining_timeout = 400
tags = {
Name = "my-elb"
}
}
Connection Draining: 인스턴스가 등록 취소되면(수동 또는 축소의 일부 혹은 종료..) 등록 취소 지연 타이머가 시작됩니다. 로드 밸런서는 등록 취소 인스턴스에 대한 새 요청 또는 연결 라우팅을 중지하지만 기존 연결은 열린 상태로 유지합니다.
ALB
ELB와의 차이점은 다른 규칙에 따라 트래픽을 다른 인스턴스로 다시 지정할 수 있다.
alb_lb_listener_rule
resource "aws_alb" "my-elb" {
name = "my-elb"
subnets = [aws_subnet.main-public-1.id, aws_subnet.main-public-2.id]
internal = false
security_groups = [aws_security_group.elb-securitygroup.id]
enable_deletion_protection = false
tags = {
Name = "my-elb"
}
}
# resource "aws_lb_target_group_attachment" "test" {
# target_group_arn = aws_lb_target_group.test.arn
# target_id = aws_instance.test.id
# port = 80
# }
# instances를 타겟으로 잡으려면 attach가 추가적으로 필요함
# autoscaling에 연결
resource "aws_autoscaling_group" "example-autoscaling" {
name = "example-autoscaling"
vpc_zone_identifier = [aws_subnet.main-public-1.id, aws_subnet.main-public-2.id]
launch_configuration = aws_launch_configuration.example-launchconfig.name
min_size = 2
max_size = 2
health_check_grace_period = 300
health_check_type = "ELB"
target_group_arns = [aws_lb_target_group.example.arn]
force_delete = true
tag {
key = "Name"
value = "ec2 instance"
propagate_at_launch = true
}
}
resource "aws_lb_target_group" "example" {
name = "bjc-tg-test"
port = 80
protocol = "HTTP"
vpc_id = aws_vpc.main.id
health_check {
#2번 연속 확인되어야 정상으로 간주
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 3
interval = 30
path = "/"
matcher = "200"
}
deregistration_delay = 400
}
resource "aws_lb_listener" "front_end" {
load_balancer_arn = aws_alb.my-elb.arn
port = "80"
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.example.arn
}
}
Elastic Beanstalk
- 인프라 유지없이 앱 실행가능하며 애플리케이션 스케일링이 가능하며 스케일링 이벤트 혹은 메트릭에 따라 스케줄링이 가능
- AWS에서 서비스 되기 때문에 아마존 리눅스로 실행되며 기본적으로 로드밸런서와 오토 스케일링 그룹을 사용하여 인프라가 관리됨
- Heroku와 비슷하지만 Beanstalk의 경우 ec2에 대한 권한은 사용자에게 있기 때문에 보안 등 이슈가 발생한다면 사용자가 해결해야함
- CNAME을 통한 도메인 레코드 등록이 가능하며 EB명령을 통한 애플리케이션 배포
resource "aws_elastic_beanstalk_application" "app" {
name = "app"
description = "app"
}
# this automatically retrieves the latest solution stack
data "aws_elastic_beanstalk_solution_stack" "php-latest" {
most_recent = true
name_regex = "^64bit Amazon Linux (.*) running PHP 8.(.*)$"
}
# beanstalk는 하나의 앱에서 여러 환경을 사용할 수 있습니다
# 아래서는 prod 환경만 사용함
resource "aws_elastic_beanstalk_environment" "app-prod" {
name = "app-prod"
application = aws_elastic_beanstalk_application.app.name
solution_stack_name = data.aws_elastic_beanstalk_solution_stack.php-latest.name
setting {
namespace = "aws:ec2:vpc"
name = "VPCId"
value = aws_vpc.main.id
}
setting {
namespace = "aws:ec2:vpc"
name = "Subnets"
value = "${aws_subnet.main-private-1.id},${aws_subnet.main-private-2.id}"
}
setting {
namespace = "aws:ec2:vpc"
name = "AssociatePublicIpAddress"
value = "false"
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "IamInstanceProfile"
value = aws_iam_instance_profile.app-ec2-role.name
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "SecurityGroups"
value = aws_security_group.app-prod.id
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "EC2KeyName"
value = aws_key_pair.mykeypair.id
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "InstanceType"
value = "t2.micro"
}
setting {
namespace = "aws:elasticbeanstalk:environment"
name = "ServiceRole"
value = aws_iam_role.elasticbeanstalk-service-role.name
}
setting {
namespace = "aws:ec2:vpc"
name = "ELBScheme"
value = "public"
}
setting {
namespace = "aws:ec2:vpc"
name = "ELBSubnets"
value = "${aws_subnet.main-public-1.id},${aws_subnet.main-public-2.id}"
}
setting {
namespace = "aws:elb:loadbalancer"
name = "CrossZone"
value = "true"
}
setting {
# 코드가 배포되어 CD 과정을 거칠 때 10개 중 30%만 업데이트 되는 Size
namespace = "aws:elasticbeanstalk:command"
name = "BatchSize"
value = "30"
}
setting {
namespace = "aws:elasticbeanstalk:command"
name = "BatchSizeType"
value = "Percentage"
}
setting {
namespace = "aws:autoscaling:asg"
name = "Availability Zones"
value = "Any 2"
}
setting {
namespace = "aws:autoscaling:asg"
name = "MinSize"
value = "1"
}
# 인스턴스 업데이트하기전 인스턴스가 health 상태인지 확인함
setting {
namespace = "aws:autoscaling:updatepolicy:rollingupdate"
name = "RollingUpdateType"
value = "Health"
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "RDS_USERNAME"
value = aws_db_instance.mariadb.username
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "RDS_PASSWORD"
value = aws_db_instance.mariadb.password
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "RDS_DATABASE"
value = aws_db_instance.mariadb.db_name
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "RDS_HOSTNAME"
value = aws_db_instance.mariadb.endpoint
}
}
회고
사실 리소스에 어떤 옵션들이 있는지는 의미가 없다고 느꼈다.
그럼에도 정리한 이유는 직접 만져보면서 어떤 옵션들을 필요로 하고 있는지 살펴보기 위함이고 나중에 다시 보기 위함이다.
따라서 코드는 참고만하고 직접 콘솔로 구현해보고 어떤 옵션들을 설정해야하는지 이해하는게 중요하다고 생각한다
'TIL > 개념정리' 카테고리의 다른 글
Docker 시작하기 (0) | 2024.01.30 |
---|---|
Terraform을 활용한 ECS와 ECR 개념정리 (1) | 2024.01.13 |
테라폼 ec2 튜토리얼 (1) | 2023.12.15 |
React 라이프사이클 (1) | 2023.10.17 |
React Virtual DOM 정리 (0) | 2023.10.16 |