CloudFormation 이란?

  • aws 리소스의 설정을 json or yaml 형식으로 기재한 템플릿을 만들도 해당 템플릿에서 aws 리소스를 자동으로 구축하는 서비스
  1. 스택
    • cloudforamtion 기능으로 자동 생성된 aws 리소스의 집합
    • cloudformation은 스택 단위로 리소스를 관리하기 위해 한번에 구축 or 제거가능
    • 리소스간에는 의존관계가 있는 경우가 많다 (ex vpc와 ec2인스턴스에서 vpc가 없을시 생성불가) → 이같은 의존 관계를 자동 구축 시에 판단하고 구축하는 순서에 모순이 없도록 결정
  1. 템플릿
    • 스택 구성을 결정하는 설계자로서 핵심요소
    • Json or yaml 형식의 기술
    • 템플릿은 aws 리소스를 기술하는 장소, 실행조건을 기술하는 장소 등의 몇 개 섹션으로 구성
    • 템플릿 생성을 지원하는 내장함수가 존재하며 이 내장함수를 사용해 범용성 높은 템플릿 구성 가능
  1. 변경 세트
    • 스택에서 실행 중인 리소스를 변경해야 하는 경우 스택 업데이트
    • 리소스 변경하기 전 제안된 변경 사항이 요약된 변경 세트 생성 가능
    • 변경 세트 사용시 변경 사항을 구현하기 이전에 해당 변경이 실행중인 리소스에 미치는 영향을 확인
    • Ex. RDS DB 인스턴스의 이름을 변경한 경우 CloudFormation에서 새 DB를 생성하고 이전 DB를 삭제하므로 아직 백업하지 않은 경우 이전 DB 데이터를 잃게 됨

템플릿 구조
  • Resources (리소스) : 구축하는 aws 리소스를 정의하는 섹션(aws 서비스 정의를 기술)-필수

    → 가장 중요하며 기본이 되는 섹션

    Resources :
        EC2InstanceWeb :   # Logical ID로 템플릿내에 고유해야함, 논리적 이름을 사용하여 템플릿의 다른 부분에 있는 리소스를 참조
            Type : 'AWS::EC2::Instance'  # 리소스의 유형을 지정
            Properties :  # 리소스에 지정할 수 있는 추가 옵션으로 속성을 지정
                    InstanceType : 'm2.large'  # 인스턴스 유형 지정
    -> 그외에도 많은 파라미터들이 존재한다.
  • Description(설명) : 템플릿을 설명하는 텍스트 문자열.템플릿 포맷 버전 섹션 다음에실행
  • metadata(메타데이터):템플릿에 대한 세부 정보를 제공하는 임의 json 또는 yaml객체포함

    → 특정 리소스에 대한 템플릿 구현 세부 정보 포함

    • 스택 업데이트 중에는 메타데이터 섹션을 자체적으로 업데이트할 수 없음, 리소스를 추가 / 수정 / 삭제하는 변경 내용을 포함할 때만 업데이트할 수 있음
    • CF는 meta 섹션에 포함된 정보를 변환, 수정 또는 삭제 하지 않음→ 해당 섹션을 사용하여 암호나 보안 암호와 같은 민감 정보를 저장하지 않는것이 좋다.
    - 사용 예제-1 (메타데이터 키)
    Metadata:
      Instances:
        Description: "Information about the instances"
      Databases:
        Description: "Information about the databases"
     
    • 메타데이터 키
      AWS::CloudFormation::Init
      - cfn-init 헬퍼 스크립트에 대한 구성 작업을 정의 - EC2 인스턴스에서 애플리케이션을 구성 및 설치할 때 유용
      AWS::CloudFormnation::Interface
      - CloudFormation 콘솔에 표시되는 입력 파리미터의 그룹화 순서를 정의 - 기본적으로 콘솔에는 파라미터가 논리적 ID별 영문자순으로 정렬
      AWS::CloudFormation::Designer
      - CloudFormation Designer에서 리소스가 배치되는 방식을 설명 - Designer에서 템플릿을 생성 및 업데이트할 때 이 정보가 자동으로 추가
  • parameters(파라미터) : 템플릿 실행 시에 사용자가 선택하는 항목을 정의하는 섹션
    • 동일한 템플릿에도 용도에 따라 템플릿 설정 값을 변경하려는 경우 사용 (예를 들어 인스턴스 유형을 운영환경에서는 t2.large로 사용하지만 개발환경에서는 t2.small로 지정하고 싶은 경우)
    • 파라미터 섹션을 이용해 CloudFormation 실행 사용자에게 인스턴스 유형을 선택하게 할 수 있음
    • 파라미터를 통해 스택을 생성하거나 업데이트 할 때마다 템플릿에 사용자 지정 값을 입력할 수 있음
    Parameters :
            InstanceType :
                  Type : String
                  Default : t2.micro
                  AllowedValues :
                         - t2.mircro
                         - t2.small
                         - t2.medium
                         - t2.large
                   Description : Select EC2 instance type.
    -> 해당 템플릿 사용시 입력값 참조 가능
    Resources :
           EC2InstanceWeb :
                  Type : 'AWS::EC2:Instance'
                  Properties :
                          InstanceType : !Ref InstanceType
    사용자가 입력한 값은 Ref 함수로 참조할 수 있음

     

  • Mappings(매핑): map 형식의 변수를 정의하는 섹션
    • Map 형식의 변수를 정의하는 섹션
    • 템플릿의 실행 환경에 따라 달라질 수 있는 값을 사전에 맵 형식으로 정의할 수 있음
    • 리전마다 설정 값이 다른 경우 등은 Mappings 섹션에 정의해 두고 리전마다 사용하는 값을 변경할 수 있게함
    Mappings :
             MappingName :  # Mapping 이름
                      Key1 :    # 키 이름
                              Name1 : Value1-1   # 이름과 값의 페어
                              Name2 : Value1-2
                      Key2 :
                              Name1 : Value2-1
    
    - 사용 예제-2
    Mappings:
      RegionMap:
        us-east-1: #키는 리전의 이름
          "HVM64": "ami-0ff8a91507f77f867”  # 값은 리전의 HVM64 AMI용 AMI ID
        us-west-1:
          "HVM64": "ami-0bdb828fd58c52235"
        eu-west-1:
          "HVM64": "ami-047bb4163c506cd98"
    
    
    - 사용 예제-3 (FindInMap 함수를 사용하여 지정한 키에 따라 명명된 값을 반환할 수 있음,
     FindInMap 함수르 통해 ImageId 속성이 할당된 EC2 리소스가 포함)
    AWSTemplateFormatVersion: "2010-09-09"
    Mappings:
      RegionMap:
        us-east-1:
          HVM64: ami-0ff8a91507f77f867
          HVMG2: ami-0a584ac55a7631c0c
        us-west-1:
          HVM64: ami-0bdb828fd58c52235
          HVMG2: ami-066ee5fd4a9ef77f1
    
    Resources:
      myEC2Instance:
        Type: "AWS::EC2::Instance"
        Properties:
          ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]  
      #FindInMap 함수는 키를 스택이 생성되는 리전으로 지정하여 HVM64를 매핑할 값으로 지정
          InstanceType: m1.small
    
    

     

  • conditions(조건) : 조건에 따라 템플릿의 동작을 바꾸고 싶은경우(ex:조건 충족시동)
    사용 예제-1 (운영 환경과 그 외의 환경에서 생성할 IAM 사용자를 변경하고 싶을 때 템플릿을 정의하는 방법 (운영 환경 사용자외 이외 사용자를 서로 다르게))
    1) 파라미터 섹션에서 환경을 나타내는 파라미터 생성
    Parameters :  # 조건에서 평가하고자 하는 입력을 정의, 조건은 이러한 입력 파라미터의 값에 따라 true 또는 false로 평가, 조건에서 가상 파라미터를 평가하고자 하는 경우 이 섹션에서 가상파라미터를 정의할 필요가 없음
           Env :
                   Type : String
                   AllowedValues :
                          - production
                          - test
                          - develop
                   Default : test
                   Description : Select Env.
    2) Conditions 섹션에 선택된 Env 에 의해 운영 환경인지 아닌지 판단하는 값을 판단하는 값인 IsProduction을 생성
    Conditions :  # 내장 조건 함수를 사용 하여 조건을 정의, 이러한 조건은 CloudFormation에서 연결된 리소스가 생성되는 경우를 결정
             IsProduction : !Equals [ !Ref Env, production ]
    
    3) 마지막으로 리소스 측에서 IsProduction의 값에 따라 사용자를 만들것인지를 판단
    Resources :  # Resources 및 Outputs 섹션에서 조건부로 생성할 리소스나 출력을 조건과 연결, Condition 키와 조건의 논리적 ID를 사용하여 리소스나 출력과 연결, 속성을 조건부로 지정하려면 Fn::If 함수를 사용
            ProdUser :
                    Type : AWS::IAM::User
                    Condition::IsProduction
                    Properties : ~
    - 사용 예제-2
    
    AWSTemplateFormatVersion: "2010-09-09"
    Mappings:
      RegionMap:
        us-east-1:
          AMI: "ami-0ff8a91507f77f867"
          TestAz: "us-east-1a"
        us-west-1:
          AMI: "ami-0bdb828fd58c52235"
          TestAz: "us-west-1a"
    Parameters:
      EnvType:
        Description: Environment type.
        Default: test
        Type: String
        AllowedValues:
          - prod
          - test
        ConstraintDescription: must specify prod or test.
    Conditions:
      CreateProdResources: !Equals [ !Ref EnvType, prod ]
    Resources:
      EC2Instance:
        Type: "AWS::EC2::Instance"
        Properties:
          ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]
      MountPoint:
        Type: "AWS::EC2::VolumeAttachment"
        Condition: CreateProdResources
        Properties:
          InstanceId:
            !Ref EC2Instance
          VolumeId:
            !Ref NewVolume
          Device: /dev/sdh
      NewVolume:
        Type: "AWS::EC2::Volume"
        Condition: CreateProdResources
        Properties:
          Size: 100
          AvailabilityZone:
            !GetAtt EC2Instance.AvailabilityZone
    Outputs:
      VolumeId:
        Condition: CreateProdResources
        Value:
          !Ref NewVolume
  • output(출력) : 구축된 리소스에 관한 정보 중에서 관리 콘솔 등에 출력하는 정보를 정의

    정의한 값은 관리 콘솔에서 확인할 수 있을뿐더러 다른 AWS 리소스를 구축할 때 사용할 수 있음

    사용 예제-1 (EC2 인스턴스의 인스턴스 ID 출력) 
    
    Outputs :
             InstanceID :
                   Description : The Instance ID
                   Value : !Ref TestEC2Instance01
    
    - 사용 예제-2 (다른 스택에서 출력 값을 사용하고 싶은 경우에 Export 사용)
    Outputs :
            InstanceID :
                  Description : The Instance ID
                  Value : !Ref TestEC2Instance01
                  Export :
                          Name : !Sub "${AWS::StackName}-InstanceID"
    위의 내용을 Fn::ImportValue 함수를 사용해 참조하는 것이 가능
    Fn::ImportValue:
    
          !Sub "${AWS::StackName}-InstanceID"
    
    
  • transfrom(변환) : 템플릿을 처리하는데 사용하는 하나 이상의 매크로를 지정

    CloudFormation에서는 지정된 순서에 따라 매크로를 실행하고 변경 세트를 생성할 때 CloudFormation에서 처리된 템플릿 콘텐츠를 포함시키는 변경 세트를 생성 (변경사항을 검토하고 변경 세트를 실행)

    • aws serverless변환
      • CloudFormation에 의해 호스팅 되는 매크로인 AWS::Serverless 변형은 AWS SAM 구문에서 작성된 전체 템플릿을 가져온 다음 이를 변형 후 규정 준수 템플릿으로 확장
      • 사용자 지정 매크로와는 달리 AWS::Serverless 변형은 특별한 사용 권한을 필요로 하지않는데 CloudFormation에서 호스팅 되기 때문
      • CloudFormation 내에 있는 모든 계정의 템플릿에서 사용할 수 있음
      사용 예제-1
      Transform: "AWS::Serverless-2016-10-31”  # 변환 선언을 보여주는 예 (변환 선언 값은 리터럴 문자열이어야 하며 파라미터나 함수를 사용하여 변환 값을 지정할 수 없음)
      사용 예제-2 (AWS SAM 구문을 사용하여 Lambda 함수 및 해당 실행 역활의 선언을 간소화)
      Transform: AWS::Serverless-2016-10-31
      Resources:
         MyServerlessFunctionLogicalID:
         Type: AWS::Serverless::Function
         Properties:
           Handler: index.handler
           Runtime: nodejs8.10
           CodeUri: 's3://testBucket/mySourceCode.zip'
    • aws include 변환
      • CloudFormation에서 호스팅된 매크로인 AWS::Include 변형을 사용하여 보일러플레이트 콘텐츠를 템플릿에 삽입
      • AWS::Include 변형을 사용하여 S3 버킷에서 템플릿 코드 조각에 대한 참조를 생성할 수 있음
      • AWS::Include 함수는 프래그래밍 언어로 include, copy 또는 import 지시문과 비슷하게 동작
      사용 예제-1 (Transform 섹션에 있는 템플릿 최상위에 AWS::Include 변형을 포함)
      Transform:
       Name: 'AWS::Include'
       Parameters:
         Location: 's3://MyAmazonS3BucketName/MyFileName.yaml’  # 위치는 구체적인 파일 이름이 S3버킷인 URL

참고 : https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html#w2aab5c15b7

 

'IAC' 카테고리의 다른 글

cloudformation- VPC  (0) 2021.06.24

+ Recent posts