Amazon Web Services 한국 블로그

AWS Lambda 기반 매크로를 통한 AWS CloudFormation 확장하기

오늘은 AWS CloudFormation의 강력한 새 기능 중 하나인 매크로에 대해 설명합니다.

CloudFormation 매크로를 사용하면 AWS Lambda 기반 변환을 호출하여 CloudFormation 템플릿의 네이티브 구문을 확장할 수 있습니다. 이 변환 방식은 서버리스 애플리케이션 모델 기능을 구동하는 것과 동일한 기술이지만, 자체 계정으로 자체 Lambda 함수에서 실행되며 완벽하게 사용자 지정됩니다. CloudFormation은 AWS를 처음 사용하는 경우 코드 형식 인프라(YAML 또는 JSON)를 모델링하고 정의할 때 반드시 필요한 도구입니다. CloudFormation은 모든 AWS 서비스와 종속 서비스의 핵심 구성 요소입니다.

매크로 사용을 위한 주요 단계는 두 가지입니다. 첫째, 매크로를 정의해야 합니다. 물론 이 작업에는 CloudFormation 템플릿이 사용됩니다. 둘째, 템플릿에 생성된 매크로를 사용하려면 전체 템플릿에 대한 변환으로 추가하거나 직접 호출해야 합니다. 이 게시물에서는 매크로와 변환이라는 용어를 어느 정도 번갈아 사용합니다. 그럼, 작동 원리를 살펴보겠습니다.

CloudFormation 매크로 생성

매크로를 생성할 때는 두 가지 작업이 포함됩니다. 매크로를 정의하고 구현하는 것입니다. 매크로 정의를 생성하려면 AWS::CloudFormation::Macro 유형의 CloudFormation 리소스를 생성합니다. 이 리소스는 사용할 Lambda 함수와 호출할 매크로의 개요를 설명합니다.

Type: "AWS::CloudFormation::Macro"
Properties:
  Description: String
  FunctionName: String
  LogGroupName: String
  LogRoleARN: String
  Name: String

매크로의 Name은 리전 전체에서 고유해야 하며, FunctionName에서 참조되는 Lambda 함수는 매크로를 생성하는 리전과 동일한 리전에 있어야 합니다. 매크로 템플릿을 실행하면 다른 템플릿에서도 매크로를 사용할 수 있게 됩니다. 매크로 구현은 Lambda 함수를 통해 이행됩니다. 매크로를 자체 템플릿에 배치하거나 다른 매크로와 함께 그룹화할 수 있지만 매크로를 등록하는 동일한 템플릿에서 매크로를 사용할 수는 없습니다. Lambda 함수는 다음과 같은 JSON 페이로드를 수신합니다.

{
    "region": "us-east-1",
    "accountId": "$ACCOUNT_ID",
    "fragment": { ... },
    "transformId": "$TRANSFORM_ID",
    "params": { ... },
    "requestId": "$REQUEST_ID",
    "templateParameterValues": { ... }
}

페이로드의 fragment 부분에는 호출 템플릿에서 변환을 호출하는 방식에 따라 전체 템플릿 또는 템플릿의 관련된 조각이 포함됩니다. fragment는 항상 JSON 형식이며 템플릿이 YAML인 경우에도 마찬가지입니다.

Lambda 함수는 단순 JSON 응답을 반환합니다.

{
    "requestId": "$REQUEST_ID",
    "status": "success",
    "fragment": { ... }
}

requestId는 입력 페이로드에서 수신된 것과 동일해야 하며 status에 success(대/소문자 구분 안 함) 외의 값이 포함되는 경우 변경 세트가 생성되지 않습니다. 이제 fragment에 변환된 템플릿의 올바른 CloudFormation JSON이 포함되어야 합니다. 함수가 아무런 작업을 수행하지 않은 경우에도 함수 조각을 반환해야 최종 템플릿에 포함됩니다.

CloudFormation 매크로 사용


매크로를 사용하려면 필요한 매개 변수를 사용하여 Fn::Transform을 호출하면 됩니다. 매크로를 사용하여 전체 템플릿을 구문 분석하려는 경우에는 SAM: Transform: [Echo]에서와 같은 방법으로 템플릿의 변환 목록에 매크로를 포함합니다. 이 템플릿을 실행하면 변환이 각 매크로의 지정된 함수를 호출하고 최종 템플릿을 반환하여 변경 세트로 수집됩니다.

EchoFunction이라는 더미 Lambda 함수가 있다고 가정해 보십시오. 이 함수는 함수로 전달되는 데이터를 기록하고 조각을 변경되지 않은 상태로 반환합니다. 매크로는 다음과 같이 일반적인 CloudFormation 리소스로 정의됩니다.

EchoMacro:
  Type: "AWS::CloudFormation::Macro"
  Properties:
    FunctionName: arn:aws:lambda:us-east-1:1234567:function:EchoFunction
	Name: EchoMacro

lambda 함수에 대한 코드는 다음과 같이 단순하게 작성될 수 있습니다.

def lambda_handler(event, context):
    print(event)
    return {
        "requestId": event['requestId'],
        "status": "success",
        "fragment": event["fragment"]
    }

이 함수를 배포하고 매크로 템플릿을 실행한 후 다음과 같은 다른 모든 템플릿의 최상위 수준에서 변환의 매크로를 호출할 수 있습니다.

AWSTemplateFormatVersion: 2010-09-09 
 Transform: [EchoMacro, AWS::Serverless-2016-10-31]
 Resources:
    FancyTable:
      Type: AWS::Serverless::SimpleTable

CloudFormation 서비스는 정의된 Echo 매크로를 먼저 호출한 다음 AWS::Serverless 변환을 호출하여 템플릿에 대한 변경 세트를 생성합니다. 매크로는 변환에 나열된 순서대로 실행됩니다.

Fn::Transform 내장 함수를 사용하여 매크로를 호출할 수도 있습니다. 이 내장 함수를 사용하면 추가 매개 변수를 전달할 수 있습니다. 예를 들면 다음과 같습니다.

AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Fn::Transform:
      Name: EchoMacro
      Parameters:
        Key: Value

인라인 변환은 모든 형제 노드와 모든 하위 노드에 액세스할 수 있습니다. 변환은 가장 깊은 순서에서 얕은 순서로 처리됩니다. 즉, 최상위 수준의 변환이 마지막으로 실행됩니다. 매크로 안에는 매크로를 포함할 수 없습니다.

CloudFormation 템플릿을 실행하면 변경 세트를 생성하라는 메시지가 포함되며 배포 전에 출력을 미리 볼 수 있습니다.

예제 매크로

AWS에서는 개발자가 시작하는 데 도움이 되는 다수의 참조 매크로를 출시하고 있으며 앞으로는 다른 많은 사용자가 게시하는 매크로도 사용할 수 있을 것입니다. 다음 네 개 매크로는 이 기능을 출시하기 전에 내부에서 소규모로 열린 해커톤에서 우승한 매크로입니다.

이름 설명 작성자
PyPlate 템플릿에 인라인으로 Python 배치 가능 Jay McConnel – 파트너 SA
ShortHand 일반적인 Cloudformation 리소스에 대한 간략한 구문 정의 Steve Engledow – 솔루션 빌더
StackMetrics 스택에 Cloudwatch 지표 추가 Steve Engledow 및 Jason Gregson – 글로벌 SA
String Functions 템플릿에 일반적인 문자열 함수 추가 Jay McConnel – 파트너 SA

다음은 제가 생각해 본 몇 가지 구현 아이디어입니다.

뭔가 흥미로운 것을 구축하게 되면 Tweeter로 알려 주십시오!

지금 이용 가능

오늘부터 AWS Lambda가 제공되는 모든 AWS 리전에서 CloudFormation 매크로를 사용할 수 있습니다. 매크로는 추가 CloudFormation 요금 없이 제공되며 AWS Lambda 함수 요금만 부과됩니다. 설명서에서 보다 유용한 정보를 확인할 수 있습니다.

매크로는 제가 자주 사용하는 새로운 CloudFormation 기능 중 하나입니다. 앞으로 AWS 고객은 이 기능을 사용하여 놀라운 일을 해낼 것입니다. 이 기능의 실질적인 강점은 기존 코드 형식 인프라를 코드로 확장할 수 있다는 것입니다. 이 새로운 기능의 가능성은 거의 무한합니다.

Randall