皆さん、StepFunctionsしてますか?
複数のLambdaを組み合わせてステートマシンを作り、それが順番に実行されていくあのピタゴラスイッチみたいな面白さ。
私もよく使っています。現在は多くのサービスと連携できるようになり、より簡潔にステートマシンが書けるようになって嬉しいです。
どうやってデプロイしてますか?
さて、そのStepFunctions、どうやってデプロイしてますか?StepFunctionsは単体ではなく、Lambdaを組み合わせて使います。
となると、StepFunctionsのデプロイとは、
- 処理を行うLambdaのデプロイ
- 処理の流れを定義するステートマシンのデプロイ
となります。場合によってはIAMロール周りも必要です。どうやってLambdaやステートマシンをデプロイしてますか?
直弄り
Lambdaやステートマシンはそれぞれコンソールから直接編集が可能ですので、やっている人も多いです。
しかしこの場合、デプロイ=保存になるので、もし戻したくなった場合は戻せません。非常にきたねぇデプロイです。
コピペデプロイ
はい。出ました。きたねぇデプロイ代表「コピペデプロイ」です。
ローカルにあるコードをコピーして、AWSのLambdaコンソールを開いてペーストするやつです。ローカルでソース管理しているだけ直弄りよりマシですが、まだまだ汚いです。コミットしたタイミングならまだしも、編集中にコピペして保存した場合、いつのタイミングの物がLambdaに適用されているのか分からなくなります。
属人的デプロイ
はい、これもきたねぇデプロイですね。特定の人しかデプロイできない!これは非常に問題です。リリース当日にその人が休んだら?電車が止まって来れなくなったら?考えただけで背筋がゾワゾワしますね。
きれいなデプロイを目指して
では、きれいなデプロイとは何でしょう。いろいろあると思います。
- developブランチにマージされたら検証環境のLambdaにデプロイ
- masterブランチにマージされたら本番環境のLambdaにデプロイ
特にStep Functionsの場合、複数のLambdaが同時に最新になっている必要があります。これが単一Lambdaと違って難しい所で、複数のLambdaと同調するのでデプロイ抜けがあると動かなくなります。
「コピペデプロイ」や「直弄り」だと、この問題が多発します。 このLambda更新したっけ? とか、 あ、こっちのLambda更新してなかった! とかで失敗し、そのたびにLambdaコンソールを開いて編集・・・非常によくないです。
その問題を解決する為、私は「serverless framework」を使うようになりました。
Serverless Frameworkとは?
複数のAWSリソースを一撃でデプロイしてくれます。はい、この一撃というのがポイントで、コマンド一つで
- Lambda
- IAM
- StepFunctions
を一撃でデプロイしてくれます。StepFunctionsの場合はプラグインを入れる必要があります。Lambdaを新規にデプロイする場合はIAMも設定する必要があるので、一撃でデプロイできるのは非常に便利です。
設定のポイント
Cloud Watch Logsの保存期間を設定しておこう。
provider:
name: aws
runtime: python3.7
logRetentionInDays: 30
logRetentionInDays
という所が設定箇所です。これを設定しないとずっとLogが残り続けて課金額が増えていきます。値は環境によって調整しましょう。
Lambdaの世代管理を設定しておこう。
Serverless FrameworkでデプロイしたLambdaは、問題発生時のロールバック用に過去の世代が保存されるのですが、これがどんどん溜まっていきます。そうなるとコード保存容量が上限となり、デプロイできなくなるので、何世代まで残すかの設定をしておきましょう。
plugins:
- serverless-step-functions
- serverless-prune-plugin
custom:
prune:
automatic: true
number: 3
serverless-prune-plugin
というプラグインをインストールし、custom
に設定を記述します。number
とは世代を表し、この場合だと3世代まで残す設定になっています。
きたねぇデプロイから、きれいなデプロイへ
Serverless Frameworkを使う事で何が解決できるのか?
コマンドによりデプロイが開始されるので、Lambdaコンソールを開く必要がなくなります。「直弄り」や「コピペデプロイ」がなくなります。
Serverless Framework環境を整えれば、ソースコードをcloneしてコマンド実行するだけで誰でもデプロイできるようになります。
私もServerless Frameworkを使う前は前に挙げたようなドロドロのきったねぇデプロイをしてました。何が問題かというと、コードの更新漏れで動かないとかそんなもので時間を取られるようになったんですね。そこじゃなくてコードを書くのに時間を使うべき。あとこういう作業は繰り返しなので絶対に自動化できる!そう考えて調べた結果、「Serverless Framework」に出会いました。
きたねぇデプロイは皆さんからコードを書く時間をどんどん奪っていきます。コードを書くのが好きなら、こんなきたねぇデプロイを駆逐して、楽しいコーディングライフを送りましょう!