AWS SAM CLI에서 HttpApi의 로컬 에뮬레이션이 지원되었으므로 WSL2 Docker에서 사용해 보았습니다.

소개



여러분 AWS SAM CLI를 사용하고 계십니까?
AWS SAM CLI 라고 말하면 올해의 7월에 공식 출시 되어 얼마 지나지 않습니다만, AWS Lambda의 로컬 에뮬레이트로부터 환경 구축까지 할 수 있는 AWS Lambda를 사용하는데 있어서 강력한 툴입니다.

그런 AWS SAM CLI입니다만, 오늘(2020년 10월 30일)에 릴리스된 v1.7.0로 아래 그림과 같은 HttpApi와 Lambda를 조합한 환경의 로컬 에뮬레이트를 할 수 있게 되었습니다.



이전부터 HttpApi에 대한 지원이있었습니다.



실은 이전부터 HttpApi의 지원은 있어, 무려 2019년 12월 5일에 릴리스 된 v0.37.0의 단계에서 AWS상에 구축할 수 있었습니다.
문서 도 준비되어 있어 환경 구축만 하면 문제 없게 사용할 수 있었습니다만 SAM의 주요 기능인 로컬 에뮬레이트는 대상외였습니다.

동작 확인



실제로 HttpAPI의 로컬 에뮬레이트를 실행해 보겠습니다.

운영 환경


  • Windows10 Pro
  • WSL2 (Ubuntu20.04)
  • Docker for windows 2.4.0
  • VSCode 1.50.1
  • Remote Development v0.20.0 ※확장 기능


  • 개발 컨테이너 구축



    로컬로 설치하고 싶지 않기 때문에 WSL2의 Docker 내에서 완결되도록 구축합니다.
    먼저 WSL에 작업 폴더를 만들고 VSCode에서 엽니다.
    powershell에서 명령을 입력합니다.
    wsl # WSLに切り替え
    mkdir /path/to/your/workspace/sam-sample # 作業用フォルダを作成
    code -r /path/to/your/workspace/sam-sample # 作業用フォルダをVSCodeで開く
    

    이제 VSCode가 열리므로 Ctrl + Shift + p 명령 팔레트를 열고 개발 컨테이너 템플릿을 만듭니다.
    >Remote-Containers:Add Development Container Configuration Files...
    


    그 중에서 Python 3를 선택합니다.
    ※ 나오지 않는 사람은 Show ALL Definetions...를 선택하십시오. Python 3가 나올 것입니다.

    그러면 개발 컨테이너의 템플릿이 폴더에 만들어집니다.

    AWS SAM CLI는 Docker를 사용하므로 호스트의 docker.sock를 마운트합니다..devcontainer.jsonname 또는 build와 동일한 계층 구조에이 행을 추가하십시오.
    "mounts": ["source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"],
    

    정의한 환경을 엽니다.Ctrl + Shift + p에서 명령 팔레트를 열고 정의한 환경을 엽니다.
    >Remote-Containers:Reopen in Container
    



    AWS SAM CLI 설치


    root@***:/workspaces/sam-sample# pip3 install aws-sam-cli
    root@***:/workspaces/sam-sample# sam --version
    SAM CLI, version 1.7.0
    

    프로젝트 만들기


    sam init 명령으로 프로젝트를 초기화합니다.
    root@***:/workspaces/sam-sample# sam init
    Which template source would you like to use?
            1 - AWS Quick Start Templates
            2 - Custom Template Location
    Choice: 1
    
    Which runtime would you like to use?
            1 - nodejs12.x
            2 - python3.8
            3 - ruby2.7
            4 - go1.x
            5 - java11
            6 - dotnetcore3.1
            7 - nodejs10.x
            8 - python3.7
            9 - python3.6
            10 - python2.7
            11 - ruby2.5
            12 - java8.al2
            13 - java8
            14 - dotnetcore2.1
    Runtime: 2
    
    Project name [sam-app]: 
    
    Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git
    
    AWS quick start application templates:
            1 - Hello World Example
            2 - EventBridge Hello World
            3 - EventBridge App from scratch (100+ Event Schemas)
            4 - Step Functions Sample App (Stock Trader)
            5 - Elastic File System Sample App
    Template selection: 1
    
    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.8
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    
    Next steps can be found in the README file at ./sam-app/README.md
    

    Hello World용 템플릿이 완성됩니다.
    이 상태에서는 아직 이전RestAPI을 사용하는 구성이므로 조금만 수정합니다.
    하지만 Type: Api 부분을 Type: HttpApi로 전환하면됩니다.


    실행


    sam local start-api에서 실행합니다.
    root@***:/workspaces/sam-sample# cd sam-app/
    root@***:/workspaces/sam-sample/sam-app# sam local start-api -v /path/to/your/workspace/sam-sample/sam-app
    Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
    You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
    2020-10-30 06:25:31  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
    

    방금전Type: HttpApi으로 전환한/hello의 Lambda 함수가 인식되고 있는 것을 알 수 있습니다.
    Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
    

    브라우저에서 액세스하면 hello world가 올바르게 표시되고 HttApi 지원을 확인할 수 있습니다.


    덧붙여서 sam local start-api 때 붙인 -v 옵션은 이번 중요하고, AWS SAM CLI를 Docker내에서 실행하는 경우는 호스트상의 프로젝트의 경로를 지정해 줄 필요가 있으므로 주의해 주세요.
    sam local start-api --help
    ...
      -v, --docker-volume-basedir TEXT
                                      Specifies the location basedir where the SAM
                                      file exists. If the Docker is running on a
                                      remote machine, you must mount the path
                                      where the SAM file exists on the docker
                                      machine and modify this value to match the
                                      remote machine.
    

    이전 버전에서 사용해보기


    root@***:/workspaces/sam-sample/sam-app# pip3 install aws-sam-cli==1.6.2
    root@***:/workspaces/sam-sample/sam-app# sam --version
    SAM CLI, version 1.6.2
    root@***:/workspaces/sam-sample/sam-app# sam local start-api -v /path/to/your/workspace/sam-sample/sam-app
    Error: Template does not have any APIs connected to Lambda functions
    

    이전 버전에서는 원래 API로 인식되지 않았습니다.

    여담



    이번에 전달한 AWS SAM CLI의 HttpApi 지원입니다만, 이 기능의 PR에 공헌하였습니다.
    원래 열려 있던 PR에 대해서 부족한 기능을 PR했을 뿐입니다만, 실은 최초의 OSS 활동이었으므로 매우 긴장했습니다. . .
    또한 OSS라는 불특정 인간이 커밋하는 리포지토리 관리 방법도 배울 수 있었기 때문에 OSS 활동은 중요하다고 인식할 수 있었습니다.
    OSS 활동을 한 적이없는 분도 겁없이 도전하는 것이 좋습니다.

    좋은 웹페이지 즐겨찾기