Amazon Web Services 한국 블로그

AWS CloudFormation- YAML 포맷 지원, 상호 스택 참조 및 문자열 대체 기능 출시

AWS CloudFormation은 AWS 내 리소스 및 전체 인프라 스택을 템플릿 코드를 통해 작성 및 선언할 수 있습니다. 전체 스택을 정의하고, 각 자원 간의 상호 관계를 지정한 후, AWS에서 바로 프로비저닝을 하여 새로운 구성을 만들 수 있습니다. AWS CloudFormation의 애플리케이션 실행에 필요한 AWS 리소스는 물론 기타 관련 종속성 또는 런타임 파라미터를 추가할 수도 있습니다.

이러한 기능에 더해서 오늘 추가적으로 몇 가지 기능을 선보이게 되었습니다.

  • YAML 포맷 지원 – CloudFormation 템플릿을 YAML로 기술 가능
  • 상호 스택 참조 – 기존 스택에서 값을 내보내 다른 스택에서 사용 가능
  • 손쉬운 문자열 대체 – 템플릿 내 문자열 대체를 쉽게 가능

한 가지씩 살펴 보도록 하겠습니다.

YAML 포맷 지원
CloudFormation 템플릿을 YAML (YAML Ain’t Markup Language)로 정의할 수 있습니다. 지금까지는 JSON을 통해 템플릿을 작성하였습니다. YAML과 JSON의 표현력은 동일하지만 YAML은 사람이 좀 더 읽기 쉬운 형식으로 설계 되어 있습니다. 반면, JSON은 (솔직히) 그렇지 않습니다. YAML 기반 템플릿에서는 구두점의 사용이 적고, 값을 정의하거나 읽기가 매우 쉽습니다. 또한, 필요한 주석을 사용하는 것도 가능합니다. CloudFormation은 해시 조인, 알리아스 및 태그 등(바이너리, imap, 페어, TIMESTAMP 등)의 몇 가지 예외를 제외하고는 실질적으로 모든 YAML을 지원합니다.

YAML에서 CloudFormation 템플릿을 작성할 때 같은 최상위 구조(Description, Metadata, Mappings, Outputs, Parameters, ConditionsResources)를 사용합니다. 아래는 이러한 매개 변수 정의 예제를 보여줍니다.

YAML
Parameters:
  DBName:
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: must begin with a letter and contain only alphanumeric
      characters.
    Default: wordpressdb
    Description: The WordPress database name
    MaxLength: '64'
    MinLength: '1'
    Type: String

YAML을 사용하면 생략된 새로운 구문을 사용하여 CloudFormation 함수를 참조 할 수 있습니다. 예를 들어, GetAtt, Base64FindInMap 등입니다. 기존 문법 ("Fn::GetAtt") 또는 새로운 태그 기반의 문법 (!GetAtt)을 사용할 수 있습니다. “!”는 태그를 위한 YAML 문법의 일부이며, 논리적인 “NOT” 연산자가 아니라는 점에 유의하십시오. 여기 과거의 문법입니다.

YAML
- Fn::FindInMap:
    - AWSInstanceType2Arch
    - Ref: InstanceType
    - Arch

새로운 문법은 아래와 같습니다.

YAML
!FindInMap [AWSInstanceType2Arch, !Ref InstanceType, Arch]

위에서 보시다시피 새로운 문법은 더 짧고 간결합니다. 그러나, 두 개의 태그를 인접하여 사용할 수 없음에 주의하세요. 오히려 두 양식을 섞어 중첩 할 수 있습니다. 예를 들어 !Base64 !Sub는 안되지만, !Base64 Fn::Sub는 유효합니다.

CloudFormation API 함수 (CreateChangeSet, CreateStack, UpdateStack 등)에서는 JSON 또는 YAML에서 템플릿을 사용할 수 있습니다. GetTemplate 함수는 원래 형식으로 템플릿을 반환합니다. 그리고, CloudFormation designer는 현재는 YAML 템플릿은 지원되지 않지만 향후 로드맵에 포함되어 있습니다.

상호 스택 참조
많은 AWS 고객은 하나의 “시스템” 스택을 사용하여 환경(VPC, VPC 서브넷, 보안 그룹, IP 주소 등)을 설정하고, 기타 여러 “응용 프로그램”스택을 사용하여 추가 자원(EC2 및 RDS 인스턴스, 메시지 큐 등)을 넣는 경우가 많습니다. 지금까지 애플리케이션 스택에서 시스템 스택에 의해 생성 된 리소스를 참조하는 방법이 간단하지 않았습니다.

한 가지 스택에서 만들어 낸 값을 얻어오기 위해 사용자 정의로 별도 자원을 작성하는 수고 없이도 다른 스택에서 사용할 수 있습니다. 첫번째 스택은 다음과 같이 값을 내보냅니다.

YAML
Outputs: 
  TSSG: 
    Value: !Ref TroubleShootingSG
    Export:
      Name: AccountSG

다른 스택에서는 새로운 ImportValue 함수를 사용하여 볼 수 있습니다.

YAML
EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    SecurityGroups:
      - !ImportValue AccountSG

내보내기 한 이름은 각 AWS 계정 및 리전에서 고유값이어야 합니다. 다른 스택에서 참조한 스택은 삭제할 수 없고, 값을 수정하거나 제거할 수 없습니다.

손쉬운 문자열 대체
대다수 CloudFormation 템플릿은 커맨드 라인, 파일 경로 및 스택이 생성 될 때까지 결정할 수 없는 다른 값 등을 만들기 위해 복잡한 문자열 처리를 하고 있습니다. 지금까지는 이 작업을 위해 fn::Join을 사용 해야 했습니다. 따라서, JSON 문법과 결합되면 이해하기 어렵고 관리도 쉽지않는 복잡한 템플릿이 만들어 집니다. 이를 단순화하기 위해, 우리는 새로운 대체 함수 인 fn::Sub를 만들었습니다. 이 함수는 변수(${variable_name}로 표시)를 원하는 값으로 대체합니다. 아래의 예를 참조하십시오.

YAML
configure_wordpress:
  commands:
    01_set_mysql_root_password:
      command: !Sub | mysqladmin -u root password '${DBRootPassword}'
      test: !Sub | $(mysql ${DBName} -u root --password='${DBRootPassword}' >/dev/null 2>&1 </dev/null); (( $? != 0 ))
    02_create_database:
      command: !Sub | mysql -u root --password='${DBRootPassword}' < /tmp/setup.mysql
      test: !Sub | $(mysql ${DBName} -u root --password='${DBRootPassword}' >/dev/null 2>&1 </dev/null); (( $? !=0))

${}${variable}를 만들 필요가 있을 때, ${!}${!variable}로 쓰면 됩니다.

추가적으로 AWS Key Management Service (KMS), EC2 Spot Fleet, 및 Amazon EC2 Container Service 지원도 새로 추가되었습니다. 더 자세한 것은 CloudFormation 출시 기록을 참고하시기 바랍니다.

정식 출시
새 기능은 오늘 부터 모든 리전에서 하용 가능합니다.

AWS CloudFormation에 대해 관심이 있으시다면, 다가오는 AWS Infrastructure as Code 온라인 세미나(영어로 진행)에 참여해 보시기 바랍니다. 인프라를 코드로 작성하는 이점 및 모범 사례, 실전 방법 등을 배우실 수 있습니다.

Jeff;

이 글은 AWS CloudFormation Update – YAML, Cross-Stack References, Simplified Substitution의 한국어 번역입니다.