AWS SAM과 Infrastructure Composer에서 Lambda 함수 사용하기
AWS SAM과 Infrastructure Composer에서 Lambda 함수 사용하기
이 튜토리얼에서는 기존 Lambda 함수에서 AWS SAM 템플릿을 만든 다음, 다른 AWS 리소스를 추가해 Infrastructure Composer에서 서버리스 애플리케이션을 구축하는 방식으로 Lambda와 함께 IaC를 시작할 수 있어요.
본문
이 튜토리얼을 진행하면서 AWS 리소스가 AWS SAM에서 어떻게 지정되는지 같은 기본 개념을 배우게 됩니다. 또한 AWS SAM 또는 CloudFormation으로 배포할 수 있는 서버리스 애플리케이션을 Infrastructure Composer로 구축하는 방법도 배울 수 있어요.
이 튜토리얼을 완료하려면 다음 단계를 수행합니다:
- 예시 Lambda 함수 만들기
- Lambda 콘솔로 함수의 AWS SAM 템플릿 보기
- 함수 구성을 AWS Infrastructure Composer로 내보내고, 함수 구성 기반으로 간단한 서버리스 애플리케이션 설계하기
- 서버리스 애플리케이션 배포의 기반으로 사용할 수 있는 업데이트된 AWS SAM 템플릿 저장하기
사전 조건
이 튜토리얼에서는 Infrastructure Composer의 로컬 동기화(local sync) 기능을 사용해 템플릿과 코드 파일을 로컬 빌드 머신에 저장합니다. 이 기능을 사용하려면 웹 애플리케이션이 로컬 파일 시스템에서 파일을 읽고, 쓰고, 저장할 수 있게 하는 File System Access API를 지원하는 브라우저가 필요해요. Google Chrome이나 Microsoft Edge를 사용할 것을 권장합니다. File System Access API에 대한 자세한 내용은 File System Access API란 무엇인가요?를 참고하세요.
Lambda 함수 만들기
첫 단계에서 튜토리얼의 나머지를 완료하는 데 사용할 Lambda 함수를 만듭니다. 간단하게 하기 위해 Python 3.11 런타임을 사용해 Lambda 콘솔로 기본 'Hello world' 함수를 만듭니다.
콘솔로 'Hello world' Lambda 함수 만들기
- Lambda 콘솔을 엽니다.
- Create function(함수 만들기)을 선택합니다.
- Author from scratch(처음부터 작성)를 선택한 상태로 두고, Basic information(기본 정보) 아래 Function name(함수 이름)에
LambdaIaCDemo를 입력합니다. - Runtime(런타임)에서 Python 3.11을 선택합니다.
- Create function(함수 만들기)을 선택합니다.
함수의 AWS SAM 템플릿 보기
함수 구성을 Infrastructure Composer로 내보내기 전에 Lambda 콘솔에서 함수의 현재 구성을 AWS SAM 템플릿으로 확인하세요. 이 섹션의 단계를 따라 하면 AWS SAM 템플릿의 구조(anatomy)와 Lambda 함수 같은 리소스를 정의해 서버리스 애플리케이션을 지정하는 방법을 배울 수 있어요.
함수의 AWS SAM 템플릿 보기
- Lambda 콘솔의 Functions 페이지를 엽니다.
- 방금 만든 함수(
LambdaIaCDemo)를 선택합니다. - Function overview(함수 개요) 창에서 Template(템플릿)을 선택합니다. 함수 구성을 나타내는 다이어그램 대신 함수의 AWS SAM 템플릿이 표시됩니다. 템플릿은 다음과 같아 보입니다.
함수의 YAML 템플릿을 잠시 살펴보고 몇 가지 핵심 개념을 이해해 보세요.
템플릿은 Transform: AWS::Serverless-2016-10-31 선언으로 시작합니다. 이 선언은 필수인데, 내부적으로 AWS SAM 템플릿이 CloudFormation을 통해 배포되기 때문이에요. Transform 문을 사용하면 템플릿이 AWS SAM 템플릿 파일임을 식별합니다.
Transform 선언 뒤에는 Resources 섹션이 옵니다. 여기서 AWS SAM 템플릿으로 배포하려는 AWS 리소스를 정의합니다. AWS SAM 템플릿은 AWS SAM 리소스와 CloudFormation 리소스의 조합을 포함할 수 있어요. 배포 중에 AWS SAM 템플릿은 CloudFormation 템플릿으로 확장되므로, 유효한 CloudFormation 구문이면 무엇이든 AWS SAM 템플릿에 추가할 수 있기 때문입니다.
현재 템플릿의 Resources 섹션에는 Lambda 함수 LambdaIaCDemo 하나만 정의되어 있습니다. AWS SAM 템플릿에 Lambda 함수를 추가하려면 AWS::Serverless::Function 리소스 유형을 사용합니다. Lambda 함수 리소스의 Properties는 함수의 런타임, 함수 핸들러, 기타 구성 옵션을 정의합니다. AWS SAM이 함수 배포에 사용할 함수 소스 코드 경로도 여기서 정의됩니다. AWS SAM의 Lambda 함수 리소스에 대해 더 배우려면 AWS SAM 개발자 안내서의 AWS::Serverless::Function을 참고하세요.
함수 속성과 구성 외에도 템플릿은 함수용 AWS Identity and Access Management(IAM) 정책을 지정합니다. 이 정책은 함수가 Amazon CloudWatch Logs에 로그를 쓸 권한을 부여해요. Lambda 콘솔에서 함수를 만들면 Lambda가 이 정책을 함수에 자동으로 연결합니다. AWS SAM 템플릿에서 함수용 IAM 정책을 지정하는 방법은 AWS SAM 개발자 안내서의 AWS::Serverless::Function 페이지의 policies 속성을 참고하세요.
AWS SAM 템플릿의 구조에 대해 더 배우려면 AWS SAM 템플릿 구조를 참고하세요.
AWS Infrastructure Composer로 서버리스 애플리케이션 설계하기
함수의 AWS SAM 템플릿을 출발점으로 사용해 간단한 서버리스 애플리케이션을 구축하려면 함수 구성을 Infrastructure Composer로 내보내고 Infrastructure Composer의 로컬 동기화 모드를 활성화하세요. 로컬 동기화는 함수 코드와 AWS SAM 템플릿을 로컬 빌드 머신에 자동으로 저장하고, Infrastructure Composer에서 다른 AWS 리소스를 추가할 때 저장된 템플릿을 동기화 상태로 유지합니다.
함수를 Infrastructure Composer로 내보내기
- Function Overview(함수 개요) 창에서 Export to Application Composer(Application Composer로 내보내기)를 선택합니다. 함수의 구성과 코드를 Infrastructure Composer로 내보내기 위해 Lambda는 이 데이터를 임시 저장할 Amazon S3 버킷을 계정에 만듭니다.
- 대화 상자에서 Confirm and create project(확인하고 프로젝트 만들기)를 선택해 이 버킷의 기본 이름을 수락하고 함수의 구성과 코드를 Infrastructure Composer로 내보냅니다.
- (선택 사항) Lambda가 만드는 Amazon S3 버킷의 다른 이름을 선택하려면 새 이름을 입력하고 Confirm and create project(확인하고 프로젝트 만들기)를 선택합니다. Amazon S3 버킷 이름은 전역적으로 고유해야 하며 버킷 명명 규칙을 따라야 합니다. Confirm and create project를 선택하면 Infrastructure Composer 콘솔이 열리고, 캔버스에 Lambda 함수가 표시됩니다.
- Menu(메뉴) 드롭다운에서 Activate local sync(로컬 동기화 활성화)를 선택합니다.
- 열리는 대화 상자에서 Select folder(폴더 선택)를 선택하고 로컬 빌드 머신의 폴더를 선택합니다.
- Activate를 선택해 로컬 동기화를 활성화합니다.
함수를 Infrastructure Composer로 내보내려면 특정 API 작업을 사용할 권한이 필요해요. 함수를 내보낼 수 없다면 필수 권한을 참고해 필요한 권한이 있는지 확인하세요.
참고
함수를 Infrastructure Composer로 내보낼 때 Lambda가 만드는 버킷에는 표준 Amazon S3 요금이 적용됩니다. Lambda가 버킷에 넣는 객체는 10일 후 자동으로 삭제되지만, Lambda가 버킷 자체를 삭제하지는 않습니다.
AWS 계정에 추가 요금이 부과되지 않도록, 함수를 Infrastructure Composer로 내보낸 후 버킷 삭제의 지침을 따르세요. Lambda가 만드는 Amazon S3 버킷에 대한 자세한 내용은 AWS Lambda와 AWS Infrastructure Composer 사용하기를 참고하세요.
Infrastructure Composer에서 서버리스 애플리케이션 설계하기
로컬 동기화를 활성화한 후에는 Infrastructure Composer에서 변경한 내용이 로컬 빌드 머신에 저장된 AWS SAM 템플릿에 반영됩니다. 이제 Infrastructure Composer 캔버스에 추가 AWS 리소스를 끌어다 놓아 애플리케이션을 구축할 수 있어요. 이 예시에서는 Lambda 함수의 트리거로 Amazon SQS 단순 큐를 추가하고, 함수가 데이터를 쓰는 DynamoDB 테이블도 추가합니다.
- Lambda 함수에 Amazon SQS 트리거를 추가합니다:
- Resources 팔레트의 검색 필드에
SQS를 입력합니다. - SQS Queue 리소스를 캔버스로 끌어다 Lambda 함수의 왼쪽에 배치합니다.
- Details(세부 사항)를 선택하고 Logical ID에
LambdaIaCQueue를 입력합니다. - Save(저장)을 선택합니다.
- SQS 큐 카드의 Subscription 포트를 클릭하고 Lambda 함수 카드의 왼쪽 포트로 끌어 Amazon SQS와 Lambda 리소스를 연결합니다. 두 리소스 사이에 선이 나타나면 연결이 성공한 것입니다. Infrastructure Composer는 캔버스 하단에도 두 리소스가 성공적으로 연결되었음을 알리는 메시지를 표시합니다.
- Resources 팔레트의 검색 필드에
- Lambda 함수가 데이터를 쓸 Amazon DynamoDB 테이블을 추가합니다:
- Resources 팔레트의 검색 필드에
DynamoDB를 입력합니다. - DynamoDB Table 리소스를 캔버스로 끌어다 Lambda 함수의 오른쪽에 배치합니다.
- Details(세부 사항)를 선택하고 Logical ID에
LambdaIaCTable을 입력합니다. - Save(저장)을 선택합니다.
- Lambda 함수 카드의 오른쪽 포트를 클릭하고 DynamoDB 카드의 왼쪽 포트로 끌어 DynamoDB 테이블을 Lambda 함수에 연결합니다.
- Resources 팔레트의 검색 필드에
이 추가 리소스들을 추가했으니, Infrastructure Composer가 만든 업데이트된 AWS SAM 템플릿을 살펴보세요.
업데이트된 AWS SAM 템플릿 보기
- Infrastructure Composer 캔버스에서 Template(템플릿)을 선택해 캔버스 보기에서 템플릿 보기로 전환합니다.
여러분의 AWS SAM 템플릿에는 이제 다음 추가 리소스와 속성이 포함되어야 합니다:
- 식별자
LambdaIaCQueue를 가진 Amazon SQS 큐. Infrastructure Composer로 Amazon SQS 큐를 추가하면 Infrastructure Composer가MessageRetentionPeriod속성을 설정합니다. SQS Queue 카드에서 Details를 선택하고 Fifo queue를 체크하거나 해제해FifoQueue속성도 설정할 수 있어요. 큐의 다른 속성을 설정하려면 템플릿을 수동으로 편집해 추가할 수 있습니다.AWS::SQS::Queue리소스와 사용 가능한 속성에 대해 더 배우려면 CloudFormation 사용자 안내서의 AWS::SQS::Queue를 참고하세요. - Lambda 함수 정의에 함수의 트리거로 Amazon SQS 큐를 지정하는
Events속성.Events속성은 이벤트 유형과 유형에 따라 달라지는 속성 집합으로 구성됩니다. Lambda 함수를 트리거하도록 구성할 수 있는 다양한 AWS 서비스와 설정할 수 있는 속성에 대해 배우려면 AWS SAM 개발자 안내서의 EventSource를 참고하세요. - 식별자
LambdaIaCTable을 가진 DynamoDB 테이블. Infrastructure Composer로 DynamoDB 테이블을 추가하면 DynamoDB 테이블 카드에서 Details를 선택하고 키 값을 편집해 테이블의 키를 설정할 수 있어요. Infrastructure Composer는BillingMode와StreamViewType을 포함한 여러 다른 속성의 기본값도 설정합니다. 이 속성들과 AWS SAM 템플릿에 추가할 수 있는 다른 속성에 대해 더 배우려면 CloudFormation 사용자 안내서의 AWS::DynamoDB::Table을 참고하세요. - 추가한 DynamoDB 테이블에 함수가 CRUD 작업을 수행할 수 있게 해주는 새 IAM 정책.
완전한 최종 AWS SAM 템플릿은 다음과 같아 보입니다.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Specification template describing your function.
Resources:
LambdaIaCDemo:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Description: ''
MemorySize: 128
Timeout: 3
Handler: lambda_function.lambda_handler
Runtime: python3.11
Architectures:
- x86_64
EventInvokeConfig:
MaximumEventAgeInSeconds: 21600
MaximumRetryAttempts: 2
EphemeralStorage:
Size: 512
RuntimeManagementConfig:
UpdateRuntimeOn: Auto
SnapStart:
ApplyOn: None
PackageType: Zip
Policies:
- Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
Resource: arn:aws:logs:us-east-1:594035263019:*
- Effect: Allow
Action:
- logs:CreateLogStream
- logs:PutLogEvents
Resource:
- arn:aws:logs:us-east-1:594035263019:log-group:/aws/lambda/LambdaIaCDemo:*
- DynamoDBCrudPolicy:
TableName: !Ref LambdaIaCTable
Events:
LambdaIaCQueue:
Type: SQS
Properties:
Queue: !GetAtt LambdaIaCQueue.Arn
BatchSize: 1
Environment:
Variables:
LAMBDAIACTABLE_TABLE_NAME: !Ref LambdaIaCTable
LAMBDAIACTABLE_TABLE_ARN: !GetAtt LambdaIaCTable.Arn
LambdaIaCQueue:
Type: AWS::SQS::Queue
Properties:
MessageRetentionPeriod: 345600
LambdaIaCTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: id
KeyType: HASH
StreamSpecification:
StreamViewType: NEW_AND_OLD_IMAGES
AWS SAM으로 서버리스 애플리케이션 배포하기 (선택 사항)
Infrastructure Composer에서 방금 만든 템플릿을 사용해 AWS SAM으로 서버리스 애플리케이션을 배포하려면 먼저 AWS SAM CLI를 설치해야 해요. 이를 위해 AWS SAM CLI 설치의 지침을 따르세요.
애플리케이션을 배포하기 전에 Infrastructure Composer가 템플릿과 함께 저장한 함수 코드도 업데이트해야 합니다. 현재 Infrastructure Composer가 저장한 lambda_function.py 파일에는 함수를 만들 때 Lambda가 제공한 기본 'Hello world' 코드만 들어 있습니다.
함수 코드를 업데이트하려면 다음 코드를 복사해 Infrastructure Composer가 로컬 빌드 머신에 저장한 lambda_function.py 파일에 붙여넣으세요. Infrastructure Composer가 이 파일을 저장할 디렉토리를 Local Sync 모드를 활성화할 때 지정했어요.
이 코드는 Infrastructure Composer에서 만든 Amazon SQS 큐의 메시지에서 키-값 쌍을 받습니다. 키와 값이 모두 문자열이면 코드는 그 값들을 사용해 템플릿에 정의된 DynamoDB 테이블에 항목을 씁니다.
서버리스 애플리케이션 배포하기
AWS SAM CLI로 애플리케이션을 배포하려면 다음 단계를 수행하세요. 함수가 올바르게 빌드되고 배포되려면 빌드 머신과 PATH에 Python 버전 3.11이 설치되어 있어야 해요.
- Infrastructure Composer가
template.yaml과lambda_function.py파일을 저장한 디렉토리에서 다음 명령을 실행합니다. 이 명령은 애플리케이션의 빌드 아티팩트를 수집해 배포할 수 있는 적절한 형식과 위치에 배치합니다. - 애플리케이션을 배포하고 AWS SAM 템플릿에 지정된 Lambda, Amazon SQS, DynamoDB 리소스를 만들려면 다음 명령을 실행합니다.
--guided플래그를 사용하면 AWS SAM이 배포 과정을 안내하는 프롬프트를 표시합니다. 이 배포에서는 Enter 키를 눌러 기본 옵션을 수락하세요.
배포 과정에서 AWS SAM은 AWS 계정에 다음 리소스를 만듭니다:
- 이름이
sam-app인 CloudFormation 스택(stack) - 이름 형식이
sam-app-LambdaIaCDemo-99VXPpYQVv1M인 Lambda 함수 - 이름 형식이
sam-app-LambdaIaCQueue-xL87VeKsGiIo인 Amazon SQS 큐 - 이름 형식이
sam-app-LambdaIaCTable-CN0S66C0VLNV인 DynamoDB 테이블
AWS SAM은 Lambda 함수가 Amazon SQS 큐에서 메시지를 읽고 DynamoDB 테이블에서 CRUD 작업을 수행할 수 있도록 필요한 IAM 역할과 정책도 만듭니다.
배포한 애플리케이션 테스트하기 (선택 사항)
서버리스 애플리케이션이 제대로 배포되었는지 확인하려면 키-값 쌍이 포함된 메시지를 Amazon SQS 큐로 보내고, Lambda가 그 값들을 사용해 DynamoDB 테이블에 항목을 쓰는지 확인하세요.
서버리스 애플리케이션 테스트하기
- Amazon SQS 콘솔의 Queues 페이지를 열고 AWS SAM이 템플릿에서 만든 큐를 선택합니다. 이름 형식은
sam-app-LambdaIaCQueue-xL87VeKsGiIo입니다. - Send and receive messages(메시지 보내기 및 받기)를 선택하고, Send message(메시지 보내기) 섹션의 Message body(메시지 본문)에 다음 JSON을 붙여넣습니다.
- Send message(메시지 보내기)를 선택합니다. 큐로 메시지를 보내면 Lambda가 AWS SAM 템플릿에 정의된 이벤트 소스 매핑을 통해 함수를 호출합니다. Lambda가 예상대로 함수를 호출했는지 확인하려면 DynamoDB 테이블에 항목이 추가되었는지 확인하세요.
- DynamoDB 콘솔의 Tables 페이지를 열고 테이블을 선택합니다. 이름 형식은
sam-app-LambdaIaCTable-CN0S66C0VLNV입니다. - Explore table items(테이블 항목 탐색)을 선택합니다. Items returned(반환된 항목) 창에서
id가myKey이고 Value가myValue인 항목이 보여야 합니다.