본문 바로가기

AWS

AWS - CloudFormation

728x90

■ AWS - CloudFormation 정의

  • AWS에서 제공하는 인프라를 코드로 관리 할 수 있는 IaC (Infrastructure as Code)의 기능을 제공하며, AWS에 구성할 아키텍처와 AWS의 대부분의 리소스를 구성 할 수 있습니다. 

 

 AWS - CloudFormation 특징

  • IaC (Infrastructure as Code): 생성이 필요한 리소스를 작업자가 수동으로 생성하지 않고 JSON 또는 YAML을 이용한 Code를 기반으로 인프라를 구성 합니다. 생성된 산출물은 " 템플릿 "이라고 하며 버전 정보를 가집니다. 
  • 생산성 향상: 템플릿을 기반으로 하여 클라우드 인프라 생성과 삭제가 자유로우며, 생성이 진행되는 이벤트를 추적 관리 할 수 있습니다. 
  • 높은 재사용: 생성한 템플릿은 S3에 저장되며 기존에 작성한 템플릿 재사용 또는 공유를 통한 재사용성을 높일 수 있습니다. 
  • 삭제 종속성: CloudFormation으로 생성된 리소스는 기본적으로 스택을 삭제하면 모두 삭제 됩니다. 삭제 종속성을 회피하기 위해서 스택 생성시 종료 방지를 활성화 하면 생성된 리소스를 보호할 수 있습니다. 

 

 AWS - CloudFormation 템플릿 구성요소

  • 리소스(Resource, 필수): 클라우드포메이션을 활용하여 생성 할 AWS 리소스 명칭 입니다. (EC2, 보안그룹, EIP, ELB 와 같은 AWS 서비스)
  • 매개변수(Parameter): 템플릿에서 사용할 동적 입력값 입니다. 매개변수를 사용하면 템플릿의 재사용성이 높아 집니다.
    • 내부 참조: 템플릿 내부에서 정의된 리소스를 다른 리소스에서 참조 하고자 할 때 사용 합니다. 아래와 같이 Subnet이 연동되어야 하는 VPC에 대해서 참조할 때 사용되며 !Ref 를 붙이고 리소스 명칭을 추가하여 사용 합니다.  
      Resources:
        MySubnet:
          Type: 'AWS::EC2::Subnet'
          Properties:
            VpcId: !Ref MyVPC​
    • 외부 참조: 템플릿을 활용하여 스택 생성 시 사용자의 입력값을 필요로 하는 매개변수 입니다. Parameters 라는 항목 아래 필요로 하는 내용을 정의하고 인스턴스 생성 시 입력 받아야 할 Key Pair를 !Ref를 사용하여 참조 하였습니다. 해당 외 다양한 조건에서 사용할 수 있습니다. 
      Parameters:
        KeyName:
          Type: AWS::EC2::KeyPair::KeyName
          Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
      Resources:
        MyInstance:
        Type: 'AWS::EC2::Instance'
        Properties:
          InstanceType: t2.micro
          ImageId: ami-081a36454cdf357cb
          KeyName: !Ref KeyName  # 사용자 입렵이 필요한 매개변수 지정​


  • 매핑(Mapping): 템플릿에서 사용할 정적 변수 입니다. 사용자 환경이나 특수 목적을 위해서 사용되는 하드 코딩된 항목 입니다.
    • 템플릿에서 사용할 정보들을 사전에 알고 있을 때 유용합니다. (리전, AMI ID, 가용 영역, AWS ID)
    • 매핑 값에 접근하기 위해 Fn::FindInMap 함수를 사용 합니다. 
    • !FindInMap [ MapName, TopLevelKey, SecondLevelKey] 3개의 매개변수로 이루어져 있습니다. 
      Mappings:
        RegionMap:
          ap-northeast-1:
            "32": "ami-1"
            "64": "ami-2"
          ap-northeast-2:
            "32": "ami-1"
            "64": "ami-2"
          ap-northeast-3:
            "32": "ami-1"
            "64": "ami-2"
            
      Resources:
        MyEC2Instance:
          Type: AWS::EC2::Instance
          Properties:
            ImageId: !FindInMap [ResionMap, !Ref "AWS::Region", 64]
            # !FindInMap 함수를 사용하여 Mappings에 정의된 RegionMap을 참조 합니다.
            # !Ref "AWS::Region"을 사용하여 현재 리전 정보를 가져 옵니다. 
            # 64를 사용하여 사용할 AMI ID값을 참조 합니다. 
            InstanceType: t2.micro
       
  • 출력(Output): 옵션값 이며, 출력을 설정하면 다른 스택에서 사용할 수 있습니다. 
    • 다른 템플릿에서 생성한 값을 공유할 때 사용합니다. 해당 값을 참조한 스택이 있을 경우 원본 스택은 삭제가 불가능 합니다. 
    • Fn::ImportValue 함수를 사용합니다. 
      Template1
      .
      .
        Outputs:
          StackSSHSecurityGroups:
            Description: Only Allowed The SSH Group
            Value: !Ref CompanySSHSecurityGroup
            Export:
              Name: SSHSecurityGroup
      
      
      #####
      
      Template2
      .
      .
      Resources:
        MyInstance:
          Type: AWS::EC2::Instance
          Properties:
            ImageId: ami-a...
            InstanceType: t2.micro
            SecurityGroups:
              - !ImportValue: SSHSecurityGroup​
  • 조건(Condition): AWS 리소스를 생성할 때 수행하는 조건문 입니다. (IF문)
    • 템플릿 내에서 특정 조건에 따라 리소스 생성 여부를 결정하는 데 사용됩니다.
    • 조건은 Conditions 섹션에서 정의되며, Fn::If 함수를 사용하여 조건을 평가합니다. 조건이 true로 평가되면 해당 리소스가 생성되고, false로 평가되면 생성되지 않습니다
    • 조건에서 논리적 연산자 (And, Equals, If, Not, Or)를 사용하며 아무런 연산자가 붙지 않으면 주어진 조건이 "참" 일 경우 구문이 실행 됩니다. 
    • 아래 코드에서 매개변수 Environment를 지정하고 조건절에서 평가 합니다. MyDevResource 항목에 있는 Condition에서 CreateDevResources 가 "True" 일경우 MyDevResource 에 있는 Properties 항목이 수행 됩니다. 
      Parameters:
        Environment:
          Type: String
          Default: Production
      
      Conditions:
        CreateDevResources: !Equals [!Ref Environment, Development]
      
      Resources:
        MyDevResource:
          Condition: CreateDevResources
          Type: AWS::Some::Resource
          Properties:
            # Dev resource properties here
      
        MyProdResource:
          Type: AWS::Some::Resource
          Properties:
            # Prod resource properties here
  • 메타데이터(Metadata): 템플릿에 작성된 코드에 대한 설명을 추가하기 위한 데이터 입니다. 메타데이터 키 라는 기능을 활용하여 해당 섹션에서 정의하는 설정 또는 구성 정보를 가져옵니다.
    Metadata:
      Instances:
        Description: "Information about the instances"
      Databases: 
        Description: "Information about the databases"

 

 

 AWS - CloudFormation 내장 함수

  • Ref
    • 매개변수를 참조할 때 사용. 템플릿 내에서 다른 리소스를 참조할 때 사용하거나 매개변수의 값을 반환 할 때 사용 합니다.
  • Fn::GetAtt
    • 리소스의 속성값을 가져올 때 사용 합니다. 
    • !GetAtt 약어로 사용 합니다.
  • Fn::FindInMap
    • Mapping에 정의된 값을 가져올 때 사용합니다.
  • Fn::ImportValue
    • 내보내기 (Output)된 값들을 가져올 때 사용 합니다.
  • Fn::Join
    • 분리된 값을 구분자로 결합 할 때 사용 합니다.
    • !Join [ 구분자, [데이터1, 데이터2] ]
    • !Join [ ":" , [a, b, c] ] → a:b:c 가 생성 됩니다
  • Fn::Sub
    • Substitue의 약자로 Sub를 사용하며, 특정 텍스트를 다른 텍스트로 치환 합니다. 
    • !Sub 약어를 사용하며 문자열에 $기호가 있어야 합니다.
    • 아래 예제 코드는 매개변수로 UserName을 정의하고 EC2 인스턴스에서 매개변수 UserName을 참조하여 John 이라는 문자열로 치환 됩니다. 
      Parameters:
        UserName:
          Type: String
          Default: John
      
      Resources:
        MyInstance:
          Type: AWS::EC2::Instance
          Properties:
            ImageId: ami-12345678
            InstanceType: t2.micro
            UserData:
              Fn::Base64: !Sub |
                #!/bin/bash
                echo "Hello, ${UserName}!" > /tmp/hello.txt​
  • 템플릿 내부에 있는 코드중 !가 붙는 경우 CloudFormation의 내장 함수 입니다.

 

 

 

 

 

 

728x90

'AWS' 카테고리의 다른 글

AWS - CloudFormation EC2 사용자 정의 데이터  (0) 2024.03.07
AWS - CloudFormation (실습)  (0) 2024.03.07
AWS - S3 (Simple Storage Service)  (0) 2024.03.02
AWS - Elastic File Storage (EFS)  (0) 2024.03.02
AWS - Elastic Block Storage (EBS)  (0) 2024.03.02