반응형
복잡한 AWS Console이나 CLI, SDK 말고도 AWS 자원을 CUD(creation, update, deletion; 생성, 수정, 삭제)할 수 있는 방법이 존재합니다. 바로 AWS CloudFormation (클라우드 포메이션)입니다.
0. 들어가며
1. AWS CloudFormation 이란?
2. 코딩 템플릿 (Coding Templates)
3. 내장 함수 (Intrinsic Functions)
4. 활용
0. 들어가며
- 아마존(Amazon)의 AWS를 비롯한 CSP(Cloud Service Provider)의 자원을 관리하는 방법은 여러 가지가 있습니다.
- AWS Management Console
- AWS Command Line Interface
- AWS Tools & Software Development Kits
- AWS CloudFormation
- 오늘은 4번, IaC(Infrastructure as Code)의 사례 중 하나인 AWS CloudFormation에 대해 알아보고자 합니다.
IaaS, PaaS, SaaS와 달리 IaC는 a가 하나라는 점에 유의할 것.
1. AWS CloudFormation이란?
- 코드형 인프라(IaC; Infrastructure as Code)는 사용자가 마우스로 클릭해가며 IT 인프라를 관리하는 프로세스가 아닌, 코드를 통해 선언적으로 프로비저닝하는 툴입니다.
[Red Hat 참고]
- 가령, A 회사에서 일하는 100명의 직원들에게 각자 Web App을 배포하라는 숙제를 낸다면, 100명의 직원들은 Web App 배포에 필요한 인프라 환경을 각기 구성할 것이며, 10분이 소요될 구성 시간은 1000분이 낭비되는 비효율적인 상황을 낳습니다.
- 이때 인프라 구성 사양을 코드화하고 문서화한다면, 직원 중 하나가 실수하여 Web App이 제대로 배포되지 않아 디버깅하는 시간을 줄일 수도 있고, 무엇보다 개발자가 직접 서버/OS/스토리지 등의 리소스를 프로비저닝 및 관리할 필요가 없어집니다.
- 대표적인 IaC 툴을 소개하면 다음과 같습니다.
- Chef
- Puppet
- Red Hat Ansible Automation Platform
- Saltstack
- Terraform (HashiCorp 社의 개발 환경 관리 툴)
- Vagrant (HashiCorp 社의 개발 환경 관리 툴)
- AWS CloudFormation <- 오늘의 주인공
- 가령, A 회사에서 일하는 100명의 직원들에게 각자 Web App을 배포하라는 숙제를 낸다면, 100명의 직원들은 Web App 배포에 필요한 인프라 환경을 각기 구성할 것이며, 10분이 소요될 구성 시간은 1000분이 낭비되는 비효율적인 상황을 낳습니다.
- AWS CloudFormation의 작동 방식은 4단계로 이루어집니다.
- 템플릿(Template) 작성
- 템플릿 업로드 (in S3 Bucket)
- 스택 생성
- 스택 설정 및 리소스 생성
- 템플릿(Template)은 Stack에 담길 리소스를 프로비저닝(provisioning)하기 위해 필요한 파일입니다.
JSON이나 YAML 형식의 텍스트 파일로 작성할 수 있으며 GUI 툴인 AWS CloudFormation Designer를 사용하는 방식으로도 템플릿을 작성할 수 있습니다. 이 Designer 툴에서 JSON -> YAML, YAML -> JSON으로 형식을 자유롭게 바꿀 수 있습니다. - 스택(Stack)은 AWS 리소스의 모음으로, CloudFormation을 통해 리소스를 한데 묶은 스택을 생성하면, 이후 업데이트와 삭제까지 템플릿을 통해 정의할 수 있습니다.
스택을 삭제하면 템플릿에 정의된 모든 리소스가 삭제됩니다.
반응형
2. 코딩 템플릿(Coding Templates)
- AWSTemplateFormatVersion & Description(optional)
- 템플릿에 대한 버전 정보 및 설명을 추가할 수 있습니다.
// JSON 형식
{
"AWSTemplateFormatVersion": "version date",
"Description": "JSON string",
}
- Metadata
- JSON 또는 YAML 형태로 쓰여진 객체에 대한 메타데이터를 기입할 수 있습니다.
// JSON 형식
{
...,
"Metadata": {
"Instances": {
"Description": "Information about the instances"
},
"Databases": {
"Description": "Information about the databases"
}
},
...
}
- Parameters
- stack 생성/수정 시 필요한 parameter를 정의합니다.
- String, Number, List<Number>, CommaDelimitedList, AWS-Specific types(*)와 SSM types를 지원합니다.
(*) AWS-specific Parameter Types
: 사용자 AWS 계정에 기록된 리소스 validation 값들을 parameter처럼 사용하여, stack 생성/수정 시 invalid 값인지 아닌지 체크할 수 있습니다.
ex) AWS::EC2::AvailabilityZone::Name, AWS::EC2::Instance::Id, AWS::EC2::SecurityGroup::GroupName, AWS::Route53::HostedZone::Id, List<AWS::EC2::AvailabilityZone::Name>, List<AWS::EC2::VPC::Id> - 추후 다룰 내장 함수(intrinsic function)을 사용하여 parameter를 리소스 설정값으로 사용할 수 있습니다.
- stack 생성/수정 시 필요한 parameter를 정의합니다.
// JSON 형식
{
...
"Parameters": {
"S3NameParam": {
"Type": "String",
"Default": "mybucket",
"Description": "Name for your AWS S3 bucket",
"MinLength": 5,
"MaxLength": 30
}
},
...
}
- Resources
- 위 section들과 다르게 유일하게 optional이 아닌, 필수적으로 들어가야 하는 section입니다.
- AWS 리소스를 생성 및 수정하기 위해 작성하는 곳으로, 500개 이상의 리소스를 지원하고 커스터마이징도 가능합니다.
// JSON 형식
{
...
"Resources": {
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"AccessControl": "PublicRead",
"BucketName": {"Ref" : "S3NameParam"} // 위 Parameters section에서 정의한 "S3NameParam" 사용
},
"DeletionPolicy": "Retain"
}
},
...
}
// YAML 형식
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType:
Ref: InstanceType
SecurityGroups:
- Ref: InstanceSecurityGroup
KeyName:
Ref: KeyName
ImageId:
Fn::FindInMap:
- AWSRegionArch2AMI
- Ref: AWS::Region
- Fn::FindInMap:
- AWSInstanceType2Arch
- Ref: InstanceType
- Arch
참고 문헌
반응형
'Infra & Cloud > AWS (아마존 웹 서비스)' 카테고리의 다른 글
[AWS] AWS로 서버 배포(Deployment) (3) : EC2, Nginx와 uWSGI (0) | 2021.09.10 |
---|---|
[AWS] AWS로 서버 배포(Deployment) (2) : EC2 인스턴스 환경설정 (Git 설치, Python 가상환경, RDS 연동) (0) | 2021.09.10 |
[AWS] AWS로 서버 배포(Deployment) (1) : EC2 인스턴스 생성 (0) | 2021.09.10 |
댓글