Posted at

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

More than 3 years have passed since last update.

sbt-aws-serverlessプラグインを作った で公開した Amazon API Gateway + Lambdaのサーバレスアーキテクチャを簡単に実現して公開できちゃうsbtプラグインのサンプルプロジェクトを公開しました。

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

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


API GatewayにREST APIを作成する

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

$ 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を編集していただくと固定にできます。

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

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します。

$ ./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 という名前のステージを作成します。

> createDeployment test

[success] ...


test

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

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

> testMethod test

test
method success.
[success] ...


test以外のステージを作成

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

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

> 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でアクセスできれば、公開完了です。

$ 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を作るのに、良い感じに抽象化した部品も公開できたらなーっておもってますが、おいおいやっていきたいと思います。

以上です。