AWS CloudFormation 템플릿으로 인프라 자동화하기
클라우드 환경에서 수동으로 서버, 네트워크, 보안 설정을 일일이 구성하는 것은 시간이 많이 들고 오류 발생 가능성도 높습니다. 이를 해결하기 위해 AWS에서는 CloudFormation이라는 인프라 자동화 도구를 제공합니다. CloudFormation은 코드 형태의 템플릿을 통해 인프라를 정의하고 자동으로 배포할 수 있어, 인프라의 버전 관리, 일관성, 재현성을 모두 확보할 수 있습니다. 이번 포스팅에서는 AWS CloudFormation 템플릿으로 인프라 자동화하기라는 주제로 개념부터 실전 예제까지 상세히 설명합니다.
✅ AWS CloudFormation이란?
AWS CloudFormation은 YAML 또는 JSON 형식의 템플릿 파일을 사용하여 AWS 리소스를 정의하고 자동으로 프로비저닝하는 서비스입니다. ‘인프라를 코드로(Infrastructure as Code, IaC)’ 구현할 수 있도록 도와주는 핵심 도구로, DevOps 환경에서 빠질 수 없는 구성 요소입니다.
- 한 번의 템플릿 실행으로 서버, DB, 네트워크, 보안 설정 등을 자동 생성
- 스택(Stack) 단위로 리소스를 그룹화하여 관리 및 삭제 가능
- 인프라 구성 변경 시에도 수동 작업 없이 템플릿만 수정하여 자동 반영
✅ CloudFormation의 구성 요소
구성 요소 | 설명 |
---|---|
템플릿(Template) | 리소스를 정의한 코드 (YAML/JSON) |
스택(Stack) | 템플릿을 실행해 생성된 리소스 집합 |
리소스(Resources) | EC2, S3, RDS 등 실제 AWS 서비스 |
매개변수(Parameters) | 템플릿 실행 시 사용자 입력값 받기 |
출력값(Outputs) | 생성된 리소스의 정보 출력 (예: IP 주소) |
조건(Conditions) | 특정 조건일 때만 리소스 생성 |
매핑(Mappings) | 리전별 값, 인스턴스 설정 등의 정적 데이터 |
✅ CloudFormation 템플릿 기본 구조
AWSTemplateFormatVersion: '2010-09-09'
Description: 간단한 EC2 인스턴스 생성 템플릿
Parameters:
KeyName:
Type: String
Description: EC2에 접속할 키페어 이름
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: ami-0c55b159cbfafe1f0 # Amazon Linux 2
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: SampleInstance
Outputs:
InstanceId:
Description: 생성된 인스턴스 ID
Value: !Ref MyEC2Instance
이 템플릿을 실행하면, EC2 인스턴스를 자동으로 생성하고 해당 인스턴스의 ID를 출력합니다.
✅ CloudFormation 템플릿 실행 방법
📍 AWS 콘솔에서 실행
- CloudFormation > Stack > Create Stack 클릭
- 템플릿 업로드 (로컬 파일 또는 S3)
- 스택 이름 및 파라미터 입력
- 리소스 검토 후 ‘생성’ 클릭
📍 AWS CLI에서 실행
aws cloudformation create-stack \
--stack-name my-sample-stack \
--template-body file://ec2-template.yaml \
--parameters ParameterKey=KeyName,ParameterValue=my-key-pair
- 실행 상태는
aws cloudformation describe-stacks
명령으로 확인 가능
✅ 실전 예제: EC2 + 보안 그룹 + S3를 자동으로 구성
AWSTemplateFormatVersion: '2010-09-09'
Description: EC2 + S3 + 보안 그룹 생성 템플릿
Resources:
MyS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'my-sample-bucket-${AWS::Region}-${AWS::AccountId}'
MySecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH
VpcId: vpc-xxxxxxxx
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: ami-0c55b159cbfafe1f0
KeyName: my-key
SecurityGroupIds:
- !Ref MySecurityGroup
Tags:
- Key: Name
Value: CloudFormationAutoInstance
✅ 변경 관리: 스택 업데이트 & 삭제
- 템플릿 변경 시
update-stack
명령어 또는 콘솔에서 업데이트 수행 - 리소스를 한 번에 정리할 땐
delete-stack
명령으로 관련 리소스 전체 제거 가능
aws cloudformation update-stack \
--stack-name my-sample-stack \
--template-body file://updated-template.yaml
aws cloudformation delete-stack \
--stack-name my-sample-stack
✅ Q&A
Q. CloudFormation 템플릿은 어떤 언어로 작성해야 하나요?
YAML 또는 JSON 형식으로 작성할 수 있으며, YAML이 가독성이 높아 더 많이 사용됩니다. AWS 공식 문서에서는 YAML 예시를 중심으로 템플릿 구문을 설명하고 있습니다.
Q. 템플릿에 조건문이나 반복문도 쓸 수 있나요?
CloudFormation 자체에서는 반복문이 없지만, **조건문(Conditions)**과 매핑(Mappings) 기능을 통해 구성 요소를 동적으로 제어할 수 있습니다.
복잡한 반복 구성이 필요한 경우엔 AWS CDK 또는 Terraform과 같은 IaC 도구를 사용하는 것이 더 적합합니다.
Q. 템플릿 버전 관리도 가능한가요?
네, 템플릿 파일은 코드이기 때문에 Git과 같은 버전 관리 시스템에 저장 가능합니다. 이를 통해 팀원 간 협업과 롤백도 편리하게 처리할 수 있습니다. CI/CD 파이프라인에서 템플릿 배포를 자동화할 수도 있습니다.
✅ 요약 정리
항목 | 설명 |
---|---|
목적 | 인프라를 코드로 정의하고 자동화 |
언어 | YAML / JSON |
구성 | Parameters, Resources, Outputs 등 |
자동화 범위 | EC2, RDS, S3, VPC, IAM 등 AWS 대부분 리소스 |
관리 방식 | Stack 단위로 전체 구성 추적 및 롤백 가능 |
활용 사례 | 배포 자동화, 테스트 환경 구성, 반복 작업 제거 |
결론
AWS CloudFormation 템플릿으로 인프라 자동화하기는 개발과 운영의 경계를 허무는 DevOps의 핵심 실천법입니다. 코드로 인프라를 정의하면 일관성 있는 환경 구성, 신속한 배포, 자동화된 복구 및 확장이 가능해집니다. AWS를 본격적으로 활용하려는 팀이라면, CloudFormation을 꼭 익혀두는 것이 장기적으로 큰 자산이 될 것입니다.