[AWS] SAM을 이용하여 Lambda 로컬 개발 환경 구축하기

Sean park·2022년 1월 29일
4
post-thumbnail

[ AWS Lambda function을 local에서 테스트 하기]

[ 목적 ]

  1. 매번 AWS console에서 Test JSON을 생성해서 gui로 테스트하기 번거로움
  2. AWS console에서 테스트시 Log 찍어보기 불편함

[ Environment ]

  • Docker (SAM이 내부적으로 docker 사용)
  • Testing language, runtime (python, node.js, etc...)
  • vscode

[ 관련 자료 ]

[ Lambda local test enviornment setting ]

해당 내용은 MacOS를 기준으로 작성되었습니다.

  1. Install vscode extention - AWS Toolket
  2. Create Lambda SAM Application
  3. 사용할 Runtime을 선택한다 (python3.9)
  4. 자신에게 맞는 CPU 스펙을 선택하고, AWM SAM Hello World를 선택한다
  5. 생성된 프로젝트에서 현재 Test case를 작성하며 개발하지 않음으로 tests 폴더를 삭제한다.
  6. Lambda 함수 작성 : 생성된 hello_world 폴더의 이름을 적절히 변경한다.
    • Events/event.json에 lambda에 보낼 event data 작성
    • 필요한 python 패키지는 <lambda_function_dir>/requirements.txt 파일에 버전과 함께 작성한다
    • app.py에 lambda function 작성
  7. Lambda image build : requirements에 필요 패키지 작성 후 sam build로 SAM이 사용할 image build
    • 패키지 설치 필요 없이 단순 테스트시 —skip-pull-image 옵션을 추가하여 image pull 생략
      sam build (--skip-pull-image)
  8. Lambda invoke : sam local invoke -e events/event.json에 필요 json 작성 후 로컬 lambda function test
    • 함수 테스트 전(코드 수정시) sam build 필요, Event.json 수정시 build 필요하지 않음
    • sam local start-api 명령어 사용시 localhost server로 실행 → postman 사용 가능

** Lambda function(app.py) 변경시 build를 해야하기 때문에, 주기적으로 docker container prune 명령어로 container 정리(삭제) 필요

[ Lambda template.yaml 파일 작성 ]

SAM을 이용한 배포를 진행하기 위해서는 template.yaml 파일 작성 필요

아래는 lambda_local/template.yaml 파일의 예시 내용이다

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-deploy

  Sample SAM Template for sam-deploy

Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: "Sam-deploy-test-function"
      CodeUri: example_function/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get

API 개발시 참고해야 하는 옵션

Resources

  • FunctionName : Lambda function의 이름
  • Environment/Variables : Lambda 환경 변수
  • CodeUri : Lambda function이 담겨있는 위치
  • Events : API(Lambda function)의 이름과 uri resource, http method. sam local start-api로 테스트시 사용
  • Handler : Lambda handler 함수의 위치
  • HelloWorldFunction : SAM local invoke에서 호출하는 함수

[ API Gateway template.yaml 작성 ]

SAM은 기본적으로 Lambda와 API Gateway 배포를 지원한다.

Lambda function과 관련된 내용을 template.yaml에 먼저 작성하고, API Gateway 정보가 담긴 내용을 추가하고 Lambda function 과 API Gateway와 연결되도록 내용을 추가한다.

아래는 API Gateway와 Lambda function을 연결한 template.yaml 파일의 내용이다.

Resources:
  BasicAWSApiGateway:
    Type: AWS::Serverless::Api
    Properties:
      Name: api-gateway
      StageName: dev

  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: "Sam-deploy-test-function"
      CodeUri: example_function/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            RestApiId: !Ref BasicAWSApiGateway
            Path: /hello
            Method: get

API Gateway 내용

  • BasicAWSApiGateway : Template.yaml 파일에서 사용되는 API Gateway의 이름
  • Properties/Name : AWS에 배포될 API Gateway의 이름
  • Properties/StageName : AWS에 배포될 API Gateway의 stage 이름

Lambda Function 내용

  • Events//Properties/RestApiId : Lambda function과 연결할 template.yaml 내부의 API Gateway 이름. 앞에 !Ref를 추가하여 API Gateway와 연결한다.

[ SAM을 사용해서 CLI에서 배포하기 ]

!!! 해당 배포 과정은 변경된 내용만 적용 되는 것이 아닌, 해당 template.yaml 파일 내용 그대로 덮어써지기 때문에 하나의 template.yaml에 수정 사항과 변경 사항을 모두 작성하여 배포해야 합니다 !!!

사전 작업

  • aws-cli로 계정정보 등록
    1. aws configure list 로 현재 AWS 정보 확인
    2. aws configure —profile 명령어로 AWS 계정 정보 등록
      • access_key : 계정 access_key (IAM에서 확인 가능)
      • secret_key : 계정 secret_key (IAM에서 key 생성시에만 확인 가능, 별도 보관 필요)
      • region : AWS 지역 설정 (ap-northeast-2 : 서울)

Lambda & API Gateway 배포

  1. 배포할 Lambda function SAM build ( Lambda local test enviornment setting 참고 )

  2. 배포할 Lambda function이 있는 directory로 이동

  3. sam deploy -g —profile 명령어로 원하는 계정에 배포

    • Stack name : Cloudfront에 사용될 Stack 이름
    • AWS Region : AWS 지역 등록
    • 나머지 옵션은 모두 Yes
    • SAM configuration file : SAM 배포시 사용되는 정보가 저장되는 파일 명
    • SAM configuration enironment : 별도의 SAM 파일이 없다면 엔터
profile
제 코드가 세상에 보탬이 되면 좋겠습니다.

0개의 댓글