久しぶりにDynamoDB使ってみる
半年前くらいにちょこっと仕事で使ったDynamoDB。費用が安いNoSQLデータベースってことしか分かってないけど
昨日作ったRESTAPIからDynamoDBにデータ登録してみます
DynamoDBテーブル作成
AWSマネジメントコンソールでAPIからデータを登録するテーブルを作成する
ちょっとした日記(嬉しかったこと、悲しかったこと)を記録するアプリを想定しています
記録内容を保持するjournalテーブルを作成しました
試しに「アプリ開発をスタートしたよ」という嬉しかった出来事(eval=10)のデータを入れています(AWSマネジメントコンソールで登録)
APIからDB接続するためのアクセスキーを作成
Java(API)から先ほど作成したDynamoDBテーブルにアクセスするためのアクセスキーを作成する
AWSマネジメントコンソールにてIAM-ユーザーでアクセスキーの作成ボタンを押下すればキーが作成される
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).