buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

Java DynamoDB接続

久しぶりにDynamoDB使ってみる

半年前くらいにちょこっと仕事で使ったDynamoDB。費用が安いNoSQLデータベースってことしか分かってないけど

昨日作ったRESTAPIからDynamoDBにデータ登録してみます

DynamoDBテーブル作成

AWSマネジメントコンソールでAPIからデータを登録するテーブルを作成する

ちょっとした日記(嬉しかったこと、悲しかったこと)を記録するアプリを想定しています

記録内容を保持するjournalテーブルを作成しました

試しに「アプリ開発をスタートしたよ」という嬉しかった出来事(eval=10)のデータを入れています(AWSマネジメントコンソールで登録) f:id:butorisa:20201227220256p:plain

APIからDB接続するためのアクセスキーを作成

JavaAPI)から先ほど作成したDynamoDBテーブルにアクセスするためのアクセスキーを作成する

AWSマネジメントコンソールにてIAM-ユーザーでアクセスキーの作成ボタンを押下すればキーが作成される

AWS CLIの設定ファイルにアクセスキーを記述

AWS CLIのインストール手順はこちら

brewでAWS CLIのインストール

インストールすると~/.aws/configという設定ファイルが作成されるのでこのファイルに先ほどのアクセスキーを記述する

[default]
aws_access_key_id=アクセスキー
aws_secret_access_key=シークレットアクセスキー
region=us-east-1

JavaからDynamoDBにアクセスする

build.gradle
dependencies {
    /* dynamoDB */
    implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.926')
    implementation 'com.amazonaws:aws-java-sdk-dynamodb'
}
application.yml

credential.profile:defaultは先ほど編集した~/.aws/configファイルのdefault部分を指します

amazon:
  dynamodb:
    endpoint: https://dynamodb.ap-northeast-1.amazonaws.com
  credential:
    profile: default
DBConfigクラス

こちらの記事のクラスをコピペしたが、@EnableDynamoDBRepositoriesが見つからずエラーになるので一旦消す

Spring Data DynamoDBでSpringからDynamoDBにアクセスする

Controllerクラス
package com.calico.controller;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
import com.amazonaws.services.dynamodbv2.model.PutItemResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class JournalController {

    private static AmazonDynamoDB amazonDynamoDB = AmazonDynamoDBClientBuilder.standard().build();

    /**
     * 記録の登録
     *
     * @param request 記録(画面入力値)
     * @return response 登録結果
     */
    @RequestMapping(value = "/journals", method = RequestMethod.POST)
    public PutItemResult postJournal(@RequestBody journalRequest request) {
        Map<String, AttributeValue> registerData = new HashMap<>();
        registerData.put("user_id", new AttributeValue().withS(request.user()));
        registerData.put("category", new AttributeValue().withS(request.category().name()));
        registerData.put("eval", new AttributeValue().withS(String.valueOf(request.eval())));
        registerData.put("memo", new AttributeValue().withS(request.memo()));

        long currentTime = System.currentTimeMillis();
        registerData.put("register_date", new AttributeValue().withS(String.valueOf(currentTime)));
        registerData.put("update_date", new AttributeValue().withS(String.valueOf(currentTime)));

        // データ登録処理
        PutItemResult registerResult = amazonDynamoDB.putItem(new PutItemRequest("journal", registerData));
        return registerResult;
    }

    /**
     * 記録登録APIリクエストRecords
     *
     * @param user     ユーザーID
     * @param category 記録カテゴリー
     * @param eval     記録内容のポジティブ度(0-10 ポジティブになるほど値が大きくなる)
     * @param memo     記録内容
     */
    public record journalRequest(String user, Categories category, int eval, String memo) {
    }

    /**
     * 記録登録APIレスポンスRecords
     */
    public record journalResponse(String user, Categories category, int eval, String memo) {
        public String getUser() {
            return user;
        }

        public Categories getCategory() {
            return category;
        }

        public int getEval() {
            return eval;
        }

        public String getMemo() {
            return memo;
        }
    }

    /**
     * 記録カテゴリー
     */
    public enum Categories {
        Home,
        Job,
        Community,
        Other
    }
}

そしてハマる。

ビルドは通るのですが、SpringBootアプリケーションを実行するとDBドライバ設定がされてないエラーが出ます

application.ymlにspring.datasourceを設定すれば良さそうだけど、お手本が見つからない…明日調べます

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).