AWS SAM(Serverless Application Model)은 코드형 인프라(from1) 도구 클라우드포메이션(AWS Cloud Formation)(from2)에 애플리케이션을 뭉친 덩어리이다. 즉, 서버리스 애플리케이션을 찍어내는 뼈대다(from4). 클라우드포메이션을 사용하면 template.yaml 파일을 이용해 인프라를 구성하게 되는데 SAM 템플릿에도 이 파일이 포함되어 있다. 그 예시는 아래와 같다.

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: <https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction>
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - arm64

파일을 보면 애플리케이션의 일부가 AWS::Serverless::Function 즉 AWS Lambda(from3)로 구성되어 있음을 알 수 있다. aws sam buildaws sam deploy --guided 명령으로 배포된 애플리케이션에 요청을 보내기 위해서는 URL을 알아야 하는데, 튜토리얼을 따라하는 경우 URL은 다음과 같은 규칙으로 구성된다.

https://<restapiid>.execute-api.us-east-1.amazonaws.com/<기타등등>

이때 필요한 <restapiid>는 AWS API Gateway 홈에서 확인할 수 있다.

내 로컬 환경이 arm64이기 때문에, 로컬 환경과 배포 환경을 동일하게 만들기 위해 template.yaml 파일의 Architecturesarm64로 설정했다(참고1:AWS Lambda는 arm64를 지원한다)는 점에 주의하자. 도커 기반의 SAM을 이용하는 경우도 마찬가지다. arm64아키텍처에서 빌드된 도커 이미지는 보통 도커 이미지의 태그에 arm64가 명시되어 있다. 예를 들어 내가 사용하는 도커 이미지의 이름과 태그는 public.ecr.aws/lambda/python:3.8-arm64 이다. 이미지의 목록은 ECR 갤러리(참고2)에서 찾을 수 있다.

Untitled

<aside> 💡 다만 이 때, 모든 리전에서 arm64 컴퓨팅 자원을 지원하지 않으므로 SAM을 사용하는 계정의 configure 설정이 필요하다. aws configure 명령어를 사용하며 us-east-1 등 arm64 컴퓨팅을 지원하는 리전인지 확인해 보자.

~/dev/PracticalMLOps/aws-sam/sam-app » aws configure                        janghoo@Janghoo-MacBookPro
AWS Access Key ID [****************WRFA]: 
AWS Secret Access Key [****************3RL2]: 
Default region name [**us-east-1**]: 
Default output format [None]:

</aside>


AWS API Gateway 가 무엇을 하는 것이고, 그것이 왜 필요한가? SAM, Lambda 와 어떤 관련이 있는가?


parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료들.

  1. None

from : 과거의 어떤 생각이 이 생각을 만들었는가?

  1. [ba2.3.a0.5.1. title: AWS CloudFormation은 코드형 인프라(Infrastructure as Code (IaC)) 도구이다.](https://janghoo.notion.site/ba2-3-a0-5-1-title-AWS-CloudFormation-5047e131b0d1413fa0232119f33f7949)
  2. a1.2.a9.1.1.2. title: AWS 람다(Lambda)를 이용해 간단한 함수를 배포한다. 꼭 이 함수가 HTTP API를 위해 존재할 필요는 없다. 이 함수는 서비스가 될수도 있고, 클라우드의 자원을 제어하는 스크립트일수도 있고, 다른 AWS 서비스의 기능으로 동작할수도 있고, 한낱 매크로일 수도 있다.
  3. [bb7.4. [entry] title: 객체 모델(Object model): 어떤 개념을 어떤 객체로 찍어낼지 정의하는 뼈대](https://janghoo.notion.site/bb7-4-entry-title-a700bbc2a622476fbda6989bbdeab29a)