AWS Lambda 함수 실습 (심화)

애이용·2021년 7월 8일
1

✔️ AWS Lambda에서 AWS Lambda 실행하기

lambda_alambda_b를 생성한다. (Python 언어)

  • lambda_a
    Event를 그대로 출력하고 리턴한다.
import json

def lambda_handler(event, context):
    print('lambda_a event 발생')
    print(event)
    return event
  • lambda_b
    payload['hello']에 값을 대입한다. 그리고 그 값을 Boto3를 사용하여 lambda_a로 invoke한다.
    Boto3를 사용할 때 lambda로 명시하고 리전 명을 넣는다.
    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에서 많은 업데이트를 꾸준히 진행 중이기에 활용 범위가 넓어지고 있다.

✔️ AWS Lambda에서 Amazon S3 실행하기

s3 의 이름으로 Lambda 함수를 생성한다.
이 함수에서는 AmazonS3FullAccess 권한을 추가한다. (위의 권한 추가 방식 참고)

hello.txt 파일을 S3에 업로드 해놓자.

  • 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'))

테스트하기

✔️ AWS Lambda에서 Amazon DynamoDB 실행하기

먼저 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

수정된 데이터 확인

✔️ Amazon API Gateway로 AWS Lambda 실행하기

해당 링크에서 API Gateway 생성하는 방법을 설명한다.
이 방법까지는 엔드 포인트가 누구나 접근이 가능한 상태이다. 인증된 사용자만 접근할 수 있도록 진행해보자.
좌측의 [사용자 계획] 탭으로 이동한다.

위와 같이 요율과 버스트 그리고 할당량을 직접 설정할 수 있다.

배포를 진행할 때 사용한 스테이지를 연결한다.마지막에 [사용자 계획 API 키]를 추가할 수 있다.
[API 키 생성 후 사용량 계획에 추가] 버튼을 누른다.
[자동 생성]을 선택하고 저장하여 API 키를 생성한다.

그 후 API 키의 이름을 클릭하여 키를 확인한다.

이제 생성한 설정 값을 메서드에 적용시키자.
메서드 화면에서 [메서드 요청] 박스의 타이틀 클릭

그 후 [API 키가 필요함]을 true로 변경한다. 그 후, 메서드를 다시 배포한다.

[GET]으로 엔드 포인트에 접근하면 상태 값 403과 함께 에러를 확인할 수 있다.

Header에 x-api-key라는 키의 이름으로 API 키를 담아 GET으로 접근하면 상태값 200과 함께 인증이 잘 되었음을 확인할 수 있다.


AWS Lambda로 시작하는 서버리스 책을 참고하며 작성

profile
로그를 남기자 〰️

0개의 댓글