はじめに
みなさん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.json
のname
や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活動をされた事がない方も臆さず挑戦する事をお勧めします。