amazon-qldb-driver-nodejsからQLDBを使う①（接続編）

## QLDBとは

https://aws.amazon.com/jp/qldb/
Amazonが提供するフルマネージド型の台帳データベースです。
ブロックチェーンとは異なり中央集権で管理されます。

データに対する変更は全て記録され、後から確認可能なようです。
また、変更履歴が正確であることを暗号的に検証する機能を提供しています。
https://docs.aws.amazon.com/qldb/latest/developerguide/verification.html

中央集権からトランザクションの実行時にネットワーク参加者の合意を経る必要がないため、一般的なブロックチェーンベースのフレームワークより高いスループットが出るようです。

以上から、「データの信頼性やトレーサビリティを担保したいけど、分散型である必要はない」などの場合にとても魅力的な選択肢になりそうです。


## amazon-qldb-driver-nodejsについて

プログラムからアクセスする場合は現状はJavaのdriverを使うのが主流なようです。
nodejs用のdriverも用意されており、今回はこちらを使ってQLDBにプログラムから接続してみます！
**現在はまだpreviewで本番環境用途に使用するのは推奨していないようですので、ご注意下さい。**

- https://docs.aws.amazon.com/ja_jp/qldb/latest/developerguide/getting-started.nodejs.html
- https://github.com/awslabs/amazon-qldb-driver-nodejs

## 前提

今回のサンプルはAWSのコンソールで台帳およびいくつかテーブルを作成してある状態を前提とします。

筆者の環境では以下のチュートリアルで登録したデータ使って動作確認しました。
https://docs.aws.amazon.com/ja_jp/qldb/latest/developerguide/getting-started.html

チュートリアルは以下の記事が参考になりました。
https://qiita.com/yanyansk/items/586b7f1c86eca4352b44

## IAMユーザのアクセスキーの作成

実装する前にQLDBにアクセスするための認証情報を作成する必要があります。
以下の手順でアクセスキーを発行して下さい。

サービス > IAM > ユーザ からユーザの追加を選択して下さい。

<img width="600" alt="iam_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68322/28fc9a7c-44fc-5b38-3520-731759ab4343.png">

任意のユーザ名を入力して下さい。アクセスの種類は「プログラムによるアクセス」にチェックを入れて下さい。

<img width="600" alt="iam2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68322/2677ac70-e296-6bc5-9335-b405cca3272c.png">

一旦はテストで使用するだけなので、ユーザグループなどは作成せず、ポリシーを直接アタッチします。

<img width="600" alt="iam3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68322/d9271f86-3037-f1ba-930e-9e53b9a5585d.png">

タグなどは特に必要がないので、ユーザーの作成まで完了して下さい。
作成完了の画面で表示される「アクセスキーID」と「シークレットアクセスキー」を控えて下さい。
driverからQLDBにアクセスする際にこの情報を使って認証します。

<img width="600" alt="iam4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68322/e6a0e1f8-2a61-af9d-7f63-9648c7eb3b23.png">


## 実装

### driverや必要なモジュールのinstall

```shell
npm i amazon-qldb-driver-nodejs aws-sdk ion-js typescript
```

### credential情報の編集

「credentials.json」などの名前で以下のファイルを作成してください。

```json
{
  "accessKeyId": "${作成したアクセスキーID}",
  "secretAccessKey": "${作成したシークレットアクセスキー}"
}
```

### 認証部分の実装

#### 認証情報の設定

作成したcredentialのjsonを使って認証します。

```javascript
const AWS = require("aws-sdk");
AWS.config.loadFromPath("./credentials.json");
```

#### Credentialの確認

デバッグしやすいように、Credentialが正しく設定されているか確認するfunctionを追加します。

```javascript
function checkCredential() {
  return new Promise((resolve, reject) => {
    AWS.config.getCredentials(function (err: Error) {
      if (err) {
        return reject(err);
      }
      console.log("Access key:", AWS.config.credentials.accessKeyId);
      console.log("Secret access key:", AWS.config.credentials.secretAccessKey);
      resolve();
    });
  })
}
```

### メインフローの実装

メインの部分を実装していきます。

#### セッションの作成

regionはQLDBを作成したリージョンを設定してください。
PooledQldbDriverの第一引数には作成した台帳の名前を指定して下さい。

```javascript
  const testServiceConfigOptions = {
    region: "{QLDBを作成したリージョン}"
  };
  const qldbDriver: PooledQldbDriver = new PooledQldbDriver("{作成した台帳の名前}", testServiceConfigOptions);
  const qldbSession: QldbSession = await qldbDriver.getSession();
```

#### 台帳上のテーブルの確認

```javascript
  for (const table of await qldbSession.getTableNames()) {
    console.log(table);
  }
```

## 動作確認

実装したコードの全文は以下になります。
こちらを動作確認してみます。

```javascript
import { PooledQldbDriver, QldbSession } from "amazon-qldb-driver-nodejs";

const AWS = require("aws-sdk");
AWS.config.loadFromPath("./credentials.json");

(async () => {

  await checkCredential();

  const testServiceConfigOptions = {
    region: "{QLDBを作成したリージョン}"
  };
  const qldbDriver: PooledQldbDriver = new PooledQldbDriver("{作成した台帳の名前}", testServiceConfigOptions);
  const qldbSession: QldbSession = await qldbDriver.getSession();
  for (const table of await qldbSession.getTableNames()) {
    console.log(table);
  }
})().catch(err => {
  console.error(err);
});

function checkCredential() {
  return new Promise((resolve, reject) => {
    AWS.config.getCredentials(function (err: Error) {
      if (err) {
        return reject(err);
      }
      console.log("Access key:", AWS.config.credentials.accessKeyId);
      console.log("Secret access key:", AWS.config.credentials.secretAccessKey);
      resolve();
    });
  })
}
```

```shell
$ npx tsc main.ts
$ node main.js

Access key: xxxxxxxxxxxxxxxxxx
Secret access key: xxxxxxxxxxxxxxxxxx
VehicleRegistration
DriversLicense
Vehicle
Person
```

無事台帳上のテーブル名が表示されました！
次回は検索やデータの登録について書きたいと思います！

## さいごに

ZEROBILLBANKでは一緒に働く仲間を募集中です。
[ZEROBILLBANK JAPAN Inc.](https://zerobillbank.com/%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b/)