0부터 시작하는 AWS 공부 - Lambda

Jaehong Lee·2022년 11월 10일
3
post-thumbnail

Lambda 란

Lambda 란

AWS 에서의 lambda 는 함수를 만들어서 실행하는 것이다. 이는 서버리스 서비스이다

  • AWS 에서의 함수 이므로 AWS 의 다양한 서비스와의 연계가 가능하다
  • 함수는 Event Data 를 매개 변수로 사용하여 함수 내에 전달할 수도 있다

함수를 시작하면 AWS 는 함수가 동작할 수 있는 환경을 제공하기 위하여, Amazon linux 기반의 함수 전용 micro VM 을 생성 및 실행해준다. 이는 EC2 에서 확인 불가능한 VM 이다

  • Lambda 역시 linux OS 위에서 동작하므로, 미리 지정되어 있는 시스템 환경 변수와 사용자 변수 등을 사용할 수 있다

트리거는 입력 영역이며, 대상은 결과값에 대한 처리 영역이다

  • event 발생 -> Handler 작동 -> function 실행 -> 처리 ( Iot / www / email / sms / DB )

단, Lambda 가 무조건 저렴한 것은 아니다. 요금 체계를 반드시 확인하고, Cloudwatch 를 통해 실행 건수에 대한 모니터링이 반드시 있어야 한다


AWS 동기식 & 비동기식 서비스

AWS 의 서비스 호출시 동기식 서비스와 비동기식 서비스가 있다

동기식

  • 실행을 하여 성공과 실패를 알려준다

비동기식

  • 성공만 알려준다. 만약 실패가 발생한다면, 즉시 Fail 을 시키는 것이 아니라 다시 대기열로 보낸다
  • 보통 5 분 단위로 다시 시도하며, 최대 60 분까지 대기하고, 이후 대기열에서 삭제된다

일반적으로 AWS 의 Lambda 는 15 분 이내에 모든 처리가 마무리 되야 한다


Lambda 사용하기

함수 생성

  • 함수 생성을 클릭하자

  • 함수 이름과 런타임을 지정하자

함수 생성을 누르면 Micro VM 이 생성 및 실행되므로 시간이 소요된다


함수 Test

  • Handler 를 호출하기 위한 함수 코드를 살펴보자
  • 상태 코드는 200 은 성공, 클라이언트 잘못은 400 번대 , 서버 잘못은 500 번대이다

  • 테스트 이벤트를 생성하고, Test 를 눌러보자

  • 실행 결과 성공이라고 나온다

환경 변수

AWS Lambda 에 지정되어 있는 시스템 환경 변수

  • 구성에 들어가서 환경 변수를 클릭하자

  • 편집에 들어가면 환경 변수 추가를 할 수 있다

  • 위 두 가지 환경 변수를 추가하자

  • 잘 추가되었다

간단한 함수 작성하기

Lambda 함수 파일의 기본 구성 형태

  • import json , import os 로 시작하며
  • 함수는 def lambda_handler ( event, context ) 로 함수가 정의된다
  • 함수의 마지막은 return 으로 결과를 반환 한다

Python 을 이용하여 위에서 추가한 환경 변수를 이용하여 문자를 출력해보자

  • 위와 같이 간단한 Python 코드를 추가해주자
import os

def lambda_handler(event, context):
    what_to_print = os.environ.get("what_to_print")
    how_many_times = int(os.environ.get("how_many_times"))
    
    if what_to_print and how_many_times > 0:
        for i in range(0, how_many_times):
            print(f"what_to_print: (what_to_print)")
        return what_to_print
    return None 
  • 코드는 위와 같다

Deploy 해서 코드의 변경 사항을 적용하고, Test 를 누르자

Response
"hello from rapa"

Function Logs
START RequestId: 1a4d3734-123c-4915-a2f1-c0c7e932dfee Version: $LATEST
what_to_print: (what_to_print)
what_to_print: (what_to_print)
what_to_print: (what_to_print)
  • 결과는 위와 같이 return 값인 what_to_print 에 저장된 값이 Response 에 출력된다. Function Logs 에는 함수 실행 결과가 출력된다. 이는 how_many_times 에 지정한 수 만큼 print 문이 출력된다

Lambda & S3

Lambda & S3 - Bucket Name

  • S3 에서 버킷을 하나 생성하자

  • 생성된 버킷에 파일을 하나 업로드하자
import boto3
import json
import botocore

def lambda_handler(event,context):
    s3 = boto3.resource('s3')
    bucket_list = []
    
    for bucket in s3.buckets.all() :
        bucket_list.append(bucket.name)
        
    return json.dumps(bucket_list)
  • Lambda 에 위와 같이 bucket 의 이름을 출력해주는 함수를 작성하자. bucket 은 여러개 있을 수 있으므로 list 에 append 하여 출력한다
  • s3 자원 정보를 가져오고, s3 에서 bucket 에 대한 정보를 전부 가져온다. 가져온 bucket 정보들을 반복문을 통해 bucket 의 이름만 배열에 담아서 출력한다

허나, Deploy & Test 를 해보면 접근 권한에 대한 오류가 발생한다. 이는 Lambda 가 S3 에 접근할 수 있는 권한이 없기 때문이다

  • 구성에서 권한에 들어가자. 역할 이름을 눌러주자

  • 해당 역할에서 권한 추가를 눌러서 s3 접근을 위한 정책을 연결하자

  • 이제 s3 에 접근을 할 수 있으므로, 함수가 잘 실행된다

Lambda & S3 - 파일 내용 출력

import json
import boto3
import botocore

def lambda_handler(event, context):
    bucket_name = 'ljh1110'
    key = 'test1213.txt'
    
    s3_client = boto3.client('s3')
    
    data = s3_client.get_object(Bucket=bucket_name, Key=key)
    file_content = data['Body'].read()
    
    return json.dumps(file_content.decode('UTF-8'))
  • Bucket 이름과 파일 이름을 지정하고, client 를 s3 로 지정한다. get_object 를 통해 s3 에서 해당 Bucket 의 이름과 파일 이름에 해당하는 Data 를 가져온다. 이때 read 함수를 통해 파일의 내용을 읽어오고, 이를 decoding 하여 출력한다

  • Deploy 하고 Test 하면 잘 출력된다

Lambda & DynamoDB

테이블 생성 & 항목 추가

  • DynamoDB 에서 테이블을 생성하자

  • 만들어진 테이블에 들어가서 항목을 생성해주자

  • 항목을 생성해주자. 새 속성 추가를 통해 major 도 입력해주자

  • 두 개의 항목을 추가하자

DynamoDB & Lambda

Lambda 함수를 이용하여 DynamoDB Table 에 Data 를 추가해보자

  • dynamodb 권한을 추가해주자
import json
import boto3
from botocore.exceptions import ClientError

def put_test(yyyymmdd,name):
    dynamodb = boto3.resource("dynamodb", region_name='ap-northeast-2')
    
    try:
        response = dynamodb.Table('student').put_item(
            Item={
                "yyyymmdd": yyyymmdd,
                "name": name
            }
            
        )
    
    except ClientError as e:
        print(e.response["Error"]["Message"])
    
    else:
        return response
        
def lambda_handler(event, context):
    test_put_response = put_test("20211222", "gildong")
    return test_put_response
  • 위와 같이 작성하고, 실행하자. dynamodb 에서 table 을 지정하고, put_item 을 통해 Key 와 Value 를 지정하여 Data 를 저장한다

  • Dynamodb 에 잘 저장되었다

Lambda & API Gateway

Postman 설치


트리거 추가

  • 함수를 새로 생성하자

  • Lambda 에서 트리거를 추가하자. API Gateway 를 사용하며, API 타입은 REST API 로 지정한다

  • 생성한 트리거의 정보를 확인하자. API key 와 API endpoint 주소를 복사하자

API key 를 통한 API 접속

  • API endpoint 주소로 접속하면 접속이 불가하다. 이 API endpoint 에 접속하려면 API Key 가 필요하다

  • Postman 에서 Headers 에 x-api-key 를 추가하고, 헤딩 Key 에 대한 Value 로 API Key 값을 입력한 다음, API endpoint 주소로 접속하면 잘 접속되어 Lambda 함수가 작동한다. 따라서 밑에 Hello from Lambda 가 출력된다
profile
멋진 엔지니어가 될 때까지

0개의 댓글