こんにちは。
日々の業務ではインフラをやっています@hayaosatoです。
約1ヶ月前になりますが、AWS re:Invent2018にてAWS Lambda(以下Lambdaと表記します)の多くのアップデートがありましたね。
ランタイムの追加とLambda Layersが追加されたということで、それらを踏まえて今回はサーバレスのWebアプリケーションを作成してみたいと思います。
作るもの
サーバレスなWebアプリケーションとして、構成は以下のようなります。
AWS Lambda
今回作るLambda関数としては、API Gatewayからのリクエストに対して以下のhashを返す必要があります
{
statusCode: 200,
headers: {
Content-Type: 'text/html'
},
body: 'コンテンツ'
}
また、関数の更新は aws lambda
コマンドによって行いました。かなり便利ですね。
$ zip -r main.zip lambda_function.rb vendor
$ aws lambda update-function-code --function-name $FUNCTION_NAME --zip-file fileb://./lambda_function.zip
$ aws lambda update-function-configuration --function-name $FUNCTION_NAME --handler lambda_function.lambda_handler
Lambda Layers
Lambda Layersという機能の追加によってLambdaの関数が分割でき再利用しやすくなりました。
とりあえず使ってみたかったので今回はよくあるSlack通知をLayerに追加してみます。
また、Lambda Layerの追加も aws lambda
コマンドによって可能です
(※ 僕みたいにawscliのバージョンを上げ忘れてハマらないようにしましょう)
$ aws lambda publish-layer-version --layer-name $LAYER_NAME --zip-file fileb://./layer.zip --compatible-runtimes ruby2.5
$ aws lambda update-function-configuration --function-name $FUNCTION_NAME --layers $LAYER_ARN
これで追加したLambda Layerはrequireできるようになったので
require '/opt/layer'
のようみ読み込んで使用できます。
(絶対パスで読み込まないと動かなかったのですが、何か設定抜けてたりするんですかね。。。)
API Gateway
あとはAPI Gatewayを使ってデプロイするだけです。
GETリクエスト時にLambdaを実行すうように設定して、ステージの作成でデプロイ完成です。
最後に
Lambdaはかなり今後の展開が楽しみで、インフラをやっておきながらサーバレスにはかなり期待しています。
皆さんもぜひ試してみてください。
参考
- https://aws.amazon.com/jp/getting-started/serverless-web-app/
- https://docs.aws.amazon.com/cli/latest/reference/lambda/index.html#cli-aws-lambda
- https://qiita.com/kimihiro_n/items/15cce90ec93625c4445a
- https://qiita.com/rinjin5th/items/efffaea65f5488495d86
- https://qiita.com/mochizukikotaro/items/b980d28ee492c40aa145