terraform CLI 설치
teraform -install-autocoplete
AWS CLI 설치
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
IAM 본인 인증 환경변수 설정하기
export AWS_ACCESS_KEY_ID = "<YOUR_AWS_ACCESS_KEY_ID>"
export AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>"
export AWS_DEFAULT_REGION="<YOUR_AWS_DEFAULT_REGION>"
인프라 구축
terraform init
디렉토리를 초기화terraform plan
생성이 가능한지 확인 바뀐 코드 확인terraform apply
인프라 생성인프라 변경
terraform apply
기존 상태파일에 저장된 ec2를 삭제하고 변경된 인프라 생성 backend의 .tfstate 저장됨인프라 삭제
terraform destroy
해당 코드 설정으로 생성한 모든 리소스 삭제구성형식지정 및 유효성검사
terraform fmt
구성을 포맷terraform validate
구성이 구문적으로 유효하고 내부적 일관성이 있는지 확인상태 검사
terraform show
현재 상태 검사인프라 가져오기
terraform import aws_instance.web i-12345678
aws_instance.web는 EC2 인스턴스에 지정하는 이름
i-12345678는 AWS에서 만든 인스턴스 ID
i-12345678 인스턴스를 aws_instance.web라는 이름으로 가져오겠다는 뜻
입력변수 정의
variable "instance_name" {
description = "Value of the Name tag for the EC2 instance"
type = string
default = "ExampleAppServerInstance"
}
tags = {
Name = var.instance_name
}
terraform apply -var "instance_name=AnotherName"
원하는 이름으로 변경
IaC 코드를 작성하려면 먼저 AWS Management Console을 이용해 먼저 최종 인프라 상태를 만들어놓고, 잘 작동하는지 확인한 다음, 이를 해당하는 리소스를 하나씩 코드로 옮기는 방법을 사용하는 방식을 사용
모든 리소스를 만들 때에는 반드시 이름을 붙여놓도록 합시다.
STEP 1: DB 인스턴스에 사용할 Amazon VPC 생성
STEP 2: EC2 인스턴스 생성
제시 사양
#!/bin/bash
echo "Hello, World" > index.html
nohub busybox httpd -f -p ${var.server_port} &
키 페어: 수동으로 만들고 EC2에 할당합니다.
STEP 3: DB 인스턴스 생성
자습서에 표시된 사양대로 RDS 인스턴스를 생성합니다.
자습서 : https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateDBInstance.html
STEP 4: 애플리케이션 로드 밸런서 및 Auto Scaling Group 적용
Auto Scaling Group은 최소 2개, 최대 10개로 설정해놓습니다.
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb
테라폼 tf문법에 맞춰서 콘솔로 만든것을 재현
ec2 dns 안생겨서 인터넷 연결 안되는 문제
public subnet에 서브넷설정에서 퍼블릭 ipv4 주소 자동할당 체크 필요
(안해주면 ec2에 dns가 안달림)
로드밸런서 Unhealthy -> healthy
echo "Hello, World" > index.html
sudo busybox httpd -f -p 80 &
carrier_gateway_id, egress_only_gateway_id, gateway_id, instance_id, local_gateway_id, nat_gateway_id, network_interface_id, transit_gateway_id, vpc_endpoint_id, vpc_peering_connection_id
must be specified