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
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 하여 출력한다
Lambda & DynamoDB
테이블 생성 & 항목 추가
- 항목을 생성해주자. 새 속성 추가를 통해 major 도 입력해주자
DynamoDB & Lambda
Lambda 함수를 이용하여 DynamoDB Table 에 Data 를 추가해보자
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 를 저장한다
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 가 출력된다