CloudFormation
AWS CloudFormation은 AWS 리소스를 코드로 정의하고 자동으로 생성, 수정, 삭제할 수 있게 해주는 서비스입니다. JSON 또는 YAML 형식의 템플릿을 통해 인프라를 선언적으로 관리할 수 있습니다.
복잡한 인프라도 템플릿 하나로 구성할 수 있으며, 코드 기반이기 때문에 형상관리와 자동화에 유리합니다.
스택(Stack)
스택은 하나의 CloudFormation 템플릿에서 생성된 리소스 집합을 말합니다. 예를 들어 VPC, 서브넷, 라우팅 테이블 등이 포함된 템플릿을 실행하면 이들 전체가 하나의 스택으로 관리됩니다.
스택 단위로 생성, 업데이트, 삭제가 가능하며, 전체 인프라를 논리적인 단위로 관리할 수 있습니다.
IaC (Infrastructure as Code)
IaC는 인프라 자원(VPC, EC2, 보안그룹 등)을 사람이 수동으로 생성하지 않고, 코드로 작성하여 자동으로 구성하는 방식입니다. 대표 도구로는 AWS CloudFormation, Terraform 등이 있습니다.
코드 기반이기 때문에 반복성, 추적성, 자동화가 가능하며 인프라 구성의 품질을 일정하게 유지할 수 있습니다.
왜 사용하는가?
- 인프라 자동화로 작업 시간 단축
- 반복 가능한 환경 구축 및 일관성 확보
- 코드 기반으로 Git 등에서 변경 이력 관리 가능
- 롤백 기능을 통한 안정적인 배포
- 사람 실수 방지 및 템플릿 재사용 가능
CloudFormation 실습 파일 구조
CloudFormation 실습은 단계별로 구성된 템플릿 파일들을 작성하고 업데이트해가며 진행됩니다. 각 단계에 해당하는 템플릿 파일들은 아래와 같은 구조로 정리되어 있습니다.
C:\aws\
│
└── CreateVPC_01.yaml ← VPC + 서브넷 + IGW + 라우팅 테이블 설정
CreateVPC_01.yaml 전체 코드
AWSTemplateFormatVersion: '2010-09-09'
Description: Create a VPC with 1 public and 1 private subnet
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
InternetGateway:
Type: AWS::EC2::InternetGateway
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref MyVPC
InternetGatewayId: !Ref InternetGateway
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.1.0/24
MapPublicIpOnLaunch: true
AvailabilityZone: !Select [0, !GetAZs '']
Tags:
- Key: Name
Value: PublicSubnet1
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: !Select [0, !GetAZs '']
Tags:
- Key: Name
Value: PrivateSubnet1
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnet1RouteTableAssoc:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
코드 설명
MyVPC
CidrBlock: 10.0.0.0/16 ← 전체 VPC의 IP 주소 범위
EnableDnsSupport: true, EnableDnsHostnames: true ← DNS 이름과 해석 지원
InternetGateway & AttachGateway
VPC 외부 인터넷 통신을 위해 IGW 생성 및 연결
PublicSubnet1
CidrBlock: 10.0.1.0/24 ← 퍼블릭 서브넷 IP 범위
MapPublicIpOnLaunch: true ← 인스턴스 생성 시 퍼블릭 IP 자동 할당
AvailabilityZone: !Select [0, !GetAZs ''] ← 첫 번째 가용영역 자동 선택
PrivateSubnet1
CidrBlock: 10.0.2.0/24 ← 프라이빗 서브넷 IP 범위
퍼블릭 IP 자동 할당은 설정하지 않음 (내부 통신 전용)
PublicRouteTable & PublicRoute
퍼블릭 서브넷을 위한 라우팅 테이블 생성
DestinationCidrBlock: 0.0.0.0/0 ← 외부 인터넷을 의미, IGW로 라우팅
PublicSubnet1RouteTableAssoc
퍼블릭 서브넷과 라우팅 테이블을 연결하여 외부 통신이 가능하도록 설정
정리
- VPC: 10.0.0.0/16
- 퍼블릭 서브넷: 10.0.1.0/24 (퍼블릭 IP 자동 할당)
- 프라이빗 서브넷: 10.0.2.0/24
- 인터넷 게이트웨이 생성 및 VPC에 연결
- 퍼블릭 라우팅 테이블 생성 및 IGW 라우팅 설정
- 퍼블릭 서브넷과 라우팅 테이블 연결
이 구조를 통해 퍼블릭 서브넷의 인스턴스는 외부 인터넷과 통신 가능하며, 프라이빗 서브넷의 인스턴스는 내부 통신만 가능합니다.
MyVPCStack 생성





CloudFormation 스택 생성 시 자동 생성된 S3 버킷?
CloudFormation으로 VPC 스택을 생성한 뒤, S3 콘솔을 확인해보면 cf-templates-... 형식의 버킷이 생성되어 있는 경우가 있습니다. 해당 버킷은 사용자가 직접 생성하지 않았음에도 존재하며, 내부에는 업로드한 템플릿 파일이 보관되어 있습니다.
해당 S3 버킷은 왜 생겼을까?
CloudFormation 콘솔에서 템플릿 파일을 로컬에서 업로드해 스택을 생성하면, AWS는 그 템플릿을 자동으로 S3에 저장한 후 내부적으로 TemplateURL 방식으로 참조합니다.
즉, 사용자가 업로드한 템플릿 파일을 CloudFormation이 읽기 위해 필요한 임시 저장소로써 S3 버킷이 자동 생성된 것입니다.

이 버킷은 삭제해도 될까?
스택 생성 후 해당 템플릿을 다시 사용할 계획이 없고, 해당 버킷을 다른 리소스가 참조하지 않는다면 삭제해도 무방합니다. 이 버킷은 CloudFormation 스택과는 연결되어 있지 않기 때문에 스택을 삭제해도 자동으로 제거되지 않습니다.
정리
- CloudFormation 콘솔에서 템플릿 파일을 업로드하면 자동으로 S3 버킷이 생성됨
- 해당 버킷은 템플릿 파일을 임시로 저장하는 용도
- 스택과 별개로 존재하므로 수동 삭제 가능
- 삭제하더라도 기존 스택에는 영향 없음
'AWS' 카테고리의 다른 글
| AWS - Lambda 기반 서버리스 아키텍처 구성 흐름 (0) | 2025.06.09 |
|---|---|
| AWS 3-Tier 웹 애플리케이션 배포(S3 + EC2 + RDS) (1) | 2025.06.06 |
| AWS - 인프라 자동화 CLI를 이용한 네트워크 리소스 생성 및 연결 (0) | 2025.06.04 |
| AWS - 환경 구성 실습 - React + FastAPI 프로젝트 배포 (0) | 2025.06.03 |
| AWS - 웹서비스 환경 구성#3 (0) | 2025.06.02 |
| AWS - 웹서비스 환경 구성#2 (0) | 2025.06.02 |