-
[Trraform] 테라폼으로 EC2생성 하기 (3)공부 2025. 11. 11. 16:28
설치 후 다음단계인 EC2 생성 홈페이지 예제에는 us-east2 리전으로 설정되어 있어서
도쿄리전으로 실습해보려다가 이상한 에러 때문에 한참 해맸다..
Create infrastructure | Terraform | HashiCorp Developer
Authenticate to AWS and create infrastructure with Terraform. Write and validate Terraform configuration, initialize a configuration directory, and plan and apply a configuration to create infrastructure.
developer.hashicorp.com
1. 테라폼 파일을 실행할 디렉터리 생성
#디렉터리 명은 상관없음 mkdir my-terraform #생성이 되면 이동한다. cd my-terraform2. tf 파일 생성 & 편집
테라폼의 원리는 테라폼 고유언어로 작성된 tf파일을 실행시켜서
코드를 정의하여 원하는 인프라를 구축하고 관리하는 형태인듯 하다.
#이동한 경로에서 vi terraform.tf예시 코드
#terraform.tf terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.92" } } required_version = ">= 1.2" }- terraform {..} : Terraform 자체를 구성하는 부분으로, 설치할 공급자 인프라 프로비저닝에 사용할 Terraform 버전을 입력(포함)한다.
- providers : Terraform은 리소스를 관리를 위해 호출되는 프로바이더(provider)라는 바이너리 플러그인을 사용
Terraform provider는 Terraform과 별도로 배포되고 버전이 관리되기때문에.
바이너리에서 공급자를 분리함으로써 API를 사용하는 모든 인프라 공급업체를 지원가능.
위 예시 블록을 사용하면 테라폼 구성에 사용되는 버전에 제약을 걸 수 있다.
- HashiCorp를 사용하여 Terraform 레지스트리에서 required_providers를 관리하고, 여기서 공개 Terraform provider와 module을
가져올 수 있다.- version : 버전에 제약 조건을 거는 부분으로, 버전으로 인한 오류를 줄이기 위해 사용한다.
가능한 한 그 범위 내에서 가장 최신의 패치 버전을 선택한다.- required_version : 최소한 이 버전 이상으로 해달라하는 최소 버전의 제약 조건
다음으로는 공급자(클라우드), 리전을 어디로 할지, AMI 등 설정을 main.tf에 추가한다.
# 클라우드 공급자, 리전 선택 provider "aws" { region = "ap-northeast-1" } # Amazon Linux 2 AMI 조회 data "aws_ssm_parameter" "amazon_linux2_ami" { name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" }provider 부분을 보면 AWS의 도쿄리전을 선택했고, 아래 AMI관한 부분은 리전에 따라 차이가 있어서 검색해보거나 GPT한테 물어보면 금방 수정가능하다.
data : Terraform에서 data 블록은 이미 존재하는 AWS 리소스, 외부데이터를 read하기 위한 블록(부분)이다.
즉, 기존 리소스 정보를 가져오는 역할을 한다.
aws_ssm_parameter : AWS의 Systems Manager Parameter Store 안에 저장된 파라미터 값을 읽는 기능을 제공
-> AWS에서는 공식적으로 최신 Amazon Linux AMI ID 등을 Systems Manager Parameter Store에 자동 등록하고 있다.
-> 즉, 매번 콘솔에 최신 AMI ID를 수동 복사할 필요 없이 Terraform 코드로 조회가 가능하다.
name : 조회할 SSM 파라미터의 전체 경로를 지정
name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" #/aws/service/ : AWS가 공식적으로 제공하는 SSM 파라미터 네임스페이스 #ami-amazon-linux-latest/ : 최신 Amazon Linux AMI 목록을 담은 하위 경로 #amzn2-ami-hvm-x86_64-gp2 : Amazon Linux 2, HVM 방식, x86_64 아키텍처, gp2 스토리지 타입의 최신 AMI ID그리고 이제 단순히 EC2를 작성하고 싶다면 다음 코드를 작성한다.
# EC2 인스턴스 생성 resource "aws_instance" "example" { ami = data.aws_ssm_parameter.amazon_linux2_ami.value instance_type = "t2.micro" }최종 코드 main.tf
#보통 아래 코드를 실행하면 기본 VPC, Subnet...등을 알잘딱깔센으로 찾아서 생성하는거 같은데 #환경이 달라서 그런가.. VPC부터 하나씩 지정했더니 성공했다. (혹시 안된다면 정의해보시길..) #거기서 yes를 입력하면 완료 provider "aws" { region = "ap-northeast-1" } data "aws_ssm_parameter" "amazon_linux2_ami" { name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" } resource "aws_instance" "app_server" { ami = data.aws_ssm_parameter.amazon_linux2_ami.value instance_type = "t4g.micro" tags = { Name = "ExampleAppServerInstance" } }순서대로 실행
terraform init (초기화명령)
terraform plan (바로 실행되지 않고, 실행되는지 확인)
terraform apply(실제로 적용)
terraform state list (생성확인)
테라폼언어의 구조를 보면 Provider라는 블록, resouce라는 블록 등 Block으로 나누는 특징이 있다.
실제로 제일 많이 쓰는것은 resouce타입으로 인프라를 생성하는 블록을 넣는다.
만약 그리고 기존 인프라를 이용해서 생성하고 싶다면 data 블록을 사용해야한다.
#data.tf data "aws_vpc" "test_vpc" { id = "vpc-0053xxxxxxxxxx" } data "aws_subnet" "test_subnet" { id = "subnet-0053xxxxxxxxxx" }위와 같이 기존에 생성된 vpc id, subnet id를 data 블록에 정의하고
#main.tf resource "aws_security_group" "test_sg" { vpc_id = data.aws_vpc.test_vpc.id ingress { from_port = 22 to_port = 22 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 = "test_sg" } } resource "aws_instance" "test_ec2" { ami = "ami-xxxxxxxxxxxxxxxx" instance_type = "t2.micro" subnet_id = data.aws_subnet.test_subnet.id vpc_security_group_ids = [aws_security_group.test_sg.id] associate_public_ip_address = true tags = { Name = "test_ec2" } }이렇게 정의한 기존 리소스 ID를 가져와서 EC2를 생성할 수 있다.
(기본 VPC가 없는 환경이고 따로 생성한 VPC가 있다면 서브넷을 지정해야 EC2생성이 가능함)
그리고 혹시 실패한다면 환경변수에서 접근키, 비밀키를 설정이 빠졌는지도 확인해보시길
'공부' 카테고리의 다른 글
[Terraform] 테라폼 개념 정리 (1) (0) 2025.11.13 [Trraform] 테라폼으로 만든 리소스 삭제 (4) (0) 2025.11.12 [Trraform] Trraform 설치하기 (2) (0) 2025.11.11 [Mac] 맥으로 터미널로 ssh 접속하기 (0) 2025.11.11 [맥] mac에서 exe 파일 실행시키기 (winebottler) (0) 2025.03.01