sbt-aws-serverlessのサンプルプロジェクトを作りました

[sbt-aws-serverlessプラグインを作った](http://qiita.com/yoshiyoshifujii/items/f7bb8abd56fe9ea33e2d) で公開した Amazon API Gateway + Lambdaのサーバレスアーキテクチャを簡単に実現して公開できちゃうsbtプラグインのサンプルプロジェクトを公開しました。

https://github.com/yoshiyoshifujii/sample-serverless

使い方は、READMEに書いてますが、ここにも書きます。

# API GatewayにREST APIを作成する

まず、API GatewayにREST APIを作成します。

```sh
$ git clone https://github.com/yoshiyoshifujii/sample-serverless.git
$ cd sample-serverless/
$ ./bin/activator -mem 2048 \
  -DAWS_REGION=<Region Name> \
  -DAWS_ACCOUNT_ID=<AWS Account ID> \
  -DAWS_ROLE_ARN=arn:aws:iam::<AWS Account ID>:role/<Role Name> \
  -DAWS_BUCKET_NAME=<Bucket Name> \
  -DAUTH_KEY=hoge
> createApiGateway <name> [description]
ApiGateway created: <Rest APi ID>
[success] ...
```

activatorを起動する際に、環境変数をいろいろと指定していただくようにしていますが、いちいち指定するのが面倒な場合は、build.sbtを編集していただくと固定にできます。

以下の右辺を良い感じにしてください。

```sbt
lazy val regionName = sys.props.getOrElse("AWS_REGION", "")
lazy val accountId = sys.props.getOrElse("AWS_ACCOUNT_ID", "")
lazy val restApiId = sys.props.getOrElse("AWS_REST_API_ID", "")
lazy val roleArn = sys.props.getOrElse("AWS_ROLE_ARN", "")
lazy val bucketName = sys.props.getOrElse("AWS_BUCKET_NAME", "")
lazy val authKey = sys.props.getOrElse("AUTH_KEY", "")
```
# deploy

つぎに、LambdaにDeployします。

```sh
$ ./bin/activator -mem 2048 \
  -DAWS_REGION=<Region Name> \
  -DAWS_ACCOUNT_ID=<AWS Account ID> \
  -DAWS_REST_API_ID=<Rest Api ID> \ # <- add this line
  -DAWS_ROLE_ARN=arn:aws:iam::<AWS Account ID>:role/<Role Name> \
  -DAWS_BUCKET_NAME=<Bucket Name> \
  -DAUTH_KEY=hoge
> deploy
...
Lambda Deploy: arn:aws:lambda:<Region Name>:<AWS Account ID>:function:SampleHello
Publish Lambda: arn:aws:lambda:<Region Name>:<AWS Account ID>:function:SampleHello:1
Create Alias: arn:aws:lambda:<Region Name>:<AWS Account ID>:function:SampleHello:test1
Create Alias: arn:aws:lambda:<Region Name>:<AWS Account ID>:function:SampleHello:production1
Api Gateway Deploy
[success] ...
```

ここでは、build.sbtに指定している、Aliasをまとめて作ってくれます。

また、API Gatewayの統合インテグレーションも良い感じに作成してくれます。

# API Gateway のステージを作成

`test` という名前のステージを作成します。

```sh
> createDeployment test
[success] ...
```

# test

作成したステージや、Lambdaがちゃんと動くか、RESTful APIを叩いて確認します。

この際、HTTPSでアクセスしていますので、アクセスできる環境であることが必要です。

```sh
> testMethod test
test method success.
[success] ...
```

# test以外のステージを作成

公開用とStagingテスト用に、 `v1` と `staging` という名前のステージを作成します。

このとき、先程Deployしたtestステージの `Deployment ID` が必要ですので、先に、 `getDeployments` を実行して確認してから、作成します。

```sh
> getDeployments
=====================================================================================
<Rest Api ID>
=====================================================================================
| Created Date                   | Deployment Id   | Description                    |
|--------------------------------|-----------------|--------------------------------|
| Mon Sep 19 19:56:01 JST 2016   | xxxxxx          | 0.1                            |
[success] ...

> updateStages xxxxxx
[success] ...
```

# curl

最後に、curlでアクセスできれば、公開完了です。

```sh
$ curl -i -X GET https://<Rest Api ID>.execute-api.<Region Name>.amazonaws.com/v1/hellos -H "Authorization:hoge"
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 21
Connection: keep-alive
Date: Mon, 19 Sep 2016 11:47:36 GMT
x-amzn-RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
X-Cache: Miss from cloudfront
Via: 1.1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: xxxxxxx-xxxxxxxxxxxxxxxxxx_xxxxxxxx-xxxxxxxxxxxxxxxxxx==

{"message":"World!!"}%
```

# まとめ

ざっとこんな感じでSampleが実行できます。

`swagger.yaml` を良い感じに作って、Lambdaも良い感じに作れば、どんどんエンドポイントを追加していけます。

ScalaでLambdaを作るのに、良い感じに抽象化した部品も公開できたらなーっておもってますが、おいおいやっていきたいと思います。

以上です。