BLOG

Python, AWS Lambda 및 crhelper를 사용한 AWS CloudFormation 커스텀 리소스 생성
작성일: 2019-09-19

오늘 게시 글에서는 AWS Lambda 와 Python용 사용자 지정 리소스 헬퍼 (crhelper) 프레임 워크를 사용하여 강력한 AWS CloudFormation 사용자 지정 리소스를 작성하는 방법에 대해 설명해 드리겠습니다. 먼저 이 기술과 관련된 주요 기술을 살펴보겠습니다.

 

AWS CloudFormation은 클라우드 환경의 모든 인프라 리소스를 설명하고 프로비저닝 할 수 있는 서비스입니다. AWS 클라우드 개발 키트 (CDK) 와 같은 도구를 사용하여 JSON 또는 YAML 템플릿 또는 코드로 환경을 모델링 할 수 있습니다.

 

AWS CloudFormation은 AWS Lambda 지원 사용자 지정 리소스를 통해 강력한 확장 메커니즘을 제공하므로 자체 리소스를 작성하여 AWS 리소스를 넘어 AWS CloudFormation을 확장하고 다른 리소스를 프로비저닝 할 수 있습니다. 예를 들어 타사 소프트웨어 SaaS (Software as a Service) 제품을 통합하거나 하이브리드 환경에서 온 프레미스 리소스를 프로비저닝 할 수도 있습니다. 또 다른 유용한 예로는 인프라의 속성을 변환하거나 처리하는 작업을 수행하는 유틸리티 리소스를 제공하여 AWS CloudFormation을 확장하는 것입니다.

 

커스텀 리소스는 강력하지만 어려울 수 있습니다. 또한 강력하고 모범 사례 인 리소스를 구현하려면 신호 상태, 예외 처리, 시간 초과 등과 같은 항목을 처리하기 위해 많은 유틸리티 코드를 결합하여 시행 착오를 거칠 수 있습니다.

 

모범 사례와 추상화를 구현하여 사용자 지정 리소스 작성을 지원하는 오픈 소스 프로젝트 인 crhelper를 입력하여 리소스 코드를 단순화하고 사용자 지정 리소스에서 일반적인 패턴을 구현하는 부담을 줄입니다. crhelper를 사용하여 사용자 지정 리소스를 만드는 과정을 안내합니다.

 

커스텀 리소스 만들기

두 숫자의 합을 반환하는 리소스를 모아서 시작해 봅시다. 먼저 * nix 프롬프트 (Linux의 경우 Linux, Mac 또는 Windows 서브 시스템)를 실행 중인지 확인하십시오. 셸 환경은 Python 3.5 이상과 AWS Command Line Interface (AWS CLI)로 구성 해야 합니다.

 

Lambda 소스를 배치하는 데 사용할 빈 폴더를 만듭니다. 그런 다음 pip를 사용하여 폴더에 crhelper를 설치하고 lambda_function.py리소스 코드를 넣을 파일을 만듭니다 .

 

mkdir sum_function

cd sum_function

pip install -t . crhelper

# on some systems pip may fail with a distutils error, if you run into this, try running pip with the –system argument

# pip install —system -t . crhelper

touch lambda_function.py

이제 lambda_function.py선호하는 편집기 또는 IDE (통합 개발 환경) 에서 파일을 열고 다음 코드를 lambda_function.py 파일에 넣습니다.

 

from crhelper import CfnResource

 

helper = CfnResource()

 

@helper.create

@helper.update

def sum_2_numbers(event, _):

    s = int(event[‘ResourceProperties’][‘No1’]) + int(event[‘ResourceProperties’][‘No2’])

    helper.Data[‘Sum’] = s

@helper.delete

def no_op(_, __):

    pass

 

def handler(event, context):

    helper(event, context)

코드를 살펴보면 먼저 crhelper CfnResource클래스를 가져 와서 인스턴스화 한 다음 create및 update데코레이터를 사용하여 Sum 함수를 정의합니다. 이 데코레이터는 코드에서 어떤 CloudFormation 스택 작업 (생성, 업데이트 및 삭제)에 대해 어떤 함수를 호출 해야 하는지 표시합니다. 우리는 모두 정의한 create와 update동일한 기능에, 우리는 생략 한 delete장식을. 결과적으로 Sum 함수가 이벤트 create와 update이벤트 모두에서 호출되는 반면 delete이벤트는 사용자 정의 코드를 호출하지 않고 전달됩니다. 이 경우 삭제할 기본 자원이 없기 때문입니다.

 

다음 단계에서는 기본적인 Lambda 실행 역할이 필요합니다. Lambda를 사용한 대부분의 사람들은 이미 이 역할을 만들었습니다. 그렇지 않은 경우 Lambda 설명서 의 단계에 따라 생성하십시오.

 

다음으로 코드를 패키징하고 함수를 Lambda 서비스로 푸시 하여 계정에서 Lambda 기본 실행 역할의 ARN을 ARN으로 대체하십시오.

 

zip -r ../sum.zip ./

aws lambda create-function \

    –function-name “crhelper-sum-resource” \

    –handler “lambda_function.handler” \

    –timeout 900 \

    –zip-file fileb://../sum.zip \

    –runtime python3.7 \

    –role “arn:aws:iam::123412341234:role/lambda-cli-role”

FunctionArn다음 단계에서 사용하려면 출력에서 ​​출력을 제거 해야합니다 .

 

템플릿에서 사용자 정의 리소스 테스트

이제 기본 AWS CloudFormation 템플릿을 생성하여 이를 테스트 할 수 있습니다.

 

AWSTemplateFormatVersion: “2010-09-09”

Resources:

  SumResource:

    Type: “Custom::Summer”

    Properties:

      ServiceToken: “arn:aws:lambda:us-west-2:123412341234:function:crhelper-sum-resource”

      No1: 1

      No2: 2

Outputs:

  Sum:

    Value: !GetAtt SumResource.Sum

Lambda 함수와 동일한 리전에서 AWS CloudFormation에서이 템플릿을 실행하면 Lambda 함수에 의해 계산 된 대로 출력에 값이 3 인 Sum이 출력에 포함되어 있어야 합니다. 숫자 중 하나에 잘못된 항목 (예 : 문자열)을 입력하여 템플릿을 업데이트하고 crhelper가 AWS CloudFormation에 오류를 표시하는 방법을 확인하십시오.

 

결론

이 게시물은 crhelper를 사용하여 사용자 정의 리소스를 작성하는 방법에 대한 매우 기본적인 연습을 제공하는 것을 목표로 하지만 crhelper 설명서는 보다 완벽한 사용법의 예를 제공합니다. 실제 구현을 살펴 보려면 9 개의 사용자 지정 리소스 각각에 crhelper를 사용 하는 Amazon Elastic Kubernetes Service (Amazon EKS)의 빠른 시작을 참조 하시길 바랍니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/infrastructure-and-automation/aws-cloudformation-custom-resource-creation-with-python-aws-lambda-and-crhelper/

 

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.