너도 할 수 있어! CloudFormation 템플릿 세션 자세히 알아보기 (1)

2022.03.28

안녕하세요, 임채정입니다. 제가 처음에 CloudFormation 템플릿을 작성할 때 도대체 이 코드는 어떤 코드인지 몰라서 한참 헤맸던 것 같습니다. 그래서 이번 블로그에서는 CloudFormation 템플릿을 처음 작성하시는 분이 쉽게 이해하실 수 있도록 CloudFormation 템플릿의 세션에 대해 정리해보려고 합니다!

해당 블로그는 총 2개로 나눠져있습니다.
해당 블로그에서 소개하지 않은 CloudFormation 템플릿 세션에 대해 알고싶은 분들은 다음 블로그를 참고해주세요.

아젠다

  1. 샘플 템플릿
  2. 기타
  3. Parameters
  4. Metadata
  5. Resources
  6. Outputs
  7. 마무리

1. 샘플 템플릿

일단 이번 블로그에서 알아볼 템플릿은 다음과 같습니다.

AWSTemplateFormatVersion: "2010-09-09"
Description: "CloudFormation Simple Template"
  
# ------------
# Metadata
# ------------
Metadata:
	AWS::CloudFormation::Interface:
	ParameterGroups:
		- Label:
			default: Naming setting for Tags
		Parameters:
			- System
			- Env
  
# ------------
# Parameters
# ------------
Parameters:
	System:
		Description: "System prefix of each resource names."
		Type: String
		Default: "system"
	Env:
		Description: "Environment"
		Type: String
		Default: "dev"
	EC2KeyName:
		Description: "EC2 key pair name"
		Default: "ec2-key"
		Type: String
	EC2InstanceType:
		Description: "EC2 instance type"
		Default: "r5a.xlarge"
		Type: String
	AMI:
		Description: "Server AMI"
		Default: "ami-00aea8c45ad3c4df0"
		Type: String
  
# ------------
# Resources
# ------------
Resources:
	# ------------
	# EC2 Instance
	# ------------
	EC2Instance:
		Type: AWS::EC2::Instance
		Properties:
			ImageId: !Ref  AMI
			InstanceType: !Ref  EC2InstanceType
			KeyName: !Ref  EC2KeyName
			DisableApiTermination: True
			EbsOptimized: True
			BlockDeviceMappings:
				- DeviceName: /dev/sda1
					Ebs:
						VolumeSize: 150
						VolumeType: gp2
			SecurityGroupIds:
				- !Ref  SecurityGroup
			SubnetId: subnet-0a1b785ebede2e3aa
			Tags:
				- Key: Name
					Value:
						Fn::Sub: "${System}-${Env}-ec2"
	  
	# ------------
	# SecurityGroup
	# ------------
	SecurityGroup:
		Type: AWS::EC2::SecurityGroup
		Properties:
			GroupName:
				Fn::Sub: "${System}-${Env}-sg"
			GroupDescription:
				Fn::Sub: "${System}-${Env}-sg"
			VpcId: vpc-db8475bd
			SecurityGroupIngress:
				- IpProtocol: tcp
					FromPort: 3389
					ToPort: 3389
					CidrIp: 10.0.0.0/8
			Tags:
				- Key: Name
					Value:
						Fn::Sub: "${System}-${Env}-sg"
  
# ------------
# Outputs
# ------------
Outputs:
	EC2Instance:
		Value: !Ref  EC2Instance
		Description: EC2 instance
		Export:
			Name: EC2Instance

이 템플릿에서는 EC2, SecurityGroup을 생성합니다.

2. 기타

일단 템플릿의 가장 위에 있는 이 두개가 어떤 코드인지 부터 정리하겠습니다.

포맷 조건

AWSTemplateFormatVersion: "2010-09-09"

템플릿의 기능을 식별하는 포맷 버전으로 가장 최신 버전이 2010-09-09입니다.
사실상 코드를 작성하는 데에는 큰 의미가 없는 코드입니다.
그냥 습관처럼 맨 위에 작성하고 시작합시다.

Description (설명)

Description: "CloudFormation Simple Template"

해당 스택의 설명이 됩니다.
실제 생성된 스택에서 확인을 하면 아래 사진과 같이 표시됩니다.

3. Parameters

다음으로는 Parameters 에 대해 알아보겠습니다.

# ------------
# Parameters
# ------------
Parameters:
	System:
		Description: "System prefix of each resource names."
		Type: String
		Default: "system"
	Env:
		Description: "Environment"
		Type: String
		Default: "dev"
	EC2KeyName:
		Description: "EC2 key pair name"
		Default: "ec2-key"
		Type: String
	EC2InstanceType:
		Description: "EC2 instance type"
		Default: "r5a.xlarge"
		Type: String
	AMI:
		Description: "Server AMI"
		Default: "ami-00aea8c45ad3c4df0"
		Type: String

파라미터는 다음과 같이 정의 됩니다.
이렇게 정의된 파라미터는 콘솔에서 생성될 때 다음과 같이 다시 한 번 확인 할 수 있습니다.

또한 Type에 리소스를 지정하는 코드를 넣어서 존재하는 리소스를 선택하게 하거나 복수의 리소스를 고를 수도 있다.

Parameters:
	Subnet:
		Description: "Subnet network"
		Type: List<AWS::EC2::Subnet::Id>
	SG:
		Description: "SecurityGroup"
		Type: AWS::EC2::SecurityGroup::Id

제가 주로 파라미터로 처리하는 것은 다음과 같습니다.
1) 여러번 사용하는 단어
2) 템플릿에 적고싶지 않은 예민한 정보
3) 마지막까지 확인하고 싶은 리소스 정보

단, 사용가능한 리소스가 제한되어 있기때문에 아래 공식 페이지를 참고하면서 작성하시는 걸 추천드립니다.

4. Metadata

다음으로는 Metadata 에 대해 알아보겠습니다.
Metadata 는 위에서 정리한 파라미터와 깊은 연관이 있습니다.
왜냐하면 파라미터를 구분해서 그룹화해주는 역할을 하기 때문입니다.

# ------------
# Metadata
# ------------
Metadata:
	AWS::CloudFormation::Interface:
	ParameterGroups:
		- Label:
			default: Naming setting for Tags
		Parameters:
			- System
			- Env

먼저 Metadata 를 사용하지 않은 예시와 사용한 예시를 비교해보겠습니다.

[Metadata 사용하지 않은 예시]

[Metadata 사용한 예시]

차이가 보이시나요?
Metadata 를 사용하지 않은 경우 파라미터가 알파벳 순서로 표시되기 때문에 어떤 파라미터인지 알기 어렵게 됩니다.
그래서 같은 종류의 파라미터를 묶어서 보기 좋게 정리할 때 Metadata 를 사용합니다.

5. Resources

다음으로는 Resources 에 대해 알아보겠습니다.
Resources 는 CloudFormation 의 가장 중요한 부분입니다.
왜냐하면 말 그대로 생성할 리소스를 정의하는 부분이기 때문입니다.

# ------------
# Resources
# ------------
Resources:
	# ------------
	# EC2 Instance
	# ------------
	EC2Instance:
		Type: AWS::EC2::Instance
		Properties:
			ImageId: !Ref  AMI
			InstanceType: !Ref  EC2InstanceType
			KeyName: !Ref  EC2KeyName
			DisableApiTermination: True
			EbsOptimized: True
			BlockDeviceMappings:
				- DeviceName: /dev/sda1
					Ebs:
						VolumeSize: 150
						VolumeType: gp2
			SecurityGroupIds:
				- !Ref  SecurityGroup
			SubnetId: subnet-0a1b785ebede2e3aa
			Tags:
				- Key: Name
					Value:
						Fn::Sub: "${System}-${Env}-ec2"
	  
	# ------------
	# SecurityGroup
	# ------------
	SecurityGroup:
		Type: AWS::EC2::SecurityGroup
		Properties:
			GroupName:
				Fn::Sub: "${System}-${Env}-sg"
			GroupDescription:
				Fn::Sub: "${System}-${Env}-sg"
			VpcId: vpc-db8475bd
			SecurityGroupIngress:
				- IpProtocol: tcp
					FromPort: 3389
					ToPort: 3389
					CidrIp: 10.0.0.0/8
			Tags:
				- Key: Name
					Value:
						Fn::Sub: "${System}-${Env}-sg"

리소스는 Type: AWS::EC2::SecurityGroup 과 같이 Type에서 결정됩니다.
그 후 리소스 별로 필수 항목이 있고 선택 항목이 있기 때문에 항목을 입력하면 됩니다.

각각의 리소스에 대한 항목은 하나씩 설명하기에는 너무 양이 많기 때문에 공식 페이지를 참고해주세요.

또한, 처음 작성하시는 분들은 처음부터 다 적는 게 어려울 수 있기때문에 다른 사람들이 작성한 템플릿을 복사해서 작성해보시는 걸 추천합니다.

6. Outputs

마지막으로 Outputs 에 대해서도 알아보겠습니다.
Outputs 은 다른 스택에서 해당 리소스를 가져와 싶을 때 주로 사용합니다.

# ------------
# Outputs
# ------------
Outputs:
	EC2Instance:
		Value: !Ref  EC2Instance
		Description: EC2 instance
		Export:
			Name: EC2Instance

해당 코드로 설명을 하자면 리소스에서 정의해둔 EC2 인스턴스에 대한 값을 출력하는 겁니다.
콘솔 화면에서 보면 더 쉽게 이해할 수 있습니다.

콘솔 화면에서는 Outputs 에서 정의된 출력된 값을 표로 확인할 수 있습니다.
위의 코드에서 정의한 EC2 인스턴스의 출력값은
: 다른 스택에서 사용할 때 사용되는 키값
: 다른 스택에서 사용하면 적용되는 값
로 해석할 수 있습니다.

실제로 다른 스택에서 사용할 때는 다음과 같이 사용됩니다.

!ImportValue  EC2Instance

이 때, 사용하는 걸 함수라고 하는데 해당 함수에 대해 더 자세하게 알고 싶다면 다음 블로그를 참고해주세요.

7. 마무리

이번 블로그에서는 많이 사용하는 CloudFormation 템플릿의 세션에 대해 정리를 해봤습니다.
CloudFormation 를 처음 작성하시는 분들에게 도움이 되셨으면 좋겠습니다.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !