sbt-aws-serverlessプラグインを作った で公開した Amazon API Gateway + Lambdaのサーバレスアーキテクチャを簡単に実現して公開できちゃうsbtプラグインのサンプルプロジェクトを公開しました。
使い方は、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テスト用に、 v1
と staging
という名前のステージを作成します。
このとき、先程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を作るのに、良い感じに抽象化した部品も公開できたらなーっておもってますが、おいおいやっていきたいと思います。
以上です。