4hei4heiのブログ

主に読書/視聴メモとか、やったことを書こうと思っています。

AWS SAMとDynamoDB-localの連携をさせるまでの話

はじめに

AWS SAMのチュートリアルとして、SAMとDynamoDBを組み合わせたサーバレスアプリケーションについて多くの紹介記事があります。

これをsam local start-apiとDynamoDB-localを使ってローカルで実現する環境を用意したかった、というのが本記事の目的です。

ローカル実行についての記事もあるのかもしれませんが、あまりちゃんと探していないのと、自分でやってみたかったので、ここでは触れていません。

 

やりたかったこと

以下のような構成のものをローカルで実現することを目指しました。

f:id:h-4hei4hei:20220212174321p:plain

作りたかったもの

SAMのローカル実行も厳密にはDockerで稼働しているのでもう少し正確に書くと違った図になるかもしれません。

構成とやりたかったことをまとめると

  • DockerでDynamoDB-localのコンテナを建てる
    • プライマリキーは"Name"(文字列)だけのテーブルを持つ
  •  SAMテンプレートでは、APIとLambda関数を定義
    • 正確にはLambda用のIAM関連リソースも定義
  • Lambda関数は以下の2つを定義
    • 呼び出された時刻をDynamoDBへputする (時刻はNameと紐づく) 関数 
    • Nameをリクエストに含めると、そのNameと紐づいたレコード (=呼び出し時刻) が取得できる関数
  • APIリクエストでDynamoDBに時刻情報をput/時刻情報をgetできるようにする

となります。

 

結果

それらしいものは出来ました。

github.com

立ち上げから片付けまでの流れをこちらに書くと長くなるのでREADMEに記載しています。

所感ですが、APIの準備をするのが初めてだったのでアプリケーション部分を作ることに時間を割かれました。

アプリケーションはヘッダを基にboto3でput_item/get_itemを実行しているだけの作り込みの雑なものなので、もっと作り込む余地はあると思います。

SAMをローカル実行する際に、パラメータでDockerネットワークをDynamoDB-localと同じネットワークに設定することなどが、ハマりポイントになり得るのではないでしょうか。

 

おわりに

今回作成したものは実際にAWS上にリソースを作成することなく、起動させることができるので料金をかけずに遊ぶのに良いのではないでしょうか。

今回の開発に際して、Docker周りのネットワークについての理解が浅いことを痛感しましたので(API開発力の低さは言うまでもありませんが...) 学習の必要性を感じるなどしました。