なまえは まだ ない

思いついたことをアウトプットします

AWS SAM CLIでGoのテンプレートが作れない

AWS SAMとは

SAMとはServerless Application Modelの略で、要はAWSでサーバーレスアプリケーションを作成するためのフレームワークです。

docs.aws.amazon.com

このフレームワークに沿ってプロジェクトを構築するためのCLIが開発されていて、それがSAM CLIです。 AWS LambdaはPythonやnode.js、.NET Core、Goなど様々な言語に対応していますが、 このCLIは各言語に対応したテンプレートを作成できるという優れモノです。

github.com

事の顛末

とりあえずこれで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 CLIGitHubにIssueが上がっていました。

github.com

たしかに、自分の環境を見てみると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>

というわけで、ここからサーバーレスに入門します。