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に置く