aws-sam-cliでLambda上で動かすRubyスクリプトを書いていたのだけど、sam local start-apiを実行したときにホットリローディングが効かなくてしばらくハマっていたのでした。
原因はsam build
sam buildをしていたことで.aws-sam配下にパッケージされたLambdaファンクション一式ができあがるのだけど、
これがある状態でsam local start-apiするとこちらが優先して参照されてしまうらしい。
.aws-sam
└── build
├── HelloWorldFunction
│ ├── Gemfile
│ ├── Gemfile.lock
│ ├── app.rb
│ └── vendor
│ └── bundle
└── template.yaml
ファンクションごとのgemのインストールパスについて
なぜsam buildしたかというと、start-apiしたときにgemが見つからないってエラーが発生したため。
こんな感じで。
{
"errorType": "Init\u003cLoadError\u003e",
"errorMessage": "cannot load such file -- httparty",
"stackTrace": [
~
}
開発時には以下のようにvendor/bundle配下を指定してgem installする。
(自分はいつも.bundleにインストールする派だったのでここでも少しハマった)
$ bundle install --path hello_world/vendor/bundle
複数のLambdaファンクションを作成する場合は--gemfileオプションを付けたほうが良いかも。
--gemfileオプションを付ける場合、--pathで指定するインストールディレクトリは--gemfileで指定したGemfileを起点としたパスになる(さっき気づいた)ので以下のようになる。
$ bundle install --path vendor/bundle --gemfile hello_world/Gemfile
こうなる。
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── hello_world
│ ├── Gemfile
│ ├── Gemfile.lock
│ └── app.rb
│ └── vendor
│ └── bundle
├── template.yaml
└── tests
まとめ
ざざっと調べた程度ですが公式のドキュメントやStack Overflow等でもAWS SAM + Ruby の情報はまだ少ない様子。
今回の教訓は以下のとおりです。
-
sam buildはデプロイ時に - gem は vendor/bundleに置く