AWS

AWS Infrastructure as Code with Terraform

make-min 2025. 2. 8. 12:08
반응형

테라폼의 핵심 개념

테라폼을 공부하면서 가장 중요하다고 느낀 개념들을 정리해보았다:

1. 기본 용어

  • 프로비저닝(Provisioning): 인프라를 생성하고 설정하는 과정
  • 프로바이더(Provider): AWS, GCP 등 인프라를 제공하는 서비스
  • 리소스(Resource): 실제로 생성되는 인프라 구성 요소 (EC2, RDS 등)
  • HCL(Hashicorp Configuration Language): 테라폼의 설정 언어

2. 테라폼의 핵심 작동 방식

테라폼이 작동하는 방식을 이해하는 데 시간이 좀 걸렸다. 가장 중요한 점은:

graph LR
A[정의된 상태 .tf] --> B[Plan 단계
B --> C[실제 상태 확인]
C --> D[Apply 단계]
D --> E[최종 상태]
  • Plan: 이상적 상태와 실제 상태의 차이를 확인
  • Apply: 실제로 인프라를 변경하는 단계
  • State: terraform.tfstate 파일에 현재 상태 저장

실제 구현에서 배운 점

1. 프로젝트 구조

web_infra/
├── provider.tf # AWS 프로바이더 설정
└── web_infra.tf # 실제 인프라 정의

2. 리소스 정의 패턴

리소스를 정의할 때 중요한 패턴을 발견했다:

resource "aws_instance" "web" {
    ami = "ami-xxxxx"
    instance_type = "t2.micro"
    key_name = aws_key_pair.web_admin.key_name # 다른 리소스 참조
}
  • 리소스 타입은 항상 프로바이더_리소스종류 형태
  • 리소스 간 참조는 자동으로 의존성 그래프 생성
  • 속성값 중 일부는 생성 후에만 알 수 있음 (known after apply)

3. 의존성 관리

테라폼의 가장 인상적인 부분은 의존성 관리다:

  • 리소스 간 참조를 통한 자동 의존성 파악
  • 그래프 기반 리소스 생성 순서 결정
  • 명시적인 의존성 선언 가능

장단점 분석

장점

  1. 인프라의 상태를 코드로 명확하게 관리
  2. 버전 관리 시스템 활용 가능
  3. 재사용과 자동화가 용이
  4. 팀 협업이 용이 (코드 리뷰 등)

단점

  1. 학습 곡선이 있음
  2. 웹 콘솔보다 초기 설정이 복잡
  3. 레퍼런스 문서를 자주 확인해야 함

앞으로 더 학습할 부분

  1. 모듈화: 재사용 가능한 인프라 컴포넌트 작성 방법
  2. 상태 관리: 원격 상태 관리와 팀 협업 방식
  3. CI/CD 통합: 테라폼을 파이프라인에 통합하는 방법

마치며

테라폼은 처음에는 복잡해 보였지만, 코드로 인프라를 관리하는 것의 이점을 확실히 느낄 수 있었다. 특히 많은 리소스를 관리해야 할 때 그 진가가 발휘될 것 같다. 앞으로는 모듈화와 CI/CD 통합에 대해 더 깊이 공부해보고 싶다.


resource "aws_key_pair" "web_admin" {
  key_name = "web_admin"
  public_key = file("${pathexpand("~/.ssh/web_admin.pub")}")
}

resource "aws_security_group" "ssh" {
  name = "allow_ssh_from_all"
  description = "Allow SSH port from all"
  ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

data "aws_security_group" "default" {
  name = "default"
}

resource "aws_instance" "web" {
  ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2
  instance_type = "t2.micro"
  key_name = aws_key_pair.web_admin.key_name
  vpc_security_group_ids = [
    aws_security_group.ssh.id,
    data.aws_security_group.default.id
  ]
}

resource "aws_db_instance" "web_db" {
  allocated_storage = 20
  engine = "mysql"
  engine_version = "8.0.34"
  instance_class = "db.t3.micro"
  username = "admin"
  password = "00000000"
  skip_final_snapshot = true
}

최종 provider제외 web_infra.tf파일 코드(윈도우 기준으로 작성)

반응형

'AWS' 카테고리의 다른 글

AWS EBS & EFS  (0) 2025.02.18
EBS & EC2 인스턴스 스토어 정리  (0) 2025.02.18
#7 ENI, EIP, Hibernate AWS solution  (1) 2024.12.31
#6 EC2 비용 및 spot instance, AWS solution  (0) 2024.12.24
#5 EC2 firewall, AWS solution  (0) 2024.12.24