ステップ 1: 新しい台帳を作成する - Amazon Quantum Ledger Database (Amazon QLDB)

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

ステップ 1: 新しい台帳を作成する

このステップでは、vehicle-registration という名前の新しい Amazon QLDB 台帳を作成します。

新しい台帳を作成するには
  1. 次のファイル (Constants.java) を確認します。このファイルには、このチュートリアル内の他のすべてのプログラムで使用される定数値が含まれています。

    2.x
    /* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package software.amazon.qldb.tutorial; import com.amazon.ion.IonSystem; import com.amazon.ion.system.IonSystemBuilder; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.ion.IonObjectMapper; import com.fasterxml.jackson.dataformat.ion.ionvalue.IonValueMapper; /** * Constant values used throughout this tutorial. */ public final class Constants { public static final int RETRY_LIMIT = 4; public static final String LEDGER_NAME = "vehicle-registration"; public static final String STREAM_NAME = "vehicle-registration-stream"; public static final String VEHICLE_REGISTRATION_TABLE_NAME = "VehicleRegistration"; public static final String VEHICLE_TABLE_NAME = "Vehicle"; public static final String PERSON_TABLE_NAME = "Person"; public static final String DRIVERS_LICENSE_TABLE_NAME = "DriversLicense"; public static final String VIN_INDEX_NAME = "VIN"; public static final String PERSON_GOV_ID_INDEX_NAME = "GovId"; public static final String VEHICLE_REGISTRATION_LICENSE_PLATE_NUMBER_INDEX_NAME = "LicensePlateNumber"; public static final String DRIVER_LICENSE_NUMBER_INDEX_NAME = "LicenseNumber"; public static final String DRIVER_LICENSE_PERSONID_INDEX_NAME = "PersonId"; public static final String JOURNAL_EXPORT_S3_BUCKET_NAME_PREFIX = "qldb-tutorial-journal-export"; public static final String USER_TABLES = "information_schema.user_tables"; public static final String LEDGER_NAME_WITH_TAGS = "tags"; public static final IonSystem SYSTEM = IonSystemBuilder.standard().build(); public static final IonObjectMapper MAPPER = new IonValueMapper(SYSTEM); private Constants() { } static { MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); } }
    1.x
    重要

    Amazon Ion パッケージの場合、アプリケーションで名前空間 com.amazon.ion を使用する必要があります。AWS SDK for Java は、名前空間 software.amazon.ion の別の Ion パッケージに依存しますが、これは QLDB ドライバーと互換性がないレガシーパッケージです。

    /* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package software.amazon.qldb.tutorial; import com.amazon.ion.IonSystem; import com.amazon.ion.system.IonSystemBuilder; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.ion.IonObjectMapper; import com.fasterxml.jackson.dataformat.ion.ionvalue.IonValueMapper; /** * Constant values used throughout this tutorial. */ public final class Constants { public static final int RETRY_LIMIT = 4; public static final String LEDGER_NAME = "vehicle-registration"; public static final String STREAM_NAME = "vehicle-registration-stream"; public static final String VEHICLE_REGISTRATION_TABLE_NAME = "VehicleRegistration"; public static final String VEHICLE_TABLE_NAME = "Vehicle"; public static final String PERSON_TABLE_NAME = "Person"; public static final String DRIVERS_LICENSE_TABLE_NAME = "DriversLicense"; public static final String VIN_INDEX_NAME = "VIN"; public static final String PERSON_GOV_ID_INDEX_NAME = "GovId"; public static final String VEHICLE_REGISTRATION_LICENSE_PLATE_NUMBER_INDEX_NAME = "LicensePlateNumber"; public static final String DRIVER_LICENSE_NUMBER_INDEX_NAME = "LicenseNumber"; public static final String DRIVER_LICENSE_PERSONID_INDEX_NAME = "PersonId"; public static final String JOURNAL_EXPORT_S3_BUCKET_NAME_PREFIX = "qldb-tutorial-journal-export"; public static final String USER_TABLES = "information_schema.user_tables"; public static final String LEDGER_NAME_WITH_TAGS = "tags"; public static final IonSystem SYSTEM = IonSystemBuilder.standard().build(); public static final IonObjectMapper MAPPER = new IonValueMapper(SYSTEM); private Constants() { } static { MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); } }
    注記

    この Constants クラスには、オープンソースの Jackson IonValueMapper クラスのインスタンスが含まれています。このマッパーを使用して、読み取りおよび書き込みトランザクションを実行するときに Amazon Ion データを処理できます。

    CreateLedger.java ファイルには、台帳の現在のステータスを説明する次のプログラム (DescribeLedger.java) にも依存しています。

    /* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package software.amazon.qldb.tutorial; import com.amazonaws.services.qldb.AmazonQLDB; import com.amazonaws.services.qldb.model.DescribeLedgerRequest; import com.amazonaws.services.qldb.model.DescribeLedgerResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Describe a QLDB ledger. * * This code expects that you have AWS credentials setup per: * http://docs.aws.amazon.com/java-sdk/latest/developer-guide/setup-credentials.html */ public final class DescribeLedger { public static AmazonQLDB client = CreateLedger.getClient(); public static final Logger log = LoggerFactory.getLogger(DescribeLedger.class); private DescribeLedger() { } public static void main(final String... args) { try { describe(Constants.LEDGER_NAME); } catch (Exception e) { log.error("Unable to describe a ledger!", e); } } /** * Describe a ledger. * * @param name * Name of the ledger to describe. * @return {@link DescribeLedgerResult} from QLDB. */ public static DescribeLedgerResult describe(final String name) { log.info("Let's describe ledger with name: {}...", name); DescribeLedgerRequest request = new DescribeLedgerRequest().withName(name); DescribeLedgerResult result = client.describeLedger(request); log.info("Success. Ledger description: {}", result); return result; } }
  2. CreateLedger.java プログラムをコンパイルして実行し、vehicle-registration という名前の台帳を作成します。

    2.x
    /* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package software.amazon.qldb.tutorial; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.qldb.AmazonQLDB; import com.amazonaws.services.qldb.AmazonQLDBClientBuilder; import com.amazonaws.services.qldb.model.CreateLedgerRequest; import com.amazonaws.services.qldb.model.CreateLedgerResult; import com.amazonaws.services.qldb.model.DescribeLedgerResult; import com.amazonaws.services.qldb.model.LedgerState; import com.amazonaws.services.qldb.model.PermissionsMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Create a ledger and wait for it to be active. * <p> * This code expects that you have AWS credentials setup per: * http://docs.aws.amazon.com/java-sdk/latest/developer-guide/setup-credentials.html */ public final class CreateLedger { public static final Logger log = LoggerFactory.getLogger(CreateLedger.class); public static final Long LEDGER_CREATION_POLL_PERIOD_MS = 10_000L; public static String endpoint = null; public static String region = null; public static AmazonQLDB client = getClient(); private CreateLedger() { } /** * Build a low-level QLDB client. * * @return {@link AmazonQLDB} control plane client. */ public static AmazonQLDB getClient() { AmazonQLDBClientBuilder builder = AmazonQLDBClientBuilder.standard(); if (null != endpoint && null != region) { builder.setEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, region)); } return builder.build(); } public static void main(final String... args) throws Exception { try { client = getClient(); create(Constants.LEDGER_NAME); waitForActive(Constants.LEDGER_NAME); } catch (Exception e) { log.error("Unable to create the ledger!", e); throw e; } } /** * Create a new ledger with the specified ledger name. * * @param ledgerName Name of the ledger to be created. * @return {@link CreateLedgerResult} from QLDB. */ public static CreateLedgerResult create(final String ledgerName) { log.info("Let's create the ledger with name: {}...", ledgerName); CreateLedgerRequest request = new CreateLedgerRequest() .withName(ledgerName) .withPermissionsMode(PermissionsMode.ALLOW_ALL); CreateLedgerResult result = client.createLedger(request); log.info("Success. Ledger state: {}.", result.getState()); return result; } /** * Wait for a newly created ledger to become active. * * @param ledgerName Name of the ledger to wait on. * @return {@link DescribeLedgerResult} from QLDB. * @throws InterruptedException if thread is being interrupted. */ public static DescribeLedgerResult waitForActive(final String ledgerName) throws InterruptedException { log.info("Waiting for ledger to become active..."); while (true) { DescribeLedgerResult result = DescribeLedger.describe(ledgerName); if (result.getState().equals(LedgerState.ACTIVE.name())) { log.info("Success. Ledger is active and ready to use."); return result; } log.info("The ledger is still creating. Please wait..."); Thread.sleep(LEDGER_CREATION_POLL_PERIOD_MS); } } }
    1.x
    /* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package software.amazon.qldb.tutorial; import com.amazonaws.services.qldb.AmazonQLDB; import com.amazonaws.services.qldb.AmazonQLDBClientBuilder; import com.amazonaws.services.qldb.model.CreateLedgerRequest; import com.amazonaws.services.qldb.model.CreateLedgerResult; import com.amazonaws.services.qldb.model.DescribeLedgerResult; import com.amazonaws.services.qldb.model.LedgerState; import com.amazonaws.services.qldb.model.PermissionsMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Create a ledger and wait for it to be active. * * This code expects that you have AWS credentials setup per: * http://docs.aws.amazon.com/java-sdk/latest/developer-guide/setup-credentials.html */ public final class CreateLedger { public static final Logger log = LoggerFactory.getLogger(CreateLedger.class); public static final Long LEDGER_CREATION_POLL_PERIOD_MS = 10_000L; public static AmazonQLDB client = getClient(); private CreateLedger() { } /** * Build a low-level QLDB client. * * @return {@link AmazonQLDB} control plane client. */ public static AmazonQLDB getClient() { return AmazonQLDBClientBuilder.standard().build(); } public static void main(final String... args) throws Exception { try { create(Constants.LEDGER_NAME); waitForActive(Constants.LEDGER_NAME); } catch (Exception e) { log.error("Unable to create the ledger!", e); throw e; } } /** * Create a new ledger with the specified ledger name. * * @param ledgerName * Name of the ledger to be created. * @return {@link CreateLedgerResult} from QLDB. */ public static CreateLedgerResult create(final String ledgerName) { log.info("Let's create the ledger with name: {}...", ledgerName); CreateLedgerRequest request = new CreateLedgerRequest() .withName(ledgerName) .withPermissionsMode(PermissionsMode.ALLOW_ALL); CreateLedgerResult result = client.createLedger(request); log.info("Success. Ledger state: {}.", result.getState()); return result; } /** * Wait for a newly created ledger to become active. * * @param ledgerName * Name of the ledger to wait on. * @return {@link DescribeLedgerResult} from QLDB. * @throws InterruptedException if thread is being interrupted. */ public static DescribeLedgerResult waitForActive(final String ledgerName) throws InterruptedException { log.info("Waiting for ledger to become active..."); while (true) { DescribeLedgerResult result = DescribeLedger.describe(ledgerName); if (result.getState().equals(LedgerState.ACTIVE.name())) { log.info("Success. Ledger is active and ready to use."); return result; } log.info("The ledger is still creating. Please wait..."); Thread.sleep(LEDGER_CREATION_POLL_PERIOD_MS); } } }
    注記
    • createLedger の呼び出しで、台帳名とアクセス許可モードを指定する必要があります。台帳データのセキュリティを最大化する、STANDARD のアクセス許可モードの使用を推奨します。

    • 台帳を作成すると、デフォルトで削除保護が有効になります。これは QLDB の機能であり、ユーザーによって台帳が削除されるのを防ぎます。QLDB API または AWS Command Line Interface (AWS CLI) を使用して、台帳作成時に削除保護を無効にすることもできます。

    • 必要に応じて、台帳にアタッチするタグを指定することもできます。

新しい台帳への接続を確認するには、「ステップ 2: 台帳への接続をテストする」に進みます。