AWS Lambda

Lim seung hyun·2023년 9월 4일

AWS

목록 보기
1/2

Aws lambda란

AWS Lambda은 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다.

Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 Lambda가 지원하는 언어 런타임 중 하나로 코드를 제공하기만 하면 됩니다.

Lambda 함수에 코드를 구성합니다. Lambda 서비스는 필요할 때만 함수를 실행하고 자동으로 확장됩니다.

언제 쓰면 좋을까?

  • 경량화 된 서버에서 필요한 로직만을 수행할 때
  • 스케일 아웃이 되는 고가용성 서버를 편리하게 구성하고 싶을 때

AWS 측에서 추천하는 사용하기 좋은 때

  • 파일 처리: 업로드 후 Amazon Simple Storage Service(S3)를 사용하여 Lambda 데이터 처리를 실시간으로 트리거합니다.

  • 스트림 처리: Lambda 및 Amazon Kinesis를 사용하여 애플리케이션 작업 추적, 거래 주문 처리, 클릭스트림 분석, 데이터 정리, 로그 필터링, 인덱싱, 소셜 미디어 분석, 사물 인터넷(IoT) 디바이스 데이터 텔레메트리 및 계측을 위한 실시간 스트리밍 데이터를 처리합니다.

  • 웹 애플리케이션: Lambda를 다른 AWS 서비스와 결합하여 여러 데이터 센터에서 고가용성 구성으로 자동으로 스케일 업/스케일 다운되고 실행되는 강력한 웹 애플리케이션을 빌드합니다.

  • IoT 백엔드: Lambda를 사용하여 서버리스 백엔드를 구축함으로써 웹, 모바일, IoT 및 서드 파티 API 요청을 처리합니다.

  • 모바일 백엔드: Lambda 및 Amazon API Gateway를 사용하여 백엔드를 구축함으로써 API 요청을 인증하고 처리합니다. AWS Amplify를 사용하여 iOS, Android, 웹 및 React Native 프론트엔드와 손쉽게 통합합니다.

  • 직방의 lambda 사용 사례 : 링크

생성 방법

기본적으로 람다는 함수를 지정하여 실행하는 걸 기본으로 한다.
아래 그림과 같이 3개의 방법으로 람다 함수를 지정할 수 있다.

  1. 직접 작성
  2. 블루프린트 사용
    • 자주 사용하는 예시코드를 템플릿화 해둔 것
  3. 컨테이너 이미지 사용

기본적으로 지원하는 프로그래밍 언어는 아래 그림과 같다.

혹시 람다에서 Java Spring이나 Next.js, React.js 등을 사용하려면, 컨테이너 이미지를 사용해 도커 이미지 방식을 사용해주는 방식을 써야한다.

트리거 설정

Lambda 함수가 언제 실행 될 지 트리거 설정을 할 수 있다.

  • 일반적으로 API gateway를 달아 URL로 호출하는 방식
  • Kafka를 구축해서 쓰거나 MSK를 사용해 topic consume 방식을 사용해 호출하는 방식
  • 그 외 등등 아래와 같은 방식들이 있다.

호출 방식
호출 가능한 방식이 이만큼 많다

API gateway 하나를 추가해보면 endpoint를 지정하여 호출할 수 있도록 이렇게 나온다.

요청 파라미터 및 환경변수 활용하는 법

기본적으로 함수는 event, context 2개의 파라미터를 가진다.

event

event는 기본적으로 요청 정보를 담고 있는 Map타입 변수이다.
HTTPS 요청으로 호출해본 event 변수 내부 정보는 아래와 같다.

[('resource', '/python'),
('path', '/python'),
('httpMethod', 'POST'),
('headers',
    {'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Content-Type': 'application/json',
    'Host': '4osfgdfd32.execute-api.ap-northeast-2.amazonaws.com',
    'Postman-Token': 'b1c30df9-c563-487b-a8fc-2f64f02c970a',
    'User-Agent': 'PostmanRuntime/7.32.3',
    'X-Amzn-Trace-Id': 'Root=1-64f688f7-50d9b5c531093cc401c92924',
    'x-api-key': '6Z6WHnfIkh8T1IFGRR3py1WdkdMVEkkb6szr6g6g',
    'X-Forwarded-For': '121.157.66.3',
    'X-Forwarded-Port': '443',
    'X-Forwarded-Proto': 'https'}),

('multiValueHeaders',
        {'Accept': ['*/*'],
        'Accept-Encoding': ['gzip, deflate, br'],
        'Content-Type': ['application/json'],
        'Host': ['4osfgdfd32.execute-api.ap-northeast-2.amazonaws.com'],
        'Postman-Token': ['b1c30df9-c563-487b-a8fc-2f64f02c970a'],
        'User-Agent': ['PostmanRuntime/7.32.3'],
        'X-Amzn-Trace-Id': ['Root=1-64f688f7-50d9b5c531093cc401c92924'],
        'x-api-key': ['6Z6WHnfIkh8T1IFGRR3py1WdkdMVEkkb6szr6g6g'],
        'X-Forwarded-For': ['121.157.60.1'],
        'X-Forwarded-Port': ['443'],
        'X-Forwarded-Proto': ['https']}),
('queryStringParameters', {'hi': 'hi'}),
('multiValueQueryStringParameters', {'hi': ['hi']}),
('pathParameters', None),
('stageVariables', None),
('requestContext',
        {'resourceId': '9u2bl9',
        'resourcePath': '/python',
        'httpMethod': 'POST',
        'extendedRequestId': 'KwpWtGh8oE0FTCA=',
        'requestTime': '05/Sep/2023:01:48:39 +0000',
        'path': '/production/python', 'accountId': '717233378783', 'protocol': 'HTTP/1.1', 'stage': 'production', 'domainPrefix': '4osfgdfd32', 'requestTimeEpoch': 1693878519402, 'requestId': 'ae66f4ee-7920-4705-accd-d2b6a9416a5e', 'identity': {'cognitoIdentityPoolId': None, 'cognitoIdentityId': None, 'apiKey': '6Z6WHnfIkh8T1IFGRR3py1WdkdMVEkkb6szr6g6g', 'principalOrgId': None, 'cognitoAuthenticationType': None, 'userArn': None, 'apiKeyId': '99drdr5rsk', 'userAgent': 'PostmanRuntime/7.32.3', 'accountId': None, 'caller': None, 'sourceIp': '121.157.60.1', 'accessKey': None, 'cognitoAuthenticationProvider': None, 'user': None}, 'domainName': '4osfgdfd32.execute-api.ap-northeast-2.amazonaws.com', 'apiId': '4osfgdfd32'}), ('body', 'ew0KICAgICJoaTIiOiJoaTIiDQp9'), ('isBase64Encoded', True)]

context

context는 lambda의 설정 정보를 가지고 옵니다.

LambdaContext([
    aws_request_id=bb0ebc6b-6dfc-4c3e-8242-be15f06b6d0b,
    log_group_name=/aws/lambda/python,
    log_stream_name=2023/09/05/[$LATEST]0e6387dda8bc4d98b816463f8c275b0a,
    function_name=python,
    memory_limit_in_mb=128,
    function_version=$LATEST,
    invoked_function_arn=arn:aws:lambda:ap-northeast-2:717233378783:function:python,
    client_context=None,
    identity=CognitoIdentity([cognito_identity_id=None,cognito_identity_pool_id=None])
])

더 자세한 context 관련 정보를 보고 싶다면,
Python context
Java context

환경변수

환경변수는 프로그래밍 언어 표준 메서드에서의 환경변수 사용법과 같습니다.

# Java
String region = System.getenv("AWS_REGION");

# Python
import os
region = os.environ['AWS_REGION']

환경변수 설정과 다른 언어의 환경변수 사용법은 아래 링크를 참고
AWS 공식 환경변수 설정과 사용

고급 설정 방법

요청량 제한하기
https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-API-Gateway-%EC%9D%B8%EC%A6%9D-%ED%82%A4-%EC%82%AC%EC%9A%A9%EB%9F%89-%EC%A0%9C%ED%95%9C-%EC%84%A4%EC%A0%95

비동기식 호출

비동기식 호출은 람다 호출 시 200을 바로 주고, 람다가 동작은 따로 실행하는 방식이다.

비동기식 호출을 설정할 때엔 비동기 호출 이벤트 만료기한과 재시도 횟수를 같이 선언해줄 수 있다. 또한 처리되지 않은 이벤트들을 SQS, SNS에 전송하는 방식으로 처리 못한 이벤트들을 로깅할 수 있다.

공식 사이트 설명 참고

Snapstart

  • Snapstart는 쉽게 말해 lambda에 뜨는 프로그램 형상을 캐싱해두어서 프레임워크나 프로그램이 뜨는 시간을 현저히 줄여주는 것이다.
  • 현재는 Java 11, 17만 지원한다.
  • SnapStart를 사용하는 데 따른 추가 비용이 없습니다.

관련 링크

Cold start 피하기

Database Proxy 사용하기

SQS와 같이 쓰기

SQS를 람다 트리거로 지정하려면 아래와 같은 IAM 권한이 추가로 필요하다.

그 후 아래와 같이 SQS에 lambda 함수 트리거를 추가해주면 된다

참고

람다 요청량 제한하기 (with SQS)

기본적으로 하나의 람다만의 요청량을 제한하는 건 없다. 한 AWS 콘솔 계정의 전체 람다 수만을 제한할 수 있고, 인스턴스를 띄울 때 빠르게 뜰 수 있도록 미리 셋팅된 예약 인스턴스의 수를 설정할 수 있을 뿐이다. 관련해서 더 알고 싶다면, 요 링크공식 사이트 설명을 참고하자

API gateway나 URL 직접 호출을 통해 람다를 호출하게 되면 람다는 요청을 바로바로 받아 처리하려한다. 중간에 오래토록 작업을 저장해줄 따로 queue가 없기 때문에 람다는 바로바로 늘어난다. (1분마다 모든 람다 일하는 중이라면 늘어나는 식)

그리하여 중간에 큐잉을 할 수 있도록 SQS를 사용한다.

SQS를 사용하면, 메세지를 어느정도 기간동안 간직하고 어느정도 기간에 실행할 지 설정할 수 있다. 또한 SQS가 바라보는 Lambda의 최대 인스턴스 수를 고정하는 방식으로 lambda가 무한정 뜰 수 없도록 만들어줄 수 있다. 그러나 당연하게도 API gateway나 URL 방식보다 큐잉 시간이 있어 속도가 느릴 수 있다.

모르는 용어

프로비저닝 동시성 활성화
비동기식 호출, stream 호출

profile
I love to make my own things!!

1개의 댓글

comment-user-thumbnail
2023년 9월 6일

Cold start 피하기
Database Proxy 사용하기

이 두가지 항목도 작성해주세용😊

답글 달기