Serverless Frameworkを使ってて嵌ったこと

AWS Lambdaのローカルでの実行、管理にServerles Frameworkを使っているのですが、その中で嵌ったことをメモしていきます。

deployment bucketをserverless自身では作成できない

Serverlessではserverless.ymlに記載することでS3を始めとするAWSの各種リソースを作成できます。

また、deploymentBucketにS3のバケットを指定することで、デプロイ時に利用するバケットを指定することができます。

じゃあserverless.yml内でS3バケットを作成して、それをdeploymentBucketに指定できたら楽じゃない? と思って試していたんですが、何度やってもエラーに・・・。

なんでやねんと思って調べてみたら、バグレポートが上がっていました。
https://github.com/serverless/serverless/issues/4185

結論、バグではなく仕様だそうです。
deploymentBucketには実在するS3バケットのみを割り当てることができ、存在しないバケットを指定することはできないそうです。
残念。

includeだけでなくexcludeも指定する必要がある

ここが結構詳しいかも。
http://makky12.hatenablog.com/entry/2019/09/10/124756

serverless.ymlにincludeを指定することで、デプロイパッケージに含めるファイルを指定することができますが、それだけだと意味がないようです。

まず、

exclude:
- /**

で全部除外してからincludeで入れなおしてあげる、という流れで想定通りにincludeに指定したもののみ入れることができます。
ちなみに余談ですが、

include:
- config/{self:provider.stage}.json

のように記載すると、環境毎の設定ファイルのみを入れることができます。

localstackはプラグインよりもdockerで

localstackという、AWSの各サービスのダミーを作成してくれる便利なものがあります。
https://github.com/localstack/localstack

serverlessにはこれのプラグイン(serverless-localstack)があり、設定することで簡単にS3やRDSなどのモックを利用することができるようになります。
https://github.com/localstack/serverless-localstack

が、これはあくまでLambdaを実行するときに作成されて、Lambdaから利用する前提の仕組みになっています。

例えば事前にS3にファイルがある前提で、そのファイルを加工するLambdaをローカルで実行したい場合に、プラグインだと事前に画像をアップロードしておくという事ができないため実行できません。

そういう場合は、dockerでlocalstackを立ち上げて上げればOKです。serverlessとは無関係に持続して起動し続けるので、そこに対してバケット作成や画像のアップロードをおこなったうえでserverlessでLambdaを実行してあげれば、Lambdaからlocalstack上のダミーのS3にアクセスすることができるようになります。

 

他に思い出したことがあれば追記していきます。