AWS/CICD

[AWS] AWS CloudFormation 의 개념

Jaden Park 2021. 8. 2. 17:38

AWS CloudFormation 이란?

 

AWS CloudFormation 구성요소

  • 템플릿(Template)
  • 스택(Stack)
  • CloudFormation

 

AWS CloudFormation 작동 방식

  • 스택 생성 워크플로우
  • 스택 업데이트 워크플로우

 

템플릿(Template) 구성 사항

  • 포맷 버전
  • Description
  • Metadata
  • Parameters
  • Rules
  • Mappings
  • Conditions
  • Transform
  • Resources
  • Outputs

 

 


 

AWS CloudFormation 이란?

AWS의 대표적인 IaC 기반의 구성 조정 도구

스택을 생성할 때 마다 AWS CloudFormation에서 템플릿에 설명된 리소스를 프로비저닝과 구성을 담당

AWS 리소스를 수동으로 생성하거나 구성할 필요가 없고 어떤 것이 무엇에 의존하는지 파악할 필요가 없음.

JSON, YAML 이용하여 작성.

 

장점

인프라 관리 간소화

  • 템플릿을 사용하여 AWS CloudFormation 스택을 생성할 경우 Auto Scaling 그룹, 로드 밸런서 및 데이터베이스를 자동으로 프로비저닝

 

신속하게 인프라 복제

  • 템플릿을 재사용하여 리소스를 일관되고 반복적으로 설정 가능
  • 리소스를 한 번만 설명하고 여러 리전에서 동일한 리소스를 반복적으로 프로비저닝

 

인프라 변경 사항을 쉽게 제어 및 추적

  • 프로비저닝되는 리소스와 해당 설정이 AWS CloudFormation 템플릿에 상세히 기술됨.
  • 템플릿은 텍스트 파일이므로 템플릿에서 차이점을 추적하여 인프라 변경 사항을 추적할 수 있음
  • 예를 들어 버전 제어 시스템을 템플릿과 함께 사용하여 변경된 내용, 변경한 사람, 변경 시간 등을 정확히 알 수 있음
  • 언제든지 인프라에 대한 변경 사항을 되돌려야 하는 경우 이전 버전의 템플릿을 사용 가능

 


AWS CloudFormation 구성요소

AWS CloudFormation을 사용하는 경우에는 템플릿스택으로 작업

템플릿을 생성하여 AWS 리소스와 해당 속성에 대해 설명

스택을 생성할 때마다 AWS CloudFormation에서 템플릿에 설명된 리소스를 프로비저닝

 

템플릿(Template)

스택 리소스 프로비저닝 및 구성을 위해 필요한 파일

 

JSON 또는 YAML 형식의 텍스트 파일 (.json, .yaml, .template 또는 .txt 등 모든 확장명으로 파일을 저장 가능)

AWS CloudFormation Designer를 사용하여 GUI 기반으로 친숙하게 템플릿 작성 가능

AWS CloudFormation에서는 템플릿을 AWS 리소스 구축을 위한 블루프린트로 사용

 

더보기

블루프린트란?

블루프린트는 순서도처럼 노드를 연결해서 프로그램의 논리를 표현하는 것.

전체적인 흐름이 이해하기 쉬운 장점이 있지만, 논리가 복잡해지면 아주 커다란 그래프를 만들어야 하므로 오히려 이해하기 어려운 프로그램이 될 수 있음.

 

 

스택(Stack)

하나의 단위로 관리할 수 있는 AWS 리소스 모음

스택의 생성, 업데이터, 삭제를 통해 리소스 모음의 생성, 업데이트, 삭제

스택의 모든 리소스는 CloudFormation 템플릿을 통해 정의

스택을 삭제하면 관련 리소스가 모두 삭제

 

 

Cloudformation

Stack을 생성하고 Stack에 대한 변경 사항을 확인 및 업데이트Stack 생성 및 변경 중 에러 감지를 통한 롤백 지원

 


 

AWS CloudFormation 작동 방식

 

스택 생성 워크플로우

 

1. YAML 또는 JSON 포맷으로 원하는 인프라에 대한 정보 CloudFormation 템플릿으로 작성

필요시 AWS 에서 제공되는 각 서비스별 템플릿과 리전별 템플릿을 참조할 수 있음.

 

 

2. CloudFormation 템플릿을 로컬에 저장하거나, S3 Bucket에 저장

저장할 템플릿의 확장자명은 작성한 언어에 따라 다양한 파일 확장명으로 저장 가능.  (.json, .yaml, .txt , .template ...)

 

 

3. 템플릿 파일의 위치(예: 로컬 컴퓨터의 경로 또는 Amazon S3 URL)를 지정하여 CloudFormation 스택을 생성

템플릿에 파라미터가 포함되어 있는 경우 스택을 생성할 때 입력 값을 지정할 수 있음.

파라미터를 통해 템플릿을 값을 전달하여 스택을 생성할 때마다 리소스를 사용자 지정

 

 

4. 템플릿에 지정된 스택(Stack)을 통해 AWS 리소스에 대한 프로비저닝 및 구성 작업을 진행

모든 리소스가 생성된 후 AWS CloudFormation에서는 스택이 생성되었음을 보고

스택 생성에 성공하면 생성한 리소스 사용 가능

스택 생성에 실패하면 생성한 리소스를 모두 삭제하고 변경 사항을 롤백(Role-Back) 시킴

 

 

스택 업데이트 워크플로우

 

1. AWS CloudFormation Designer 또는 텍스트 편집기를 사용하여 AWS CloudFormation 스택 템플릿을 수정

 

 

2. CloudFormation 템플릿을 로컬에 저장하거나, S3 Bucket에 저장

템플릿의 확장자명은 작성한 언어에 따라 다양한 파일 확장명으로 가능.  (.json, .yaml, .txt , .template ...)

 

 

3. 업데이트하려는 스택과 수정된 템플릿의 위치(예: 로컬 컴퓨터의 경로 또는 Amazon S3 URL)를 지정하여 변경 세트를 생성

템플릿에 파라미터가 포함되어 있는 경우 스택을 생성할 때 입력 값을 지정할 수 있음.

 

 

4. 변경 세트를 보고 기대하는 변경을 AWS CloudFormation에서 수행할지 확인

ex) AWS CloudFormation에서 중요한 스택 리소스를 대체할지 확인

원하는 변경 사항을 포함할 때까지 변경 세트는 필요한 만큼 생성

 

 

5. 스택에 적용하려는 변경 세트를 실행

AWS CloudFormation에서는 수정한 리소스만 업데이트하여 스택을 업데이트 스택 업데이트에 성공했다는 신호를 전송

스택 업데이트에 실패하면 AWS CloudFormation에서는 변경 사항을 롤백해 스택을 알려진 마지막 작동 상태로 복원

 

 

 


템플릿(Template) 구성 사항

템플릿은 '포맷 버전, Description, Metadata, Parameters, 규칙, Mappings, Conditions, Transform, Resources, Outputs' 과 같은 섹션들로 구분되며, 주요 세션별 역할은 다음과 같음.

 

# JSON

{
"AWSTemplateFormatVersion" : "version date",
# 템플릿 버전 

"Description" : "JSON string",
# 템플릿 설명

"Metadata" : { template metadata },
# 템플릿에 대한 추가 정보

"Parameters" : { Set of parameters },
# 템플릿 실행 시 전달한 파라미터 값

"Mappings" : { Set of mappings },
# 간소화된 표현을 위한 키,값 

"Conditions" : { Set of conditions },
# 특정 자원에 대한 생성 여부를 판단하는 조건

"Transform" : { Set of transforms },
# Serverless 애플리케이션용

"Resources" : { Set of resources },
# 생성될 AWS 리소스 나열 (필수항목)

"Outputs" : { Set of outputs }
# 템플릿 실행 후 만들어진 리소스 결과값 (자원 ID, IP 등)
}

 

 

포맷 버전, AWSTemplateFormatVersion (선택사항)

템플릿이 따르는 AWS CloudFormation 템플릿 버전.

템플릿 포맷 버전은 API 또는 WSDL 버전과 같지 않음. (템플릿 포맷 버전은 API 및 WSDL 버전과 상관없이 변경될 수 있음.)

 

 

  • 템플릿 포맷 버전 선언 값은 리터럴 문자열여야 함.
  • 파라미터나 함수를 사용하여 템플릿 포맷 버전을 지정할 수 없음.
  • 값을 지정하지 않을 경우 AWS CloudFormation 에서는 최신 템플릿 포맷 버전이라고 지정

 

# JSON
"AWSTemplateFormatVersion" : "2010-09-09"
# YAML
AWSTemplateFormatVersion: "2010-09-09"

 


Description (선택사항)

템플릿을 설명하는 텍스트 문자열.

이 섹션은 항상 템플릿 포맷 버전 섹션 다음에 이어져야 함.

 

 

  • 설명 선언 값은 0 ~ 1023바이트 길이의 리터럴 문자열.
  • 파라미터나 함수를 사용하여 설명을 지정할 수 없음

 

 

# JSON
"Description" : "Here are some details about the template."
# YAML

Description: >
  Here are some
  details about
  the template.

 


 

Metadata (선택사항)

템플릿에 대한 추가 정보를 제공하는 객체

 

 

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

 

 

  • CloudFormation은 Metadata 섹션에 포함된 정보를 변환, 수정 또는 삭제하지 않음.
  • 이러한 이유 때문에 이 섹션을 사용하여 암호나 보안 암호와 같은 민감한 정보를 저장하지 않는 것이 좋음

 

# JSON

"Metadata" : {
  "Instances" : {"Description" : "Information about the instances"},
  "Databases" : {"Description" : "Information about the databases"}
}
# YAML

Metadata:
  Instances:
    Description: "Information about the instances"
  Databases:
    Description: "Information about the databases"

 


 

Parameters (선택사항)

(스택을 생성하거나 업데이트할 때) 실행 시간에 템플릿에 전달하는 값.

 

템플릿의 Resources  Outputs 섹션에서 파라미터를 참조 가능.

 

 

  • AWS CloudFormation 템플릿에는 최대 60개 파라미터를 지정 가능
  • 각 파라미터마다 논리적 이름(논리적 ID)을 지정, 템플릿 내 모든 논리적 이름 간에 고유해야 하며 영숫자로 지정
  • 각 파라미터마다 AWS CloudFormation이 지원하는 파라미터 유형을 할당
  • 각 파라미터마다 AWS CloudFormation이 스택을 프로비저닝 할 실행 시간에 대한 값을 할당해야 함.
  • 파라미터는 동일한 템플릿에서 선언하고 참조해야 함. 템플릿의 Resources 및 Outputs의 파라미터를 참조

 

다음 예는 InstanceTypeParameter이라는 이름의 파라미터를 선언

스택을 생성 또는 업데이트 할 때 사용할 스택의 Amazon EC2 인스턴스 유형을 지정할 수 있는 파라미터

# JSON

"Parameters" : {
  "InstanceTypeParameter" : {
    "Type" : "String",
    "Default" : "t2.micro",
    "AllowedValues" : ["t2.micro", "m1.small", "m1.large"],
    "Description" : "Enter t2.micro, m1.small, or m1.large. Default is t2.micro."
  } 
}
# YAML

Parameters:
  InstanceTypeParameter:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
      - m1.large
    Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.

 


규칙 (선택사항)

스택을 생성하거나 업데이트할 때 템플릿에 전달된 파라미터 또는 파라미터의 조합을 검증

 

 

템플릿 규칙을 사용하려면 Assertions 다음에 템플릿에서 Rules를 명시적으로 선언

 

 

규칙 섹션을 사용하여 리소스를 생성하거나 업데이트하기 전에 파라미터 값을 검증

 

 

  • 규칙 조건(선택 사항) — 규칙을 적용하는 시점을 결정합니다.
  • Assertions (필수) — 사용자가 특정 파라미터에 대해 지정할 수 있는 값을 설명합니다.

 

 

# JSON

{
"Rules": {
        "Rule01": {
            "RuleCondition": {
                "rule-specific intrinsic function": "Value01"
            },
            "Assertions": [
{
"Assert": {
                        "rule-specific intrinsic function": "Value02"
                    },
                    "AssertDescription": "Information about this assert"
                },
{
"Assert": {
                        "rule-specific intrinsic function": "Value03"
                    },
                    "AssertDescription": "Information about this assert"
                }
] },
        "Rule02": {
            "Assertions": [
{
"Assert": {
                        "rule-specific intrinsic function": "Value04"
                    },
                    "AssertDescription": "Information about this assert"
                }
			]
		}
	}
}
# YAML

Rules:
  Rule01:
    RuleCondition:
      rule-specific intrinsic function: Value01
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value02
        AssertDescription: Information about this assert
      - Assert:
          rule-specific intrinsic function: Value03
        AssertDescription: Information about this assert
  Rule02:
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value04
        AssertDescription: Information about this assert

 


 

Mappings (선택사항)

조건부 파라미터 값을 지정하는 데 사용할 수 있는 키와 관련 값의 매핑

 

 

예를 들어 리전에 따라 값을 설정 하려면 리전 이름을 키로 사용하고 각각의 특정 리전에 대해 지정할 값을 포함하는 매핑을 생성

Resources  Outputs 섹션의 Fn::FindInMap 내장 함수를 사용하여 키를 해당 값으로 매핑 할 수 있음

 

 

  • Mappings 섹션은 "키 이름" "Mappings" 로 이루어짐.
  • 매핑의 키는 문자열이어야 함
  • 값은 String이 나 List 유형이 될 수 있음.
  • 매핑 내에서 각 맵은 키이며 그 뒤에는 다른 매핑이 이어집니다.
  • 키는 이름-값 페어의 맵이어야 하며 매핑 내 에서 고유해야 합니다.
  • 이름에는 영숫자(A-Za-z0-9)만 포함될 수 있습니다.

 

다음 예제는 Mapping01(논리적 이름)이라는 매핑 하나가 있는 Mappings 섹션을 보여줍니다.

 

# JSON

"Mappings" : {
  "Mapping01" : {
"Key01" : {
      "Name" : "Value01"
    },
"Key02" : {
      "Name" : "Value02"
    },
"Key03" : {
      "Name" : "Value03"
    }
  }
}
# YAML

Mappings:
  Mapping01:
    Key01:
      Name: Value01
    Key02:
      Name: Value02
    Key03:
      Name: Value03

 


Conditions (선택사항)

스택 생성 또는 업데이트 시 특정 리소스 속성에 값이 할당되는지 또는 특정 리소스가 생성되는지 여부를 제어하는 조건

 

예를 들어 조건을 생성하고 이를 리소스 또는 출력에 연결하여 조건이 true인 경우 AWS CloudFormation에 서 리소스 또는 출력을 생성

 

# JSON

"Conditions" : {
"Logical ID" : {Intrinsic function}
}
# YAML

Conditions:
  Logical ID:
    Intrinsic function

 


Transform (선택사항)

서버리스 애플리케이션(Lambda 기반 애플리케이션이라고도 함)의 경우, 사용할 AWS Serverless Application Model (AWS SAM)의 버전도 지정 변환을 지정할 경우 구문을 사용하여 템플릿에 리소스를 선언할 수 있습니다. 이 모델은 사용할 수 있는 구문과 처리 방식을 정의

 

 

AWS::Include 변환을 사용하여 기본 AWS CloudFormation 템플릿과는 별도로 저장되는 템플릿 코드 조각으로 작업 가능

 

버킷에 코드 조각 파일을 저장한 다음 여러 템플릿 간에 함수를 재사용 가능

 


Resources (필수)

Amazon Elastic Compute Cloud 인스턴스 또는 Amazon Simple Storage Service 버킷 같은 스택 리소스 및 해당 속성을 지정

 

템플릿의 Resources  Outputs 섹션에서 리소스를 참조가능

 

 

 

# JSON example

"Resources" : {
  "MyEC2Instance" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
      "ImageId" : "ami-0ff8a91507f77f867"
    }
  }
}
#YAML example

Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ff8a91507f77f867"
  • Logical ID : 논리적 ID는 영숫자(A-Za-z0-9)여야 하며 템플릿 내에서 고유해야 합니다. 논리적 이름을 사용하여 템플릿의 다른 부분에 있는 리소스를 참조합니다. 논리적 ID 외에도, 특정 리소스에는 EC2 인스턴스 ID 또는 S3 버킷 이름 같은 해당 리소스에 대해 실제 할당된 이름인 물리적 ID도 지정됩니다. 물리적 ID를 사용하여 AWS CloudFormation 템플릿 외부에 있 는 리소스를 식별할 수 있지만, 리소스가 생성된 후에만 가능합니다.

 

  • Resource type : 리소스 유형은 선언하려는 리소스의 유형을 식별합니다. 예를 들면 AWS::EC2::Instance는 EC2 인스턴스를 선언합니다.

 

  • 리소스 속성 : Resource 속성은 리소스에 지정할 수 있는 추가 옵션입니다. 예를 들면 각 EC2 인스턴스에 대해 해당 리소스에 대한 Amazon 머신 이미지(AMI) ID를 지정해야 합니다.

 

 

 


Outputs (선택사항)

스택의 속성을 볼 때마다 반환되는 값을 설명

 

예를 들면 S3 버킷 이름 출력을 선언하고 나서 aws cloudformation describe-stacks AWS CLI 명령을 호출하여 해당 버킷을 보다 쉽게 찾을 수 있음

 

 

  • CloudFormation은 Outputs 섹션에 포함된 정보를 삭제하거나 난독화하지 않음.
  • Outputs 을 사용하여 암호나 보안 암호와 같은 민감한 정보를 출력하지 않는 것이 좋음.
  • Outputs 섹션은 키 이름 Outputs와 그 뒤에 이어지는 공백 및 콜론 하나로 구성
  • 템플릿 안에 최대 60개 출력을 선언 가능

 

 

  • Logical ID : 현재 출력의 식별자. 논리적 ID는 영숫자(a-z, A-Z, 0-9)여야 하며 템플릿 내에서 고유

 

  • Description(선택 사항) :  출력 값을 설명하는 String. 설명 선언 값은 0 ~ 1023바이트 길이의 리터럴 문자열이어야 함. 파라미터나 함수를 사용하여 설명을 지정할 수 없습니다. 설명의 길이는 최대 4K

 

  • Value(필수) : aws cloudformation describe-stacks 명령에 의해 반환되는 속성의 값. 출력의 값에는 리터럴, 파라미터 참조, 가상 파라미터, 매핑 값 또는 내장 함수가 포함될 수 있음.

 

  • Export(선택 사항) : 교차 스택 참조를 위해 내보낼 리소스 출력의 이름, 교차 스택 참조에 적용되는 제한사항은 다음과 같음
    • 각 AWS 계정의 Export 이름은 한 리전 내에서 고유해야 합니다.
    • 여러 리전 간에 교차 스택 참조를 만들 수 없습니다. Fn::ImportValue 내장 함수는 동일
    • 리전 안에서 내보냈던 값을 가져오는 데만 사용할 수 있습니다.
    • 출력의 경우, 리소스에 의존하는 Name 또는 Export 함수를 Ref GetAtt 속성 값으로 사용할 수 없습니다.
    • 마찬가지로 ImportValue 함수는 리소스에 의존하는 Ref 또는 GetAtt 함수를 포함할 수 없습니다.
    • 다른 스택에서 출력을 참조 중인 스택은 삭제할 수 없습니다.
    • 다른 스택에서 참조하는 출력 값은 수정하거나 제거할 수 없습니다.