

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Kinesis での QLDB ストリーミングレコード
<a name="streams.records"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を Amazon Aurora PostgreSQL に移行する](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)」を参照してください。

Amazon QLDB ストリーミングは、**コントロール、**ブロックサマリー、および**リビジョンの詳細という 3 種類のデータレコードを指定の Amazon Kinesis Data Streams リソースに書き込みます。3 つのレコードタイプはすべて、[Amazon Ion 形式](ion.md)の**バイナリ表現で記述されます。

コントロールレコードは、QLDB ストリーミングの開始と完了を示します。QLDB ストリーミングは、リビジョンがジャーナルにコミットされるたびに、関連するすべてのジャーナルブロックデータをブロックサマリーおよびリビジョンの詳細レコードに書き込みます。

3 つのレコードタイプは多相型です。これらはすべて、QLDB ストリーミング ARN、レコードタイプ、およびレコードペイロードを含む共通の最上位レコードで構成されます。この最上位レベルのレコードは、次の形式になります。

```
{
  qldbStreamArn: string,
  recordType: string,
  payload: {
    //control | block summary | revision details record
  }
}
```

`recordType` フィールドには、次の 3 つの値のいずれかを指定できます。
+ `CONTROL`
+ `BLOCK_SUMMARY`
+ `REVISION_DETAILS`

次のセクションでは、個々のペイロードレコードの形式と内容について説明します。

**注記**  
QLDB は、Amazon Ion のバイナリ表現で Kinesis Data Streams にすべてのストリーミングレコードを書き込みます。以下の例は、Ion のテキスト表現で、レコードの内容を読みやすい形式で説明しています。

**Topics**
+ [コントロールレコード](#streams.records.control)
+ [ブロックサマリーレコード](#streams.records.block)
+ [リビジョン詳細レコード](#streams.records.revision)
+ [重複レコードと順序が正しくないレコードの処理](#streams.records.ordering)

## コントロールレコード
<a name="streams.records.control"></a>

QLDB ストリーミングは、開始イベントと完了イベントを示す**コントロールレコードを書き込みます。次に、それぞれの `controlRecordType` のサンプルデータを含むコントロールレコードの例を示します。
+ `CREATED` - 新しく作成されたストリーミングがアクティブであることを示すために、QLDB ストリーミングが Kinesis に書き込む最初のレコード。

  ```
  {
    qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
    recordType:"CONTROL",
    payload:{
      controlRecordType:"CREATED"
    }
  }
  ```
+ `COMPLETED` - ストリーミングが指定された終了日時に達したこと示すために、QLDB ストリーミングが Kinesis に書き込む最後のレコード。ストリームをキャンセルすると、このレコードは書き込まれません。

  ```
  {
    qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
    recordType:"CONTROL",
    payload:{
      controlRecordType:"COMPLETED"
    }
  }
  ```

## ブロックサマリーレコード
<a name="streams.records.block"></a>

*ブロックサマリー*レコードは、ドキュメントのリビジョンがコミットされるジャーナルブロックを表します。[ブロック](journal-contents.md)は、トランザクション中に QLDB ジャーナルにコミットされるオブジェクトです。

ブロックサマリーレコードのペイロードには、ブロックをコミットしたトランザクションのブロックアドレス、タイムスタンプ、およびその他のメタデータが含まれます。また、ブロック内のリビジョンのサマリー属性と、それらをコミットした PartiQL ステートメントも含まれます。以下は、サンプルデータを含むブロックサマリーレコードの例です。

**注記**  
このブロックサマリーの例は、情報提供のみを目的として記載されています。示されているハッシュは、実際に計算されたハッシュ値ではありません。

```
{
  qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
  recordType:"BLOCK_SUMMARY",
  payload:{
    blockAddress:{
      strandId:"ElYL30RGoqrFCbbaQn3K6m",
      sequenceNo:60807
    },
    transactionId:"9RWohCo7My4GGkxRETAJ6M",
    blockTimestamp:2019-09-18T17:00:14.601000001Z,
    blockHash:{{6Pk9KDYJd38ci09oaHxx0D2grtgh4QBBqbDS6i9quX8=}},
    entriesHash:{{r5YoH6+NXDXxgoRzPREGAWJfn73KlZE0eTfbTxZWUDU=}},
    previousBlockHash:{{K3ti0Agk7DEponywKcQCPRYVHb5RuyxdmQFTfrloptA=}},
    entriesHashList:[
      {{pbzvz6ofJC7mD2jvgfyrY/VtR01zIZHoWy8T1VcxlGo=}},
      {{k2brC23DLMercmiOWHiURaGwHu0mQtLzdNPuviE2rcs=}},
      {{hvw1EV8k4oOkIO36kblO/+UUSFUQqCanKuDGr0aP9nQ=}},
      {{ZrLbkyzDcpJ9KWsZMZqRuKUkG/czLIJ4US+K5E31b+Q=}}
    ],
    transactionInfo:{
      statements:[
        {
          statement:"SELECT * FROM Person WHERE GovId = ?",
          startTime:2019-09-18T17:00:14.587Z,
          statementDigest:{{p4Dn0DiuYD3Xm9UQQ75YLwmoMbSfJmopOmTfMnXs26M=}}
        },
        {
          statement:"INSERT INTO Person ?",
          startTime:2019-09-18T17:00:14.594Z,
          statementDigest:{{klMLkLfa5VJqk6JUPtHkQpOsDdG4HmuUaq/VaApQflU=}}
        },
        {
          statement:"INSERT INTO VehicleRegistration ?",
          startTime:2019-09-18T17:00:14.598Z,
          statementDigest:{{B0gO9BWVNrzRYFoe7t+GVLpJ6uZcLKf5t/chkfRhspI=}}
        }
      ],
      documents:{
        '7z2OpEBgVCvCtwvx4a2JGn':{
          tableName:"Person",
          tableId:"LSkFkQvkIOjCmpTZpkfpn9",
          statements:[1]
        },
        'K0FpsSLpydLDr7hi6KUzqk':{
          tableName:"VehicleRegistration",
          tableId:"Ad3A07z0ZffC7Gpso7BXyO",
          statements:[2]
        }
      }
    },
    revisionSummaries:[
      {
        hash:{{uDthuiqSy4FwjZssyCiyFd90XoPSlIwomHBdF/OrmkE=}},
        documentId:"7z2OpEBgVCvCtwvx4a2JGn"
      },
      {
        hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}},
        documentId:"K0FpsSLpydLDr7hi6KUzqk"
      }
    ]
  }
}
```

`revisionSummaries` フィールドでは、一部のリビジョンに `documentId` がない場合があります。これらは、ユーザーデータを含まない内部のみのシステムリビジョンです。これらのリビジョンのハッシュはジャーナルのハッシュチェーン全体の一部であるため、QLDB ストリームでは、リビジョンが対応するブロックサマリーレコードに含まれます。暗号検証には、完全なハッシュチェーンが必要です。

次のセクションで説明するように、ドキュメント ID を持つリビジョンだけが、個別のリビジョン詳細レコードで発行されます。

## リビジョン詳細レコード
<a name="streams.records.revision"></a>

*リビジョン詳細*レコードは、ジャーナルにコミットされたドキュメントのリビジョンを表します。ペイロードには、リビジョンの[コミットされたビュー](working.metadata.md)のすべての属性と、関連付けられたテーブル名とテーブル ID が含まれます。次に、サンプルデータを含むリビジョンレコードの例を示します。

```
{
  qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy",
  recordType:"REVISION_DETAILS",
  payload:{
    tableInfo:{
      tableName:"VehicleRegistration",
      tableId:"Ad3A07z0ZffC7Gpso7BXyO"
    },
    revision:{
      blockAddress:{
        strandId:"ElYL30RGoqrFCbbaQn3K6m",
        sequenceNo:60807
      },
      hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}},
      data:{
        VIN:"1N4AL11D75C109151",
        LicensePlateNumber:"LEWISR261LL",
        State:"WA",
        City:"Seattle",
        PendingPenaltyTicketAmount:90.25,
        ValidFromDate:2017-08-21,
        ValidToDate:2020-05-11,
        Owners:{
          PrimaryOwner:{PersonId:"7z2OpEBgVCvCtwvx4a2JGn"},
          SecondaryOwners:[]
        }
      },
      metadata:{
        id:"K0FpsSLpydLDr7hi6KUzqk",
        version:0,
        txTime:2019-09-18T17:00:14.602Z,
        txId:"9RWohCo7My4GGkxRETAJ6M"
      }
    }
  }
}
```

## 重複レコードと順序が正しくないレコードの処理
<a name="streams.records.ordering"></a>

QLDB ストリーミングは、重複レコードおよび順序が正しくないレコードを Kinesis Data Streams に発行する場合があります。したがって、コンシューマーアプリケーションは、そのようなシナリオを特定して処理するために、独自のロジックを実装する必要があります。ブロックサマリーレコードとリビジョン詳細レコードには、この目的で使用できるフィールドが含まれます。これらのフィールドは、ダウンストリームサービスの機能と組み合わせて、一意の ID とレコードの厳密な順序の両方を示すことができます。

例えば、QLDB を OpenSearch インデックスと統合して、ドキュメントの全文検索機能を提供するストリーミングを考えてみます。このユースケースでは、ドキュメントの古い (順序が正しくない) リビジョンのインデックスを作成しないようにする必要があります。順序付けと重複排除を適用するには、OpenSearch のドキュメント ID および外部バージョンフィールドと、リビジョンの詳細レコードのドキュメント ID およびバージョンフィールドを使用します。

QLDB を Amazon OpenSearch Service と統合するサンプルアプリケーションの重複除外ロジックの例については、GitHub リポジトリ ([aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python](https://github.com/aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python)) を参照してください。