AWS Lambda용 빈 함수 샘플 애플리케이션 - AWS Lambda

AWS Lambda용 빈 함수 샘플 애플리케이션

빈 함수 샘플 애플리케이션은 Lambda API를 호출하는 함수와 함께 Lambda의 일반적인 작업을 보여줍니다. 그리고 로깅, 환경 변수, AWS X-Ray 추적, 계층, 단위 테스트 및 AWS SDK를 사용하는 방법을 보여줍니다. 이 애플리케이션을 탐색하여 프로그래밍 언어로 Lambda 함수를 빌드하는 방법을 배우거나 애플리케이션을 자체 프로젝트의 시작점으로 사용하십시오.


      빈 함수 샘플 애플리케이션 아키텍처.

이 샘플 애플리케이션의 변형은 다음 언어에 사용할 수 있습니다.

변형

이 주제의 예제에서는 Node.js 버전의 코드를 강조하지만 세부 정보는 일반적으로 모든 변형에 적용됩니다.

AWS CLI와 AWS CloudFormation를 사용하여 단 몇 분 내에 샘플을 배포할 수 있습니다. README의 지침에 따라 샘플을 다운로드하고 구성하여 해당 계정에 배포하십시오.

아키텍처 및 핸들러 코드

샘플 애플리케이션은 함수 코드, AWS CloudFormation 템플릿 및 지원 리소스로 구성됩니다. 샘플을 배포할 때 다음 AWS 서비스를 사용합니다.

  • AWS Lambda – 함수 코드를 실행하여 CloudWatch Logs로 전송하고 추적 데이터를 X-Ray로 전송합니다. 또한 이 함수는 Lambda API를 호출하여 현재 리전의 계정 할당량 및 사용량에 대한 세부 정보를 가져옵니다.

  • AWS X-Ray – 추적 데이터를 수집하고, 검색을 위해 추적을 인덱스화하고, 서비스 맵을 생성합니다.

  • Amazon CloudWatch – 로그 및 지표를 저장합니다.

  • AWS Identity and Access Management(IAM) – 권한을 부여합니다.

  • Amazon Simple Storage Service(Amazon S3) – 배포 중에 함수의 배포 패키지를 저장합니다.

  • AWS CloudFormation – 애플리케이션 리소스를 생성하고 함수 코드를 배포합니다.

각 서비스마다 표준 요금이 적용됩니다. 자세한 내용은 AWS 요금을 참조하세요.

함수 코드는 이벤트를 처리하기 위한 기본 워크플로우를 보여줍니다. 핸들러는 Amazon Simple Queue Service(Amazon SQS) 이벤트를 입력으로 받아 해당 이벤트에 포함된 레코드를 반복하여 각 메시지의 내용을 기록합니다. 이때 이벤트 콘텐츠, 컨텍스트 객체 및 환경 변수를 기록합니다. 그런 다음 AWS SDK를 호출하고 응답을 Lambda 런타임에 다시 전달합니다.

blank-nodejs/function/index.js – 핸들러 코드

// Handler exports.handler = async function(event, context) { event.Records.forEach(record => { console.log(record.body) }) console.log('## ENVIRONMENT VARIABLES: ' + serialize(process.env)) console.log('## CONTEXT: ' + serialize(context)) console.log('## EVENT: ' + serialize(event)) return getAccountSettings() } // Use SDK client var getAccountSettings = function(){ return lambda.getAccountSettings().promise() } var serialize = function(object) { return JSON.stringify(object, null, 2) }

핸들러의 입력/출력 유형 및 비동기 프로그래밍에 대한 지원은 런타임마다 다릅니다. 이 예제에서 핸들러 메서드는 async이므로 Node.js에서는 promise를 런타임에 반환해야 한다는 것을 의미합니다. Lambda 런타임은 promise가 해결될 때까지 기다린 다음 호출자에게 응답을 반환합니다. 함수 코드 또는 AWS SDK 클라이언트가 오류를 반환하면 런타임은 오류를 JSON 문서로 형식 지정하고 반환합니다.

샘플 애플리케이션에는 이벤트를 보내는 Amazon SQS 대기열이 포함되지 않지만 Amazon SQS(event.json)의 이벤트를 사용하여 이벤트가 처리되는 방법을 보여줍니다. 애플리케이션에 Amazon SQS 대기열을 추가하려면 Using AWS Lambda with Amazon SQS 단원을 참조하십시오.

AWS CloudFormation 및 AWS CLI를 사용한 배포 자동화

샘플 애플리케이션의 리소스는 AWS CloudFormation 템플릿에 정의되고 AWS CLI와 함께 배포됩니다. 이 프로젝트에는 애플리케이션을 설정, 배포, 호출 및 삭제하는 프로세스를 자동화하는 간단한 셸 스크립트가 포함되어 있습니다.


        빈 애플리케이션 스택 및 지원 리소스.

이 애플리케이션 템플릿은 AWS Serverless Application Model(AWS SAM) 리소스 유형을 사용하여 모델을 정의합니다. AWS SAM은 실행 역할, API 및 기타 리소스의 정의를 자동화하여 서버리스 애플리케이션에 대한 템플릿 작성을 단순화합니다.

템플릿은 애플리케이션 스택 리소스를 정의합니다. 여기에는 함수, 실행 역할 및 함수의 라이브러리 종속성을 제공하는 Lambda 계층이 포함됩니다. 스택에는 배포 또는 CloudWatch Logs 로그 그룹 중에 AWS CLI에서 사용하는 버킷이 포함되지 않습니다.

blank-nodejs/template.yml – 서버리스 리소스

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x

애플리케이션을 배포할 때 AWS CloudFormation은 AWS SAM 변환을 템플릿에 적용하여 AWS::Lambda::FunctionAWS::IAM::Role과 같은 표준 유형의 AWS CloudFormation 템플릿을 생성합니다.

예 처리된 템플릿

{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "An AWS Lambda application that calls the Lambda API.", "Resources": { "function": { "Type": "AWS::Lambda::Function", "Properties": { "Layers": [ { "Ref": "libs32xmpl61b2" } ], "TracingConfig": { "Mode": "Active" }, "Code": { "S3Bucket": "lambda-artifacts-6b000xmpl1e9bf2a", "S3Key": "3d3axmpl473d249d039d2d7a37512db3" }, "Description": "Call the AWS Lambda API", "Tags": [ { "Value": "SAM", "Key": "lambda:createdBy" } ],

이 예제에서 Code 속성은 Amazon S3 버킷의 객체를 지정합니다. 이는 프로젝트 템플릿의 CodeUri 속성에 있는 로컬 경로에 해당합니다.

CodeUri: function/.

프로젝트 파일을 Amazon S3에 업로드하기 위해 배포 스크립트는 AWS CLI의 명령을 사용합니다. cloudformation package 명령은 템플릿을 사전 처리하고, 아티팩트를 업로드하고, 로컬 경로를 Amazon S3 객체 위치로 바꿉니다. cloudformation deploy 명령은 처리된 템플릿을 AWS CloudFormation 변경 세트와 함께 배포합니다.

blank-nodejs/3-deploy.sh – 패키지 및 배포

#!/bin/bash set -eo pipefail ARTIFACT_BUCKET=$(cat bucket-name.txt) aws cloudformation package --template-file template.yml --s3-bucket $ARTIFACT_BUCKET --output-template-file out.yml aws cloudformation deploy --template-file out.yml --stack-name blank-nodejs --capabilities CAPABILITY_NAMED_IAM

이 스크립트를 처음 실행하면 blank-nodejs라는 AWS CloudFormation 스택이 생성됩니다. 함수 코드 또는 템플릿을 변경한 경우 다시 실행하여 스택을 업데이트할 수 있습니다.

정리 스크립트(blank-nodejs/5-cleanup.sh)는 스택을 삭제하고 선택적으로 배포 버킷 및 함수 로그를 삭제합니다.

AWS X-Ray를 사용한 계측

샘플 함수는 AWS X-Ray를 사용한 추적용으로 구성되어 있습니다. 추적 모드가 활성으로 설정된 상태에서 Lambda는 호출의 하위 집합에 대한 타이밍 정보를 기록하고 X-Ray로 보냅니다. X-Ray는 데이터를 처리하여 한 개의 클라이언트 노드와 두 개의 서비스 노드를 표시하는 서비스 맵을 생성합니다.


        활성 추적이 있는 함수에 대한 서비스 맵

첫 번째 서비스 노드(AWS::Lambda)는 호출 요청을 검증하고 해당 요청을 함수에 전송하는 Lambda 서비스를 나타냅니다. 두 번째 노드 AWS::Lambda::Function은 함수 자체를 나타냅니다.

추가 세부 정보를 기록하기 위해 샘플 함수는 X-Ray SDK를 사용합니다. X-Ray SDK는 함수 코드를 최소한으로 변경하면서 AWS SDK에서 AWS 서비스에 대한 호출에 대한 세부 정보를 기록합니다.

blank-nodejs/function/index.js – 계측

const AWSXRay = require('aws-xray-sdk-core') const AWS = AWSXRay.captureAWS(require('aws-sdk')) // Create client outside of handler to reuse const lambda = new AWS.Lambda()

AWS SDK 클라이언트를 계측하면 서비스 맵에 노드가 추가되고 추적에 대한 자세한 내용이 추가됩니다. 이 예제에서 서비스 맵은 현재 리전의 스토리지 및 동시성 사용에 대한 세부 정보를 얻기 위해 Lambda API를 호출하는 샘플 함수를 보여줍니다.


        X-Ray SDK를 사용한 함수에 대한 서비스 맵

추적은 함수 초기화, 호출 및 오버헤드에 대한 하위 세그먼트와 함께 호출에 대한 타이밍 세부 정보를 보여줍니다. 호출 하위 세그먼트에는 GetAccountSettings API 작업에 대한 AWS SDK 호출의 하위 세그먼트가 있습니다.


        X-Ray SDK를 사용하는 함수에 대한 추적

X-Ray SDK 및 기타 라이브러리를 함수의 배포 패키지에 포함하거나 Lambda 계층에 별도로 배포할 수 있습니다. Node.js, Ruby 및 Python의 경우 Lambda 런타임은 실행 환경의 AWS SDK를 포함합니다.

계층을 사용한 종속성 관리

라이브러리를 로컬로 설치하고 Lambda에 업로드하는 배포 패키지에 포함시킬 수 있지만 단점이 있습니다. 파일 크기가 클수록 배포 시간이 늘어나고 Lambda 콘솔에서 함수 코드의 변경 사항을 테스트하지 못할 수 있습니다. 배포 패키지를 작게 유지하고 변경되지 않은 종속성 업로드를 방지하기 위해 샘플 앱은 Lambda 계층을 생성하고 해당 계층을 함수와 연결합니다.

blank-nodejs/template.yml – 종속성 계층

Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x

2-build-layer.sh 스크립트는 npm과 함께 함수의 종속성을 설치하고 Lambda 런타임에 필요한 구조와 함께 폴더에 배치합니다.

2-build-layer.sh – 계층 준비

#!/bin/bash set -eo pipefail mkdir -p lib/nodejs rm -rf node_modules lib/nodejs/node_modules npm install --production mv node_modules lib/nodejs/

샘플 애플리케이션을 처음 배포하면 AWS CLI가 함수 코드와 별도로 계층을 패키지하고 둘 다 배포합니다. 후속 배포의 경우 lib 폴더 콘텐츠가 변경된 경우에는 계층 아카이브만 업로드됩니다.