본문 바로가기

Cloud/AWS

[AWS] Lambda로 이벤트 중심 개발

#Amazon #아마존 #S3 #Simple Storage Service #Amazon S3 #Lambda #Amazon Lambda #서버리스 컴퓨팅 

 

 

AWS Lambda와 서버리스 컴퓨팅

Lambda는 AWS의 대표적인 서버리스 컴퓨팅 서비스입니다.

서버리스 컴퓨팅이랑 서버를 생각하지 않고 App을 빌드 및 배포할 수 있습니다.

사용자가 서버를 프로비저닝, 확장, 관리할 필요가 없고 App을 실행하고 확장하는 데 필요한 모든것이 고가용성으로 자동화 처리가 됩니다.

우리는 이제 더 많은 시간을 비즈니스에 집중할 수 있습니다.

 

□ AWS Lambda의 사용

  • 자체 코드 사용 가능
    • Node.js, Java, Python, .NET, Go, Ruby 등
    • 사용자 정의 런타임 및 자체 라이브러리 사용 가능
  • 단순한 리소스 모델 : 128Mb ~ 3Gb의 용량 선택에 따라 CPU 및 네트워크가 비례적으로 할당됨
  • 유연한 사용 : 동기식 또는 비동기식으로 다른 AWS 서비스와 통합됨
  • 유연한 권한 부여 : 안전하게 리소스 및 VPC에 대한 Access 권한 부여
  • 함수 작성
    • WYSIWYG 편집기 또는 ZIP 아카이브 업로드
    • AWS Cloud9 또는 타사 IDE Plug-in
  • 다양한 모니터링 및 로깅 지원 : AWS CloudWatch, AWS X-Ray 등
  • 프로그래밍 모델
    • 프로세스, 스레드, /tmp, 소켓 사용
    • Python 및 Node.js로 구축된 AWS SDK
  • 상태 비저장 : 외부 스토리지(S3, DynomoDB등)를 사용하여 데이터 유지

AWS Lambda를 활용한 아키텍트

 

입력 버킷 만들기

 AWS Management Console에 접속하여 S3 서비스에 접속한다.

Create bucket을 선택하고 버킷의 이름을 설정하고 나머지는 Default값을 유지한 다음 Create bucket을 클릭하여 버킷을 생성한다.

이때 주의해야할 점은 bucket의 region이 잘 선택되어있는지 확인해야합니다.
Bucket의 Region과 Lambda의 Region이 동일한 위치에 생성이 되어야합니다.

 

 

AWS IAM Role 역할 검토

우리가 만들 프로젝트는 S3 버킷에 파일이 들어오면 Lambda가 버킷의 정보를 읽고 등록된 함수를 수행하는 것이다.

그렇기 때문에 아래의 2가지 Policy를 Role에 등록하고 Lambda의 역할로 등록해 주어야 한다.

  • AmazonS3ReadOnlyAccess
  • AWSLambdaBasicExecutionRole

 

 

AWS Lamba 함수를 만들기

AWS Management Console에서 Lambda Service를 선택한다.

Create function을 클릭하여 function을 생성해 보자.

주의할 점은 오른쪽 상단의 Region을 S3 버킷과 동일하게 선택했는지 확인한다.
  • Author from scratch
  • Function Name 지정
  • Runtime : Java 11 (Cerretto)
  • Permisstions
    • Execution role: Use an existing role
    • Existing role: lambda_execution_role (IAM에서 생성한 Role)

Create function을 선택하여 Lambda 함수를 생성한다.

Java 실행을 위한 Runntime Setting을 설정해 줍니다.

자세한 내용은 Lambda 함수 핸들러 Guide를 참고해주세요.

 

Lambda Trigger 셋팅

Lambda Service의 Function Overview 화면에서 "+Add trigger" 메뉴를 선택합니다.

Trigger configuration 아래에 Select a trigger ▼ 드롭다운 메뉴에서 S3를 선택하고 다음 설정을 입력합니다.

Buckt : 위에서 생성한 Bucket name
Event type : All object create events

 

 

Lambda 함수를 로컬 빌드 후 배포

Function은 Lambda Service에서 S3Event와 Context를 맵핑하여 호출을 한다.

 

AWS S3의 bucket name과 key값을 읽어온 다음 bucket에 있는 object contents를 읽어온다.

 

AmazonS3 s3 = AmazonS3ClientBuilder.standard().build();

// Get the object from the event and show its content type
String bucket = event.getRecords().get(0).getS3().getBucket().getName();
String key = event.getRecords().get(0).getS3().getObject().getKey();

// Get the object contents
S3Object object = s3.getObject(new GetObjectRequest(bucket, key));
S3 Object의 Content정보를 가져오기 위해서는 "object.getObjectContent()" 메서드를 사용한다.

 

Lambda 함수를 패키징 하기 위해 Maven install을 하여 jar파일을 생성합니다.

java 프로젝트  컨텍스트 메뉴를 열고 Run As > Maven install을 선택

target 폴더에 calculator-1.0.0.jar 파일이 생성된 것을 확인할 수 있습니다.

target 폴더 마우스 우클릭 > Show in > Terminal을 선택합니다.

AWS CLI 명령어를 통하여 배포합니다.

aws lambda update-function-code --function-name JavaCalculator --zip-file fileb://calculator-1.0.0.jar

 

S3 Bucket에 파일을 업로드하고 CloudWatch로 로그를 확인해보자

AWS S3 Service에 접속하여 내가 생성한 bucket name을 클릭한다.

Objects 화면에 "Upload"를 선택하고 파일을 업로드 한다.

AWS CloudWatch Service에 접속한 후 왼쪽 메뉴의 Logs > Log groups 메뉴를 선택한다.

lambda/JavaCalculator log group name을 클릭하면 Log stream을 list를 확인할 수 있습니다.

Log stream의 event name을 클릭하면 상세 log를 확인할 수 있습니다.

 

 

마무리

AWS 서버리스 컴퓨팅의 대표적인 서비스 Lambda를 활용하여 간단한 함수형 서비스를 구축해 보았습니다.

Lambda trigger를 S3 Service로 지정하여 S3 Bucket에 Event가 발생하면 Lambda가 수행하는 간단한 서비스 입니다.

AWS Lambda는 다양한 실행 모델이 있습니다.

ㆍ동기식 : API Gateway를 통하여 Lambda 함수를 호출하고 API Gateway를 통하여 결과를 반환한다.
ㆍ비동기식 : Lambda 함수가 정해진 이벤트에 의해 실행이 되고 결과를 SNS, S3등에 저장한다.
ㆍ스트림 기반 : DynamoDB, Kinesis등 변경 사항이 발생하면 Lambda 함수를 호출한다.

AWS Lambdaa 실행모델

이외에 푸시 이벤트 모델, 풀 이벤트 모델, 직접 호출, 실행 권한, 호출 권한, 함수 예약 등 다향한 방법으로 서버리스 컴퓨팅을 구축할 수 있습니다.