Node.js AWS APIGateway Lambda DynamoDB Serverless Docker

ローカル環境でAPIGateway+Lambda+DynamoDBでチャットサービスを作成する【3】:チャットデータをdynamoDBに登録しよう

どーも、シローです。

前回(https://shiro-secret-base.com/?p=1004)に続いて、チャットに接続したユーザ情報や、投稿したメッセージをDynamoDBに登録してみます。

前回の確認

ローカルでWebSocketを立ち上げて、動作確認ができるようになっている前提で進めます。

 

DynamoDBのテーブルをコンテナ起動時に作成するように修正

 

テーブル定義は後ほどsls deployコマンドでも利用できるようにyml形式で記述します。公式 => (https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)

以下のようにファイルを作成します。

 

./serverless/src/dynamodb-tables/UserConnection.yml

./serverless/src/dynamodb-tables/ChatMessage.yml

次に、これらのymlファイルをDockerのコンテナ起動時に読み込んでローカルのDynamoDBのテーブルを作成するためにstartup.shを修正します。

./docker/serverless/startup.sh

再度ビルドし直して、コンテナを再起動します。

NoSQLWorkbenchでローカルのDynamoDBに作成したテーブルを確認

コンテナを再起動すれば、ChatMessageUserConnectionテーブルが作成されているはずです。

実際に確認するにはNoSQLWorkbenchを使います。

インストールはこちら => (https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.settingup.html)

ローカルのDynamoDBに接続する際にはdocker-compose.ymlで指定したローカルのポート番号(8889)を指定するのに注意します。

 

DynamoDB、APIGatewayの利用スクリプトを作成

以下のファイルを./serverless/src/functions配下に作成します。

  • modules/dynamodbClient.js ... DynamoDBを利用するためのクライアントを作成
  • modules/apiGw.js ... APIGatewayを利用するためのクライアントを作成
  • models/UserConnection.js ... チャットに接続しているユーザのテーブルにアクセスする
  • models/ChatMessage.js ... チャットメッセージのテーブルにアクセスする

とその前にnpmで以下のパッケージをインストールします。

  • aws-sdk
  • serverless-offline
  • serverless-websockets-plugin

コンテナに入ってインストールしても良いですが、起動時にインストールできるようにdocker/serverless/startup.shを編集します。

 

models/dynamodbClient.js

modules/apiGw.js

models/UserConnection.js

models/ChatMessage.js

 

チャットに接続・非接続、メッセージを送信するときの処理を修正

前回作成した

  • functions/connect/index.js
  • functions/disconnect/index.js
  • functions/sendMessage/index.js

にUserConnection、ChatMessageテーブルにアクセスする処理を加えていきます。

functions/connect/index.js

functions/disconnect/index.js

functions/sendMessage/index.js

 

動作確認

wscatコマンドでwscat -c 'ws://localhost:3334?userId=1&roomSlug=2'でソケットに接続、

もう片方はuserIdを2に変えて接続

{"action": "sendMessage", "message": "hoge----"} て打つと、もう片方にもメッセージが出力されると思います。

最後に

ここまで見てくれた人に、一応僕の環境で作った成果物をgitにあげましたので、

上手くいかなかったら、プルして見てもいいかもです。
(最初から、それでええやんとか言ってはいけない)

https://github.com/smithshiro/docker-natto-env

AWSによるサーバーレスアーキテクチャ
クラウドコンピューティングの技術の中でも、昨今注目を集めているのがサーバーレスアーキテクチャです。
FaaS(Function-As-A-Service)とも呼ばれるサーバーレスアーキテクチャは、ファンクション(関数)と呼ばれるマイクロサービスを実装し、組み合わせながら、サービスを構築していくアーキテクチャです。
  • この記事を書いた人

シロー

Webシステムの開発のお仕事をさせて頂いております。 フリーランスの日常、Web開発に関する情報を発信しています。 趣味はゲーム、映画鑑賞、個人サービスを作ることです。

-Node.js, AWS, APIGateway, Lambda, DynamoDB, Serverless, Docker

© 2021 Shiro's secret base