LoginSignup
6
3

More than 3 years have passed since last update.

AWS SAM CLIでHttpApiのローカルエミュレートがサポートされたのでWSL2のDocker上で使ってみた

Posted at

はじめに

みなさんAWS SAM CLIを使用されていますでしょうか?
AWS SAM CLIと言えば今年の7月に正式リリースされて間もありませんが、AWS Lambdaのローカルエミュレートから環境構築まで出来るAWS Lambdaを使う上で強力なツールです。

そんなAWS SAM CLIですが、本日(2020年10月30日)にリリースされたv1.7.0で下図の様なHttpApiとLambdaを組み合わせた環境のローカルエミュレートが出来るようになりました。

httpapi.png

以前から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...

image.png
その中からPython 3を選びます。
※出てこない人はShow ALL Definetions...を選んで下さい。Python 3が出てくるはずです。
image.png
すると開発コンテナ用のテンプレートがフォルダ内に作成されます。
image.png
AWS SAM CLIはDockerを利用するのでホストのdocker.sockをマウントします。
.devcontainer.jsonnamebuildと同じ階層にこの行を追加してください。

"mounts": ["source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"],

定義した環境を開きます。
Ctrl + Shift + pでコマンドパレットを開き、定義した環境を開きます。

>Remote-Containers:Reopen in Container

image.png

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に切り替えるだけです。
image.png

実行

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のサポートが確認出来ます。
image.png

ちなみに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活動をされた事がない方も臆さず挑戦する事をお勧めします。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3