はじめに
aws-sam-cli
を利用すれば、手元の端末内にLambdaの実行環境を再現して、動作検証できる。
手元でコードを修正しながらその場で動作確認できるため、ディプロイの手間とLambdaの費用を削減できる。
nodejsとpythonの導入手順は多い中、Golangのドキュメントが少ないように感じたため、ここで纏める。
やること
- 開発用にarm版Golangをローカル環境にインストールする
-
aws-sam-cli
でローカル環境にLambdaとAPIGatewayを構築する
前提
- arm版(M1チップ)の
macOS
環境をベースに説明する (goenv導入部分以外は大差ないはず) - Z shell (zsh) をベースに説明する (環境変数の通し方以外は大差ないはず)
- Dockerは既にインストールしてあるものとして説明する
もくじ
- Golangをセットアップする
- aws-sam-cliをセットアップする
- ローカル環境でLambdaを起動する
1. Golangをセットアップする
1-1. goenvをインストール
brewでそのままgoenvをインストールすると、古いバージョンしか落ちてこない。
したがって、下記コマンドで強制的に最新版を取る。
% brew uninstall goenv && brew install --HEAD goenv
% goenv -v
goenv 2.0.0beta11
下記はarm版(M1チップ)のmacOS
でarm版Goを取得するための設定。
必要なければスキップしても良い。
% echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshrc
% echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(goenv init -)"' >> ~/.zshrc
% cat ~/.zshrc
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
1-2. Golangをインストール
% goenv install -l
Available versions:
1.2.2
1.3.0
…
1.17.5
1.17.6
1.18beta1
arm版macOS
に対応しているのは1.16.0以降のみなので注意。
% goenv install 1.17.6
% goenv global 1.17.6
↓ (amd版/arm版含み)意図通りのバージョンを参照できるようになったか確認。
% exec $SHELL
% go version
go version go1.17.6 darwin/arm64
2. aws-sam-cliをセットアップする
2-1. aws-sam-cliをインストール
macOSの場合、brewでaws-sam-cli
をインストールできる。
↓ macOS以外の環境でセットアップする手順
% brew tap aws/tap
% brew install aws-sam-cli
% sam --version
SAM CLI, version 1.37.0
2-2. aws-samの公式サンプルを取得
% docker --version
Docker version 20.10.12, build e91ed57
下記コマンドでAWS公式のサンプルファイル群を取得できる。
単に% sam init
で実行すれば、対話的に各種設定を進めることもできる。
% mkdir lambda_go_test
% cd lambda_go_test
% sam init --package-type Image --base-image amazon/go1.x-base --name golang-sam-sample
3. ローカル環境でLambdaを起動する
生成されたサンプルファイル群のルートディレクトリに入ってDockerImageを焼く。
% cd golang-sam-sample
% sam build
Imageが焼き上がったらLambdaとAPIGatewayを動かしてみる。
% sam local start-api
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
2022-01-30 18:31:58 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
curlで叩いて、挨拶してもらえたなら成功。
% curl http://127.0.0.1:3000/hello
Hello, xxx.xxx.xxx.xxx
このあとは適宜main.goを編集してLambdaの処理内容を変えたり、template.yamlを編集してLambdaの数を増やしたりして遊ぶ。
トラブルシューティング
何度やり直してもArm版Golangが落ちてこない
TerminalをRosetta2経由で起動していませんか (私はしていました)。