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

[sbt-aws-serverlessプラグインを作った](http://qiita.com/yoshiyoshifujii/items/f7bb8abd56fe9ea33e2d) って言うてましたが、地味にちょっとずつですが、拡張していってます。

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

# Deploy手順

## LambdaとAliasをDeployします。

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

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

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

```sh
$ 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とくっついてたっけーとかを確認します。

```sh
> 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で固定化して忘れないようにしておけます。

```scala:build.sbt
lazy val sample = (project in file("modules/sample")).
  enablePlugins(AWSLambdaTriggerKinesisStreamPlugin).
  settings(
...
    eventSourceNames := Seq(s"$KinesisStreamName"),
...
  )
```

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

```sh
> describeStreams [stageName]
===================================================================================================================================================
$name-$stageName
===================================================================================================================================================
| Stream ARN                                                                                                                         | Status     |
|------------------------------------------------------------------------------------------------------------------------------------|------------|
| arn:aws:kinesis:$region:$awsAccount:stream/$eventSourceNames-$stageName                                                            | ACTIVE     |
```

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

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

## Kinesis StreamとLambdaをtriggerします。

```sh
> syncEventSourceMappings [stageName]
[success]
```

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

```sh
> 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できると良いなって気がしてます。

```sh
> putStreams [stageName]
monitoring...
```

# まとめ

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

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

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

以上です。