728x90
반응형

CloudFormation 이란?

 

- AWS 리소스의 설정을 JSON 형식 또는 YAML 형식으로 기재한 템플릿을 만들고 해당 템플릿에서 AWS 리소스를 자동으로 구축하는 서비스

 

- CloudFormation에는 스택과 템플릿으로 구성

  • 스택

    • CloudFormation 기능으로 자동 생성된 AWS 리소스의 집합을 나타냄

    • CloudFormation은 스택 단위로 리소스를 관리하기 위해 스택에 연관된 리소스를 한번에 구축하거나 한번에 제거할 수 있음

    • 리소스간에는 의존관계가 있는 경우가 많은데 예를 들어 VPC와 EC2 인스턴스에서 VPC가 없다면 인스턴스를 만들 수 없다. 이같은 의존 관계를 CloudFormation이 자동 구축 시에 판단하고 구축하는 순서에 모순이 없도록 결정

  • 템플릿

    • 스택 구성을 결정하는 설계자로서 CloudFormation의 핵심 요소

    • JSON이나 YAML 형식으로 기술

    • 템플릿은 AWS 리소스를 기술하는 장소, 실행조건을 기술하는 장소 등의 몇 개 섹션으로 구성

    • 템플릿 생성을 지원하는 내장함수가 존재하며 이 내장함수를 사용해 범용성 높은 템플릿 구성 가능

  • 변경 세트

    • 스택에서 실행 중인 리소스를 변경해야 하는 경우 스택을 업데이트

    • 리소스를 변경하기 전에 제안된 변경 사항이 요약된 변경 세트를 생성할 수 있음

    • 변경 세트를 사용하면 변경  사항을 구현하기 이전에 해당 변경이 실행중인 리소스에 미치는 영향을 확인할 수 있음

    • Ex. RDS DB 인스턴스의 이름을 변경한 경우 CloudFormation에서 새 DB를 생성하고 이전 DB를 삭제하므로 아직 백업하지 않은 경우 이전 DB 데이터를 잃게 됨

 

 

 

템플릿 섹션

 

 

Resources (리소스)

 

- 구축하는 AWS 리소스를 정의하는 섹션 (사용하는 AWS 서비스의 정의를 기술)

 

- 템플릿 중에서도 가장 중요한 섹션

 

- 사용 예제-1

Resources :

    EC2InstanceWeb :   # Logical ID로 템플릿내에 고유해야함, 논리적 이름을 사용하여 템플릿의 다른 부분에 있는 리소스를 참조

        Type : 'AWS::EC2::Instance'  # 리소스의 유형을 지정

        Properties :  # 리소스에 지정할 수 있는 추가 옵션으로 속성을 지정

                InstanceType : 'm2.large'  # 인스턴스 유형 지정

                InstanceInitiatedShutdownBehavior : 'stop'  # 셧다운할 때 동작을 지정

 

- 사용 예제-2 (MyInstance 리소스는 MyQuere 리소스를 UserData 속성의 일부로서 포함)

Resources:

  MyInstance:

    Type: "AWS::EC2::Instance"

    Properties:

      UserData:

        "Fn::Base64":

          !Sub |

            Queue=${MyQueue}

      AvailabilityZone: "us-east-1a"

      ImageId: "ami-0ff8a91507f77f867"

  MyQueue:

    Type: "AWS::SQS::Queue"

    Properties: {}

 

 

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 형식의 변수를 정의하는 섹션

 

- 템플릿의 실행 환경에 따라 달라질 수 있는 값을 사전에 맵 형식으로 정의할 수 있음

 

- 리전마다 설정 값이 다른 경우 등은 Mappings 섹션에 정의해 두고 리전마다 사용하는 값을 변경할 수 있게함

 

- 사용 예제-1

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"

    ap-southeast-1:

      "HVM64": "ami-08569b978cc4dfa10"

    ap-northeast-1:

      "HVM64": "ami-06cd52961ce9f0d85"

 

- 사용 예제-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

    eu-west-1:

      HVM64: ami-047bb4163c506cd98

      HVMG2: ami-0a7c483d527806435

    ap-northeast-1:

      HVM64: ami-06cd52961ce9f0d85

      HVMG2: ami-053cdd503598e4a9d

    ap-southeast-1:

      HVM64: ami-08569b978cc4dfa10

      HVMG2: ami-0be9df32ae9f92309

Resources:

  myEC2Instance:

    Type: "AWS::EC2::Instance"

    Properties:

      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]  #FindInMap 함수는 키를 스택이 생성되는 리전으로 지정하여 HVM64를 매핑할 값으로 지정

      InstanceType: m1.small

 

 

Conditions (조건)

 

- 조건에 따라 템플릿의 동작을 바꾸고 싶은 경우 사용 (예를 들어 조건을 충족할때만 EC2 인스턴스를 시작하는 경우) 

 

- 사용 예제-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 :

~~~~

 

  •  Conditions 섹션을 활용하면 '운영 환경만 CloudWatch의 모니터링을 추가한다', '검증 환경에만 검증 권한을 가진 IAM 사용자를 생성한'다라는 정의를 할 수 있음

 

- 사용 예제-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"

    us-west-2:

      AMI: "ami-a0cfeed8"

      TestAz: "us-west-2a"

    eu-west-1:

      AMI: "ami-047bb4163c506cd98"

      TestAz: "eu-west-1a"

    sa-east-1:

      AMI: "ami-07b14488da8ea02a0"

      TestAz: "sa-east-1a"

    ap-southeast-1:

      AMI: "ami-08569b978cc4dfa10"

      TestAz: "ap-southeast-1a"

    ap-southeast-2:

      AMI: "ami-09b42976632b27e9b"

      TestAz: "ap-southeast-2a"

    ap-northeast-1:

      AMI: "ami-06cd52961ce9f0d85"

      TestAz: "ap-northeast-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"

 

 

Metadata (메타데이터)

 

- 템플릿에 대한 세부 정보를 제공하는 임의 JSON 또는 YAML 객체를 포함할 수 있음 (특정 리소스에 대한 템플릿 구현 세부 정보를 포함할 수 있음)

 

- 스택 업데이트 중에는 메타데이터 섹션을 자체적으로 업데이트할 수 없음, 리소스를 추가 / 수정 / 삭제하는 변경 내용을 포함할 때만 업데이트할 수 있음

 

- 사용 예제-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에서 템플릿을 생성 및 업데이트할 때 이 정보가 자동으로 추가

 

 

Transform (변환)

 

- 템플릿을 처리하는데 사용하는 하나 이상의 매크로를 지정

 

- 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

     

 

참조 URL

 

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

https://www.slideshare.net/awskorea/6-infra-auto-deploy-awscloudformation-advanced-skill

반응형

'AWS' 카테고리의 다른 글

AWS Auto Scaling 종료 정책  (0) 2019.04.09
AWS CloudFormation 내장함수  (0) 2019.04.09
AWS Resource Group  (0) 2019.04.09
AWS CodeBuild  (0) 2019.04.09
AWS CodeCommit  (0) 2019.04.09

+ Recent posts