AWS

Lambda(Python)でDynamoDB localに接続してみた

AWS
この記事は約6分で読めます。

はじめに

インプルの矢島です。

いきなりですが、DynamoDBを触りたいけど、「利用料金かかるから試せないな〜」と思ったことはありませんか?

思っているそこのあなたへ!

DynamoDB Localというツールがあり、その名の通り、DynamoDBをローカル環境で無料でお試しすることができます。

今回はDynamoDB Localを使ってデータを格納するところまで試していきたいと思います。

やること

  • DynamoDB Localの環境構築
  • sam initで展開されたコードにDynamoDBの操作のコードを書く
  • ローカル環境にて動作確認する

DynamoDB Local環境構築

最終的に下記の構成を作ることに決めました。

├── README.md
├── docker-compose.yml
└── serverless_python
    ├── README.md
    ├── __init__.py
    ├── events
    ├── src
    ├── template.yaml
    └── tests

serveless_pythonディレクトリ以下はsam initされた時のコードとなります。こちらはご自身でコマンドを叩いて構築をお願いいたします。(参考【初心者向け】AWS SAMを使ってAPI GatewayとLambdaのデプロイとローカルで検証してみた

docker-compose.ymlを作成して以下のコードを記述してください。

version: '3'

networks:
  container-link:
    name: docker.internal
    external: true

services:
  dynamodb-local:
    image: amazon/dynamodb-local:latest
    container_name: dynamodb
    user: root
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath /data  # 永続化するデータのファイルパス
    networks:
      - container-link
    volumes:
      - ./dynamodb_data:/data  # データの永続化
    ports:
      - 8000:8000
    tty: true
    
  dynamodb-admin:
    image: aaronshaf/dynamodb-admin:latest
    container_name: dynamodb-admin
    environment:
      - DYNAMO_ENDPOINT=dynamodb-local:8000
    networks:
      - container-link
    ports:
      - 8001:8001
    depends_on:
      - dynamodb-local

次に下記コマンドでコンテナを起動します。

docker compose up -d //バックグラウンドで起動

dynamodb-adminはローカル環境でdbの情報をGUIで確認するためのツールです。
ローカル環境ではマネジメントコンソールもないので、とても便利ですので一緒に活用することをおすすめします。

導入してhttp://localhost:8001を叩くと、下記のような画面が開くと思います。

こちらの画面から色々操作が可能となります。

Lambdaのコードを編集する

sam initで生成されたapp.pyを下記のように書き換えます。

import json
import boto3
from datetime import datetime
# import requests


def lambda_handler(event, context):

    # DynamoDBクライアントを作成する
    dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb:8000")
    table_name = 'Users'
    table = dynamodb.Table(table_name)

    id = 'user001'
    created_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    # テーブルにデータをインサートする
    item = {
        'id': id,
        'created_at': created_at
    }
    response = table.put_item(Item=item)

    return {
        "statusCode": 200,
        "body" : response
    }

endpoint_urlはhttp://(dyanmodbのコンテナ名):(指定したport)で接続します。

コードは適当ですが、お許しください。(笑)

試してみる

それでは実際に動作を確認していきます。

テーブルを作成

下記コマンドを使ってUsersテーブルを作成します。

aws dynamodb create-table \
--table-name Users \
--attribute-definitions \
AttributeName=id,AttributeType=S \
AttributeName=created_at,AttributeType=S \
--key-schema \
AttributeName=id,KeyType=HASH \
AttributeName=created_at,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
--endpoint-url http://localhost:8000

作成に成功したら、dyanmodb-adminからも新たにテーブルが生成されていることを確認できると思います。

curlでLambdaを呼び出してみる

それでは、実際にLambda関数を呼び出してDynamoDBにデータが入るか確認してみましょう。

まず、localでlambdaを起動できるようにします。
※docker-networkでdynamodb localのコンテナのネットワークを指定することで、sam cliで起動したlambda関数から、dynamodb localを呼び出すことができます。

cd serverless_python
sam build 
sam local start-api --docker-network docker.internal

次にcurlでapiを叩いてみます。

curl http://127.0.0.1:3000/hello

そしてdynamodb-adminよりデータが格納されていることを確認します。

無事格納されていましたね!

おわり

いかがでしたでしょうか。

ローカルでも簡単に動作確認することができましたね。

local stackでも同様に無料でdynamoDBを試せそうですね。またの機会で試してみたいと思います。

参考

【DynamoDB Local】DynamoDBをローカルで使用する方法
この記事ではローカルで完結するDynamoDBの開発環境を docker-compose を用いて開発します。また、boto3を用いて、pythonにてDynamoDBを操作する方法も述べます。
SAM Localを利用してLocalで動かしているAWS Lambda からdynamodb-localにアクセスする方法 - Qiita
この記事に書かれていることSAM CLIの環境構築方法SAM CLIを使ってLocalでLambdaを起動する方法SAM CLIを使ってLocalで起動しているLambdaから、Localで用…