
AWS CloudFormation은 우리가 AWS에서 사용하는 인프라를 코드로 정의하고 자동으로 만들어주는 서비스다.
예를 들어, EC2 인스턴스 하나를 만들려고 콘솔에서 클릭 몇 번씩 하지 않아도, CloudFormation 템플릿 파일 한 장이면 클릭 한 번으로 서버가 만들어진다.
그런데 CloudFormation으로 EC2를 만들 때는 반드시 지정해줘야 하는 값이 몇 가지 있다. 그중에서 가장 기본이 되는 값은 다음 두 가지다.
이 글에서는 위 두 가지 값을 외부에서 입력받을 수 있도록
CloudFormation 템플릿의 Parameters라는 기능을 사용하는 방법을 알아본다.
CloudFormation 템플릿에는 여러 가지 섹션이 있지만,
그중 Parameters는 템플릿 실행 시 사용자가 직접 값을 입력할 수 있게 해주는 부분이다.
예를 들어, 서버에 접속할 때 사용할 키 이름을 미리 고정해두는 게 아니라 스택을 생성할 때마다 키 이름을 입력받고 싶을 때, 이 Parameters를 사용한다.
Parameters:
KeyName:
Description: EC2에 접속할 때 사용할 키 이름
Type: AWS::EC2::KeyPair::KeyName
이렇게 템플릿에 정의해두면, CloudFormation 콘솔에서 스택을 만들 때 키 이름을 선택할 수 있는 입력창이 자동으로 생긴다.

EC2 인스턴스는 리눅스 서버다. 이 서버에 접속하려면 SSH라는 방식을 쓰고, 이때 사용하는 것이 KeyPair(키 페어)다.
키 페어는 AWS 콘솔에서 미리 만들어놓은 다음, 인스턴스를 만들 때 함께 연결해줘야 한다.
KeyName:
Description: EC2 KeyPair
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: EC2 KeyPair
Description: 사용자에게 보여줄 설명 문구Type: 입력값의 종류를 제한. AWS::EC2::KeyPair::KeyName으로 설정하면 키페어만 선택 가능ConstraintDescription: 사용자가 잘못된 값을 입력했을 때 보여줄 메시지Resources:
MyEC2:
Type: AWS::EC2::Instance
Properties:
KeyName: !Ref KeyName
여기서 !Ref KeyName은 위에서 입력받은 값을 참조해서 EC2 인스턴스에 연결해주는 역할이다.
EC2를 만들 때는 어떤 OS 이미지를 쓸지 지정해야 한다. 이걸 AMI (Amazon Machine Image) 라고 부른다. Amazon Linux 2 같은 기본 리눅스 이미지를 쓸 수도 있고, Ubuntu나 CentOS를 선택할 수도 있다.
그런데 이 AMI ID는 리전마다 다르고, 시간이 지나면 새로운 이미지가 계속 나온다. 그래서 CloudFormation 템플릿에 직접 하드코딩하면 관리하기가 번거롭다.
AWS에서는 Systems Manager(SSM)라는 서비스에
항상 최신 Amazon Linux 2 AMI ID를 조회할 수 있는 경로를 제공하고 있다.
우리는 그 경로만 알고 있으면, 항상 최신 버전의 이미지를 자동으로 사용할 수 있다.
LatestAmiId:
Description: EC2 AMI
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
Type: SSM에 등록된 AMI ID 값을 가져오도록 설정Default: 기본으로 사용할 SSM 파라미터 경로AllowedValues: 사용자가 다른 값을 입력하지 못하게 고정Resources:
MyEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
!Ref LatestAmiId는 SSM에서 최신 AMI ID를 읽어와서 EC2 인스턴스에 넣는 역할을 한다.
Parameters:
KeyName:
Description: EC2 KeyPair
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: EC2 KeyPair
LatestAmiId:
Description: EC2 AMI
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'