IaC란 코드로 인프라를 프로비저닝 및 관리하는 기술이다.
기존 물리서버환경(On-Premise)은 인프라의 확장, 관리 등이 어려웠다. 반면 클라우드 컴퓨팅 환경에서는 인프라의 확장(Extension), 프로비저닝(Provision), 할당(Allocate) 등의 인프라 관리가 H/W의 가상화에 의해 쉽게 이루어 질 수 있다.
이러한 클라우드 환경에서 서비스들의 규모가 거대해짐에 따라 인프라의 관리 비용이 커졌다. 고가용성을 위한 오토스케일링(Auto-Scaling), 새로운 마이크로서비스의 인프라 프로비저닝 등 사람에 의한 수동관리가 힘들어진다. 이런 배경에서 사람이 직접 관리하기보다 코드(Code)를 통해 인프라를 일관되게, 자동으로 관리하자는 개념(IaC)이 주목받았다.
예시 :
IaC를 직접 실습해보기 위해 AWS에서 지원하는 IaC 서비스인 AWS CloudFormation을 이용하여 인프라를 프로비저닝 해보고자 한다.
프로비저닝할 리소스 :
1. VPC
2. Public Subnet 1
3. EC2 instance 1
4. 그 외 InternetGateway, SecurityGroup, ..
CloudFormation은 관리할 AWS의 리소스들을 템플릿(Code)으로서 관리하고, 이를 논리 레벨의 리소스인 스택(Stack)을 생성한 후, 실제 리소스로 프로비저닝하는 과정을 거친다.
편의를 위해 EC2에 연결된 AWS Cloud9 IDE에서 템플릿 작성 및 AWS CLI 작업을 진행하였다.
CloudFormation에서는 자체 언어를 이용해 YAML, JSON 형태로 템플릿을 작성해야 한다.
템플릿 구조
템플릿 예시
# simple-infrastructure-template.yaml
Description: Simple Infrastructure Template!
Parameters:
SomeValue1:
Description: CIDR Block for ...
Type: String #타입 선언
Default: 10.199.0.0/16 #기본값
AllowedValues: #허용 값 리스트
- 10.199.0.0/16
SomeValue2:
Description: EC2 instance type for ..
Type: String
Default: t2.nano
AllowedValues:
- t2.nano
- t2.micro
- t2.small
KeyName:
Description: Keyname for the keypair, must select existing key
Type: 'AWS::EC2::KeyPair::KeyName'
Resources:
VPC:
Type: 'AWS::EC2::VPC' #AWS 객체 타입
Properties:
CidrBlock: !Ref SomeValue1 # Parameter 참조
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
Tags:
- Key: Application
Value: !Ref 'AWS::StackId'
- Key: Name
Value: CloudFormation Trial Env
Subnet:
Type: 'AWS::EC2::Subnet'
DependsOn: VPC #DependsOn 통해 순차 생성
...
InternetGateway:
AttachGateway:
RouteTable:
Route:
SubnetRouteTableAssociation:
NetworkAcl:
InboundHTTPNetworkAclEntry:
InboundSSHNetworkAclEntry:
InboundResponsePortsNetworkAclEntry:
OutBoundHTTPNetworkAclEntry:
OutBoundHTTPSNetworkAclEntry:
OutBoundResponsePortsNetworkAclEntry:
SubnetNetworkAclAssociation:
IPAddress:
Type: 'AWS::EC2::EIP'
InstanceSecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
WebServerInstance:
Type: 'AWS::EC2::Instance'
Outputs:
URL:
Value: !Join
- ''
- - 'http://'
- !GetAtt
- WebServerInstance
- PublicIp
Description: Newly created application URL
참고사항
'AWS::EC2::Instance'
와 같은 형태의 AWS 객체 참조를 통해 지정한다.DependsOn
키워드를 통해 순차적인 리소스 생성이 가능하다.Tag
를 통해 이후 버전/배포 관리 등의 작업이 용이하도록 설정하는 것이 바람직하다.앞에 정의한 템플릿을 AWS CLI를 통해 실제 스택으로 생성한다.
$aws cloudformation create-stack
을 이용하여 다음과 같이 생성할 수 있다.
$aws cloudformation create-stack --stack-name SIMPLE-STACK \
--parameters ParameterKey=KeyName,ParameterValue=KEY1-12345-12345 \
ParameterKey=SomeValue2,ParameterValue=t2.micro \
--template-body file://simple-infrastructure-template.yaml
create-stack 인자들
stack-name
: 생성할 스택 이름을 설정한다. parameters
: 템플릿에서 선언한, run-time에 전달할 값들을 key-value형태로 다음과 같이 전달한다.EC2::KeyPair::KeyName
: $aws ec2 describe-key-pairs
명령을 통해 로컬의 키페어들을 확인할 수있다.template-body
: 스택으로 생성할 템플릿(yaml, json)을 지정한다.스택 생성 후, $aws cloudformation describe-stacks
명령 또는 AWS Console의 CloudFormation 대시보드, EC2 대시보드를 통해 생성된 스택과 리소스들을 확인할 수 있다.