lambda_a
와 lambda_b
를 생성한다. (Python 언어)
import json
def lambda_handler(event, context):
print('lambda_a event 발생')
print(event)
return event
lambda_a
로 invoke한다.lambda_b
에서 테스트를 진행한다.import json
import boto3
def lambda_handler(event, context):
payload = {}
payload['hello'] = 'hi'
lan = boto3.client(service_name='lambda', region_name='ap-northeast-2') # 서비스 접근
lan.invoke(FunctionName="lambda_a", InvocationType='Event',
Payload=json.dumps(payload)) # lambda_a 함수 invoke
print(payload)
return payload
lambda_b
를 테스트하면 다음과 같이 오류가 발생한다.
Invoke를 하기 위한 role을 설정해야 한다.
[구성] > [권한] > [실행 역할] > [역할 이름] 클릭 > [정책 연결] 로 이동
이렇게 람다 실행 권한(람다 모든 권한)을 추가하자!
다시 돌아가 테스트를 진행해본다.
CloudWatch Log를 가서 lambda_a
로그를 살펴보자. 이렇게 단 몇 줄로 간단하게 lambda 함수에서 lambda 함수로 invoke를 진행했다.
과거에는 하나의 Lambda 함수에서 많은 분기처리가 진행됐다. 하지만 현재는 기능별로 Lambda 함수를 쪼개는 경우가 많다. 이에 대한 장점은 소스코드를 이해하기 쉽고, 재사용성을 높이눈 효과가 있으며, 자연스럽게 격리성이 높아진다. Lambda 함수에 대해 AWS에서 많은 업데이트를 꾸준히 진행 중이기에 활용 범위가 넓어지고 있다.
s3
의 이름으로 Lambda 함수를 생성한다.
이 함수에서는 AmazonS3FullAccess
권한을 추가한다. (위의 권한 추가 방식 참고)
hello.txt
파일을 S3에 업로드 해놓자.
import json
import boto3
import botocore
def lambda_handler(event, context):
bucket_name = 'ayo-springboot-build'
key = 'hello.txt'
s3_client = boto3.client('s3')
data = s3_client.get_object(Bucket=bucket_name, Key=key)
file_text = data['Body'].read()
return json.dumps(file_text.decode('UTF-8'))
테스트하기
먼저 DynamoDB에 테이블을 생성한다.
[항목] 탭에서 테이블을 스캔할 수 있다. 항목을 추가로 생성할 수 있고, [작업] 버튼을 클릭하여 데이터를 입력하거나 삭제하는 등의 작업을 할 수 있다.
DynamoDB를 Lambda 함수로 제어하기 위해 dynamodb-lambda
의 이름으로 Lambda 함수를 생성한다.
함수에서는 AmazonDynamoDBFullAccess
권한을 추가한다. (위의 권한 추가 방식 참고)
import json
import boto3
from botocore.exceptions import ClientError
def put_data(yyyymmdd, title, name, email):
dynamodb = boto3.resource("dynamodb", region_name="ap-northeast-2") # DynamoDB에 접근
try:
response = dynamodb.Table("lambda").put_item( # put_item으로 데이터 삽입
Item={
"yyyymmdd": yyyymmdd,
"title": title,
"info": {
"name": name,
"email": email
}
}
)
except ClientError as e:
print(e.response["Error"]["Message"])
else:
return response
def lambda_handler(event, context):
lambda_put_response = put_data(20210703, "내생일", "문아영", "ayong0310@naver.com")
return lambda_put_response
삽입한 데이터 확인하기
def update_data(yyyymmdd, title, name, email):
dynamodb = boto3.resource("dynamodb", region_name="ap-northeast-2")
try:
response = dynamodb.Table("lambda").update_item( # update_item으로 데이터 삽입
Key={"yyyymmdd": yyyymmdd, "title": title}, # 2개의 키로 Item을 가져온다.
UpdateExpression="SET info = :values",
ExpressionAttributeValues={
":values": {"name": name, "email": email}
}
)
except ClientError as e:
print(e.response["Error"]["Message"])
else:
return response
def lambda_handler(event, context):
# lambda_put_response = put_data(20210703, "내생일", "문아영", "ayong0310@naver.com")
update_resonse = update_data(20210703, "내생일", "애용이", "ayong0310@naver.com") # 이름 변경
return update_resonse
수정된 데이터 확인
해당 링크에서 API Gateway 생성하는 방법을 설명한다.
이 방법까지는 엔드 포인트가 누구나 접근이 가능한 상태이다. 인증된 사용자만 접근할 수 있도록 진행해보자.
좌측의 [사용자 계획] 탭으로 이동한다.
위와 같이 요율과 버스트 그리고 할당량을 직접 설정할 수 있다.
배포를 진행할 때 사용한 스테이지를 연결한다.마지막에 [사용자 계획 API 키]를 추가할 수 있다.
[API 키 생성 후 사용량 계획에 추가] 버튼을 누른다.
[자동 생성]을 선택하고 저장하여 API 키를 생성한다.
그 후 API 키의 이름을 클릭하여 키를 확인한다.
이제 생성한 설정 값을 메서드에 적용시키자.
메서드 화면에서 [메서드 요청] 박스의 타이틀 클릭
그 후 [API 키가 필요함]을 true
로 변경한다. 그 후, 메서드를 다시 배포한다.
[GET]으로 엔드 포인트에 접근하면 상태 값 403과 함께 에러를 확인할 수 있다.
Header에 x-api-key
라는 키의 이름으로 API 키를 담아 GET으로 접근하면 상태값 200과 함께 인증이 잘 되었음을 확인할 수 있다.
AWS Lambda로 시작하는 서버리스 책을 참고하며 작성