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にアクセスすることができるようになります。
他に思い出したことがあれば追記していきます。