Summary


AWS CloudFormation의 Master Class를 보고 Reference document를 통해 내용을 살펴보자.


특징


  • Infra structure as a code를 실현하기에 간편한 도구
  • 리소스를 Provisioning하고 update를 해줌
  • Code로 관리하기 때문에 버전관리에 용이
  • AWS cli 또는 AWS console을 통해 배포 및 업데이트가 가능
  • 리소스에 대해서만 과금되기 때문에 별도의 비용지출이 없음
  • Parameter를 통해 Project별로 Customizing이 용이
  • 코드만 올리면 인프라가 형성되기 때문에 인프라 도입에 대한 리소스 투입이 적음

Cloudformation template의 특징


  • JSON, YAML 로 개발자 친화적인 포맷
  • 코드로 관리하기 때문에 재사용에 용이
  • Stack 생성시 message를 통해 feedback 제공
  • Sample template 제공

아래는 yaml형식의 ec2를 생성하는 sample template이다. CloudFormation으로 ec2를 생성할 때 파라미터를 받는다. instanceType, KeyName, SSHLocation을 설정할 수 있도록 되어 있다. 선택할 수 있는 인스턴스의 종류를 제한했기 때문에 t2계열의 인스턴스만 선택할 수 있다. 그리고 AMI는 Amazon linux를 사용하였다.

# EC2 sample template
AWSTemplateFormatVersion: 2010-09-09
Description: EC2 Sample
Parameters: # Using before cloudformation is being created
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance. Recommend use only office IP.
    Type: 'AWS::EC2::KeyPair::KeyName'
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:  # allow only restricted instance
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
    ConstraintDescription: must be a valid EC2 instance type.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
Mappings: # Conditional value when cloudformation is being created
  AWSInstanceType2Arch:
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
  AWSInstanceType2NATArch:
    t2.nano:
      Arch: NATHVM64
    t2.micro:
      Arch: NATHVM64
    t2.small:
      Arch: NATHVM64
    t2.medium:
      Arch: NATHVM64
    t2.large:
      Arch: NATHVM64
  AWSRegionArch2AMI:
    ap-northeast-2:
      PV64: NOT_SUPPORTED
      HVM64: ami-2b408b45
      HVMG2: NOT_SUPPORTED
Resources:
  EC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref InstanceSecurityGroup
      KeyName: !Ref KeyName
      ImageId: !FindInMap 
        - AWSRegionArch2AMI
        - !Ref 'AWS::Region'
        - !FindInMap 
          - AWSInstanceType2Arch
          - !Ref InstanceType
          - Arch
  InstanceSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: !Ref SSHLocation
Outputs:
  InstanceId:
    Description: InstanceId of the newly created EC2 instance
    Value: !Ref EC2Instance
  AZ:
    Description: Availability Zone of the newly created EC2 instance
    Value: !GetAtt 
      - EC2Instance
      - AvailabilityZone
  PublicDNS:
    Description: Public DNSName of the newly created EC2 instance
    Value: !GetAtt 
      - EC2Instance
      - PublicDnsName
  PublicIP:
    Description: Public IP address of the newly created EC2 instance
    Value: !GetAtt 
      - EC2Instance
      - PublicIp

한국 유저는 Asia/seoul region cloudformation sample template 을 통해 여러 샘플들을 볼 수 있다.

다른 지역의 템플릿을 사용하고 싶으면 left bar에서 다른 region을 선택하면 된다.


AWS CLI for CloudFormation


CloudFormation은 다른 서비스와 마찬가지로 AWS Cli를 통해 사용할 수 있다. 명령어들은 아래와 같다.

# example
$ aws cloudformation update-stack help
  • get-stack-policy
  • set-stack-policy
  • create-stack
  • update-stack
  • cancel-update-stack
  • delete-stack
  • list-stack-resources
  • list-stacks
  • describe-stack-events
  • describe-stack-resouce
  • describe-stack-resouces
  • describe-stacks
  • get-template
  • validate-template

Intrinsic functions & pseudo parameters


아래와 같은 function과 parameter를 통해 yaml형식의 파일에서 별도의 로직을 추가할 수 있다.

  • Intrinsic function
    • Fn::Base64
    • Fn::FindInMap
    • Fn::GetAtt
    • Fn::GetAZs
    • Fn::Join
    • Fn::Select
    • Ref
  • Pseudo parameters
    • AWS::NotificationARNs
    • AWS::Region
    • AWS::StackId
    • AWS::StackName

위에서 EC2를 생성하는 경우에 Fn::FindInMap와 Ref과 같은 것을 사용하였는데 ref는 글자에서 느껴지듯이 reference로 특정 변수를 가리킬 때 사용한다. Fn::FindInMap은 별도로 Mapping에 두엇던 파라미터에서 값을 불러오기 위해 사용한다.

더 자세한 내용을 알고 싶다면 AWS Intrinsic function reference를 참고하도록 하자.


References