AWS SAMとは
SAMとはServerless Application Modelの略で、要はAWSでサーバーレスアプリケーションを作成するためのフレームワークです。
このフレームワークに沿ってプロジェクトを構築するためのCLIが開発されていて、それがSAM CLIです。 AWS LambdaはPythonやnode.js、.NET Core、Goなど様々な言語に対応していますが、 このCLIは各言語に対応したテンプレートを作成できるという優れモノです。
事の顛末
とりあえずこれでLambdaにアプリケーションをデプロイしてみようと思い立ったところ、結構な前段でコケたという話です。
インストール方法
公式ドキュメントの通りにインストールします。環境はmacOSです。
Homebrewを最新に更新します。
brew update brew upgrade
AWSのリポジトリを追加し、SAM CLIをインストールします。
brew tap aws/tap brew install was-sam-cli
インストール後、パスが通っているか確認するためにバージョン情報を見てみましょう。
$ sam --version SAM CLI, version 0.13.0
プロジェクトのテンプレートを作成する
プロジェクトのテンプレートを作るには、sam init
コマンドを使用します。
ちょうど今Goを勉強中なので、Goのテンプレートにしようと思います。
$ sam init --runtime go [+] Initializing project structure... Error: An error occurred while generating this sam-app: A valid repository for "/usr/local/Cellar/aws-sam-cli/0.13.0/libexec/lib/python3.7/site-packages/samcli/local/init/templates/cookiecutter-aws-sam-hello-go" could not be found in the following locations: /usr/local/Cellar/aws-sam-cli/0.13.0/libexec/lib/python3.7/site-packages/samcli/local/init/templates/cookiecutter-aws-sam-hello-go /usr/local/Cellar/aws-sam-cli/0.13.0/libexec/lib/python3.7/site-packages/samcli/local/init/templates/cookiecutter-aws-sam-hello-go
あ、あれ…?
原因と対処
エラーメッセージを見ると、ローカルにあるはずのリポジトリが存在しないので作成できないようです。 調べてみたところ、SAM CLIのGitHubにIssueが上がっていました。
たしかに、自分の環境を見てみるとcookiecutter-aws-sam-hello-golang
というディレクトリはありますが
cookiecutter-aws-sam-hello-go
というディレクトリはありません。これが原因のようです。
とりあえず対処として、シンボリックリンクを貼る事でディレクトリを作成してみます。
cd /usr/local/Cellar/aws-sam-cli/0.13.0/libexec/lib/python3.7/site-packages/samcli/local/init/templates ln -s cookiecutter-aws-sam-hello-golang cookiecutter-aws-sam-hello-go
任意のディレクトリで、先ほどと同じようにsam init
コマンドを叩いてみましょう。
$ sam init --runtime go [+] Initializing project structure... Project generated: ./sam-app Steps you can take next within the project folder =================================================== [*] Install dependencies [*] Invoke Function: sam local invoke HelloWorldFunction --event event.json [*] Start API Gateway locally: sam local start-api Read sam-app/README.md for further instructions [*] Project initialization is now complete
通った!
SAM CLIはまだベータ版
一応通りましたが、本来通るべき操作が通らないので困り者です。 ただSAM CLIはまだベータ版ですし、Lambdaで使用されている言語はPythonかnode.jsが主流でしょうから、 ある程度はしかたないのかもしれません。 今後の改良に期待です。
ちなみに
上の例だと、プロジェクトディレクトリ名が自動的にsam-app
となってしまいます。
ディレクトリ名を変更したい場合は次のように--name
オプションを追加します。
sam init --runtime go --name <project_name>
というわけで、ここからサーバーレスに入門します。