Posted at

sbt-aws-serverlessプラグインでKinesis StreamとLambdaをTriggerできるようにした

More than 1 year has passed since last update.

sbt-aws-serverlessプラグインを作った って言うてましたが、地味にちょっとずつですが、拡張していってます。

今回は、Serverlessアーキテクチャの要とも言える、非同期処理を支えるKinesis Stream + Lambdaのパターンにおいて、環境を構築するの面倒だなー、sbtから簡単にデプロイできると便利なのになー、って迷える方に楽に扱えるよーにしましたので、その手順を紹介します。


Deploy手順


LambdaとAliasをDeployします。

Scalaで作成したLambdaモジュールをデプロイします。

また、デプロイしただけだと、開発環境やテスト環境、ステージング環境、プロダクション環境と構築するのに、同じモジュールを使って何個もLambdaを作ることになるので、手間です。

Lambdaは、Aliasを作ると、Alias単位でTriggerを設定できますので、Aliasを作って、そいつに良い感じにKinesis StreamをTriggerするようにすれば、環境ごとにLambdaを作る手間を削減できます。

$ sbt

> deployLambda
...
[info] Assembly up to date: .../$name-$version.jar
[success]

> deployLambdaAlias <aliasName> [publishVersion] [description]
Create Alias: arn:aws:lambda:$region:$awsAccount:function:$name:$aliasName
[success]


DeployしたLambdaの状況を見ます。

Deployしたはいいものの、今、どうなってんの?ってなると思います。

ので、以下のコマンドで、Lambdaそもそも出来てますかー?とか、Publish状況はー?とか、Alias何個つくって、どのpublishとくっついてたっけーとかを確認します。

> listLambdaVersions

=================================================================================================
$name
=================================================================================================
| Last modified | Ver | Description |
|--------------------------------|--------------|-----------------------------------------------|
| 2016-12-09T03:37:36.085+0000 | $LATEST | $projectName |

> listLambdaAliases
=======================================================================================
$name
=======================================================================================
| Alias name | Ver | Description |
|----------------------|--------------|-----------------------------------------------|
| $aliasName | $LATEST | |


Kinesis Streamが存在するか確認します。

Lambdaは出来たので、じゃあ、Kinesis StreamとTriggerしたいんだけど、そもそもどのKinesis StreamとTriggerするんだっけ?、あと、前もって作ってたっけ? ってことよくあると思います。

そんなときに、いちいち、コンソールやCLI実行したくないので、sbtでやれるよーにしました。

そもそも、どのKinesis StreamとTriggerするLambdaだっけ?については、build.sbtで固定化して忘れないようにしておけます。


build.sbt

lazy val sample = (project in file("modules/sample")).

enablePlugins(AWSLambdaTriggerKinesisStreamPlugin).
settings(
...
eventSourceNames := Seq(s"$KinesisStreamName"),
...
)

で、このKinesis Streamあるっけ?というのを確認することができます。

> describeStreams [stageName]

===================================================================================================================================================
$name-$stageName
===================================================================================================================================================
| Stream ARN | Status |
|------------------------------------------------------------------------------------------------------------------------------------|------------|
| arn:aws:kinesis:$region:$awsAccount:stream/$eventSourceNames-$stageName | ACTIVE |

stageName は、テストとか、プロダクションとか環境を指定する感じです。

うちは、環境なんかわけてねーよって方は、何も入力しなくても大丈夫なよーにしてます。


Kinesis StreamとLambdaをtriggerします。

> syncEventSourceMappings [stageName]

[success]


triggerできているか確認します。

> listEventSourceMappings [stageName]

===================================================================================================================================================================================================
arn:aws:lambda:$region:$awsAccount:function:$name:$stageName
===================================================================================================================================================================================================
| Last modified | State | UUID | Event Source Arn |
|--------------------------------|--------------|------------------------------------------|------------------------------------------------------------------------------------------------------|
| Fri Dec 09 12:45:00 JST 2016 | Enabled | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | arn:aws:kinesis:$region:$awsAccount:stream/$eventSourceNames-$stageName |


Kinesisにテストデータをputします。

TODO これあると便利っぽい。だがまだない。のでそのうち作ります。

テストデータは、Lambdaがちゃんと動くよねってことであれば、ある程度、固定的な内容でいけるかなーと。

であれば、build.sbtから参照できるどこかに、テストデータを前もって用意しておいて、以下のよーなコマンドでKinesis StreamにRecordがputされて、Lambdaがちゃんと動いたよねっていうのがmonitaringできると良いなって気がしてます。

> putStreams [stageName]

monitoring...


まとめ

ざくっと手順を書きました。

上記の手順は、開発やテストのときに使っていただいて、本番環境にdeployするときは、上の手順が一通り実行されてもいいかなって思っているのですが、そのあたりは、まだできていません。

過去版とか、ブルーグリーンとか、そのあたりをどうやって保持しようかってーのがけっこー微妙なので、もちょい練ります。

以上です。