ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SAM 을 이용한 AWS Lambda 배포
    공부/AWS 2025. 11. 30. 23:33

    Lambda에 배포하는 방법 중에 하나로 SAM을 이용하여 배포하는 방법이 있습니다. 오늘은 SAM으로 람다에 함수를 배포하고 관리할 수 있도록 구성했던 부분을 작성하도록 하겠습니다. (제가 진행했던 방식은 Mac에서 진행하였습니다.)

     

    혹시라도 부정확한 정보를 전달드릴 수 있습니다. 다만 틀린 부분이 있으면 댓글을 남겨주세요. 


     

    1. SAM 설치(AWS 링크)

    - 환경에 맞게 SAM을 설치합니다.

    # Mac
    brew tap aws/tap
    brew install aws-sam-cli
    sam --version # sam이 정상적으로 설치가 됐다면 버전이 나옵니다.

     

     

    2. 설치 이후 명령어를 통해 SAM 관련 파일을 생성합니다.

    sam init
    # 이후 나타는 설정은 상황에 맞게 진행해주시면 됩니다.

     

    템플릿 설정

     

    - 템플릿을 지정하는 부분입니다.

    - Quick Start Templates로 만들고 생성된 파일을 수정하셔도 됩니다.

     

    - Quick Start Templates 선택 시 어떤 템플릿을 배포할 건지 지정하는 부분입니다.

     

    - y/N 에서는 대문자로 된 부분이 엔터를 입력하면 자동으로 N으로 처리가 됩니다.

    - 어떤 언어로 함수를 작성할지 지정합니다.

     

    - 람다에 배포하기 위해서 Zip파일을 선택했습니다.(Image는 도커 이미지를 의미합니다.)

     

    - Nodejs 선택 시 typescript로 배포를 할지를 확인합니다.

    - 저는 나머지 부분에서 default로 선택하였습니다.

     

    - 이후 제가 설정한 대로 sam 폴더가 생성되면 내부에는 원하는 설정들이 된 파일들이 생성돼 있습니다.

     

    3. samconfig, template 파일 확인

    - samconfig.toml 파일은 배포를 진행할 때 AWS에서 사용할 부분들을 지정합니다.

    # 하단 URL에 접속 시 어떤 키와 값으로 작성해야 하는지 정보를 알 수 있습니다.
    # https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
    version = 0.1
    
    # global.parameters는 전역에서 사용할 수 있는 영역이라고 보면 됩니다.
    # 각 영역에서 stack_name을 따로 지정하지 않았다면 global.parameters를 사용합니다.
    [default.global.parameters]
    stack_name = "sam-app"
    
    # build 할때 parameter 입니다.
    [default.build.parameters]
    cached = true # 빌드 시 변경 사항이 없다면 캐시된 결과를 재사용 합니다.
    parallel = true # 함수가 여러개 있을 때 병렬로 배포합니다.
    
    # 유효성 검증
    [default.validate.parameters]
    lint = true
    
    # 배포시 사용하는 파라미터 입니다.
    [default.deploy.parameters]
    capabilities = "CAPABILITY_IAM" # CloudFormation이 리소스를 생성하거나 수정할 수 있도록 허용합니다.
    confirm_changeset = true # CloudFormation 변경을 사용자에게 보여줍니다.
    resolve_s3 = true # S3 버킷을 자동으로 생성하거나 기존의 버킷을 재사용하도록 설정합니다.
    
    [default.package.parameters]
    resolve_s3 = true # s3 버킷을 지정하지 않았다면 자동으로 버킷을 찾거나 생성합니다.(지정했다면 false로 유지)

     

    - template.yaml 파일은 Lambda 구성을 설정합니다.

    # Default로 생성된 파일입니다.
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Description: >
      sam-app
    
      Sample SAM Template for sam-app
      
    # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
    Globals:
      Function:
        Timeout: 3
    
    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.lambdaHandler
          Runtime: nodejs22.x
          Architectures:
            - x86_64
          Events:
            HelloWorld:
              Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
              Properties:
                Path: /hello
                Method: get
    
    Outputs:
      # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
      # Find out more about other implicit resources you can reference within SAM
      # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
      HelloWorldApi:
        Description: "API Gateway endpoint URL for Prod stage for Hello World function"
        Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/Prod/hello/"
      HelloWorldFunction:
        Description: "Hello World Lambda Function ARN"
        Value: !GetAtt HelloWorldFunction.Arn
      HelloWorldFunctionIamRole:
        Description: "Implicit IAM Role created for Hello World function"
        Value: !GetAtt HelloWorldFunctionRole.Arn

     

    - Resources 영역에 AWS에 있는 다른 서비스들은 연결하거나 Event Handler, VPC Config 등을 지정할 수 있습니다.

     

    4. 배포 진행

     

    # 처음 build 시에는 --guided를 필수로 입력하시고 이후에는 build만 진행하셔도 됩니다.
    sam build --guided
    sam deploy

     

    - 정상적으로 deploy가 된 다면 각각의 AWS에서 확인할 실수 있습니다.

     

    CloudFormation
    S3

     

    lambda-applicaion

     

    lambda-function
    lambda-function-detail

     


    Deploy 진행하다가 실패한다면???

    - 실패시 Cloudformation 스택에서 failed된 스택을 삭제하고 문제가 있던 samconfig 파일을 수정하고 deploy를 진행해야 합니다.


     

    현재는 로컬에서 명령어로 배포하는 부분을 진행하였지만, 이후에는 github-action을 이용해서 배포 자동화를 하는 부분도 작성할 수 있도록 하겠습니다. 

    처음에는 lambda가 불편하고 어렵다고 생각했지만 가벼운 기능들을 자주 사용하다보면 더 확장된 기능들을 사용해 볼 수 있을 것이라고 생각하고 있습니다.

     

     

    Ref.

    https://velog.io/@leejm_dev/AWS-SAM

     

    AWS SAM

    how to use AWS SAM with cloudformation

    velog.io

     

     

     

     

    댓글

Designed by Tistory.