# Lambda & Step Function & API Gateway

# 1. Lambda

> Lambda는 다른 서비스와 결합해서 사용하는 문제가 잘 나온다.

- **Timeout** : 한 번에 최대 15분까지 동작한다.

- **DLQ resource** : 오류가 난 요청을 DLQ로 보낸다.

- **X-Ray** : 요청의 처리 과정을 추적한다.

- **동시성** : 동시에 최대 1000까지 처리할 수 있다. 더 필요하면 AWS에 요청해야 한다.

- **로그** : 요청별로 상세한 로그를 확인할 수 있다.

- 환경 변수 : 직접 입력하거나 SSM Parameter Store로 값을 주입할 수 있다. KMS 암호화도 가능하며, Secret Manager의 값을 주입할 수도 있다.

### Source and Use Cases

- **API Gateway** : 인증, 인가 등의 기능을 포함하는 HTTP/HTTPS 인터페이스를 제공

- **Application Load Balancer** : HTTP/HTTPS 인터페이스를 제공

- **CW Events** : AWS 내의 모든 이벤트 전송 가능. cron도 가능

- **CW Logs** : 로그를 실시간으로 보낸다.

- **CodeCommit** : 누가 commit하면 invoke

- **DynamoDB** : DynamoDB stream을 실시간으로 처리 (인증, 이메일 전송 등)

- **Kinesis** : 실시간 데이터 처리

- **S3** : 새로운 파일 추가 등의 이벤트를 비동기로 처리

- **SNS/SQS** : Decoupling

### Version & Alias

- **Version** : 소스코드와 config가 스냅샷되어 저장된다. 버전은 변경되지 않는다.

- **$LATEST** : 가장 최신 버전을 가리킨다.

- **Alias** : 버전을 가리키는 커스텀 포인터다. 여러 버전을 가중치를 줘서 가리킬 수 있다.

CodeDeploy를 사용하면 Alias의 가중치를 자동으로 바꿔 업데이트를 진행할 수 있다.

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134222_V3iZb6BvtLSGXtkGke?q=80&s=1280x180&t=outside&f=webp)

### SAM Framework

AWS에서 serverless app을 만들기 위한 프레임워크이다.

- **SAM CLI** : SAM template을 CFN 형식으로 변환해주는 역할을 한다.

- build 하면 도커 파일을 만든다.

### CodeDeploy 연동

```
Resources:
 MyLambdaFunction:
   Type: AWS::Serverless::Function
   Properties:
     Handler: index.handler
     Runtime: nodejs12.x
     CodeUri: s3://bucket/code.zip

     AutoPublishAlias: live
     DeploymentPreference:
       Type: Canary10Percent10Minutes 
       Alarms: # A list of alarms that you want to monitor
       Hooks: # Validation Lambda functions that are run before & after traffic shifting
```

- **AutoPublishAlias** : 어느 alias를 새 버전으로 갱신할 것인가?

- **DeploymentPreference** : 배포 설정

위 코드로만 수정하고 배포하면 자동으로 CodeDeploy의 배포 그룹이 생성된다. 따로 설정할 게 없다!

# 2. Step Functions

워크플로우를 시각적으로 보여주고 각 단계별로 Lambda 함수나 다른 서비스를 호출할 수 있는 서버리스 오케이스트레이션 서비스이다. Lambda와는 다르게 Step Functions은 최장 1년까지 하나의 작업을 수행할 수 있다.

# 3. API Gateway

API 요청을 람다 함수나 다른 AWS 서비스에 넘겨주는 서버리스 프록시 서비스이다.

- API 버전(v1, v2, ...)과 스테이지(dev, test, prod)을 만들 수 있다.

- 인증과 권한 할당을 다룰 수 있다.

- Swagger나 OpenAPI에서 정의한 API를 가져올 수 있다.

- API 응답을 캐싱할 수 있고, API Key를 만들 수 있다.

- CloudWatch Logs를 만들 수 있다.

### **Endpoint Type**

- **Regional** : 해당 리전에만 적용된다.

- **Private** : VPC endpoint를 뚫어야만 쓸 수 있다.

- **Edge optimized** : CloudFront edge에 API 배포해 레이턴시를 줄인다.

### Lambda와 연동

- alias를 가리킬 수 있기 때문에, Lambda가 수정되더라도 API Gateway는 수정할 필요가 없다.

- **Mapping Templates** : 요청을 템플릿을 통해 수정한 후 Lambda로 보낼 수 있다.

### Stage

- **stage** : dev, prod 처럼 우리가 임의로 정하는 환경이다. API는 각 stage에 배포된다.

- **stage 변수** : stage별로 설정할 수 있는 일종의 환경 변수.

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134223_3keuiZ50GkBcXOVwa9?q=80&s=1280x180&t=outside&f=webp)

stage별로 각기 다른 Lambda alias를 설정할 수 있다. 이렇게 하면 Lambda 함수가 업데이트되어도 API Gateway는 수정할 필요가 없어진다.

### Stage canary 배포

Lambda와 비슷하게 API Gateway도 canary 배포를 진행할 수 있다. 로그와 메트릭은 따로 저장된다.

### Throttles

API Gateway는 한 계정에서 리전별로 초당 요청 수가 제한되어 있다. 따라서 이 요청을 세밀하게 제한할 필요가 있는데 이것이 쓰로틀링이다.

- stage, method 별로 요청 수 제한

- API Key를 지준으로 요청 수 제한

- Lambda 레벨에서 동시 실행 함수 수 제한

For the site tree, see the [root Markdown](https://slashpage.com/kaonmir.md).
