AWS Lambda은 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다.
Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 Lambda가 지원하는 언어 런타임 중 하나로 코드를 제공하기만 하면 됩니다.
Lambda 함수에 코드를 구성합니다. Lambda 서비스는 필요할 때만 함수를 실행하고 자동으로 확장됩니다.

파일 처리: 업로드 후 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개의 방법으로 람다 함수를 지정할 수 있다.

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

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

Lambda 함수가 언제 실행 될 지 트리거 설정을 할 수 있다.
호출 방식
호출 가능한 방식이 이만큼 많다


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

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

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는 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 공식 환경변수 설정과 사용

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

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

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

참고
기본적으로 하나의 람다만의 요청량을 제한하는 건 없다. 한 AWS 콘솔 계정의 전체 람다 수만을 제한할 수 있고, 인스턴스를 띄울 때 빠르게 뜰 수 있도록 미리 셋팅된 예약 인스턴스의 수를 설정할 수 있을 뿐이다. 관련해서 더 알고 싶다면, 요 링크와 공식 사이트 설명을 참고하자
API gateway나 URL 직접 호출을 통해 람다를 호출하게 되면 람다는 요청을 바로바로 받아 처리하려한다. 중간에 오래토록 작업을 저장해줄 따로 queue가 없기 때문에 람다는 바로바로 늘어난다. (1분마다 모든 람다 일하는 중이라면 늘어나는 식)
그리하여 중간에 큐잉을 할 수 있도록 SQS를 사용한다.

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

Cold start 피하기
Database Proxy 사용하기
이 두가지 항목도 작성해주세용😊