はじめに
2018年の夏ぐらいから、serverless frameworkによるプロダクト開発に取り組んでいます。元々エンジニア経験の少ない私にとって、インフラ整備などをあまり気にすることなく、プロダクトやコードの開発・改善に集中できるため、非常に効果的なフレームワークだと感じています。
知識の整理を含めて、これまで取り組んできたことをQiitaに投稿していきます。また、独学がメインなので、Serverlessに関するコミュニティなどあったら、教えて頂けると幸いです。
構成
- serverless framework
- AWS
- Node.js v8.10(AWS lambdaなど。今回の記事には関係ありません)
内容
本題ですが、タイトルにあるように、serverlessのデプロイステージごとにserverless.ymlで異なる変数を使いたい状況がありました。具体的に私のプロダクトでは、デプロイステージごとにアクセスするAWS S3バケットを変える必要がありました。
デプロイステージ | S3 バケット名 |
---|---|
本番 (prd) | xyz |
開発 (dev) | xyz-dev |
本番も開発環境もxyz-{ステージ名}という構成で良ければ、
xyz-${opt:stage}
とすることで対応できますが、本番環境はハイフンなしのバケット名をつける必要がありました。
(実際は、本番環境の開発を色々と進めてしまっていたので、開発環境を用意する時点でバケット名を変えるのが大変になってしまったのです。。)
そこで、以下のように、カスタム変数を使って、疑似的に条件分岐しているような形を実現しました。stageName
配下のprdとdevがデプロイステージ名に対応して変数(この場合、"" or -dev)を切り替えます。この形式で開発やデプロイは問題なく進められています。
service: s3Action
provider:
name: aws
runtime: nodejs8.10
custom:
stageName:
prd: ""
dev: -dev
functions:
s3Action:
handler: index.handler
events:
- s3:
bucket: xyz${self:custom.stageName.${self:provider.stage}} # sls deploy --stage prdのときxyz / sls deploy --stage devのとき xyz-dev
event: s3:ObjectCreated:* #上記バケットにオブジェクトが生成されたときにindex.handlerを実行
補足
-
stageNameで用意していないステージにデプロイしようとすると、対応する変数名がないとエラーが発生します。
ex) sls deploy --stage stg
-
serverless.yml内で条件分岐のような処理ができるか調べましたが、対応していないようでした。