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 |
다음은 제가 생각해 본 몇 가지 구현 아이디어입니다.
- 자동 R53 도메인 등록 + AWS Certificate Manager(ACM) 인증서 프로비저닝
- 자동 S3 정적 웹 사이트 또는 Amazon CloudFront 사용자 지정 도메인 배포
- DynamoDB 테이블을 읽도록 CloudFormation 매핑 확장
- Amazon Virtual Private Cloud에 대한 자동 IPv6 설정
- Slack, Twitter, Messenger 통합을 위한 자동 Webhook 구독
뭔가 흥미로운 것을 구축하게 되면 Tweeter로 알려 주십시오!
지금 이용 가능
오늘부터 AWS Lambda가 제공되는 모든 AWS 리전에서 CloudFormation 매크로를 사용할 수 있습니다. 매크로는 추가 CloudFormation 요금 없이 제공되며 AWS Lambda 함수 요금만 부과됩니다. 설명서에서 보다 유용한 정보를 확인할 수 있습니다.
매크로는 제가 자주 사용하는 새로운 CloudFormation 기능 중 하나입니다. 앞으로 AWS 고객은 이 기능을 사용하여 놀라운 일을 해낼 것입니다. 이 기능의 실질적인 강점은 기존 코드 형식 인프라를 코드로 확장할 수 있다는 것입니다. 이 새로운 기능의 가능성은 거의 무한합니다.
– Randall