Azure Cosmos DB Java SDK for Java 用暗号化プラグイン ライブラリ
Azure Cosmos Encryption プラグインは、Cosmos DB に保存してデータベースから読み戻すときに暗号化を解除する前に、ユーザーが指定したキーを使用してデータを暗号化するために使用されます。
ソースコード | パッケージ (Maven) | API リファレンス ドキュメント | 製品ドキュメント | サンプル
作業の開始
パッケージを組み込む
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-cosmos-encryption</artifactId>
<version>2.6.0</version>
</dependency>
以前のリリースについては、maven Central を参照してください
パッケージの詳細については 、javadocs を参照してください
前提条件
- バージョン 8 以降の Java Development Kit (JDK)
- アクティブな Azure アカウントアカウントがない場合、Azure 試用版にサインアップして、最大 10 件の無料 Mobile Apps を入手できます。 お持ちでない場合は、 無料アカウントにサインアップしてください。 または、Azure Cosmos DB Emulator を使用して、開発とテストを行うこともできます。 エミュレーターの HTTPS 証明書は自己署名されているため、こちらの説明に従って、その証明書を Java の信頼された証明書ストアにインポートする必要があります
- (省略可能) ログ記録ファサードの SLF4J。
- (省略可能) SLF4J バインディング を使用して、特定のログ記録フレームワークを SLF4J と関連付けます。
- (省略可能) Maven
SLF4J は、ログ記録を使用する場合にのみ必要です。また、SLF4J API と選択したログ記録の実装をリンクする SLF4J バインディングもダウンロードしてください。 詳細については、SLF4J のユーザー マニュアルを参照してください。
SDK には、Reactor Core ベースの非同期 API が用意されています。 リアクタ コアと Flux/Mono の種類の詳細については、こちらを参照してください。
主要な概念
Azure Cosmos Encryption プラグインは、Cosmos DB に保存してデータベースから読み戻すときに暗号化を解除する前に、ユーザーが指定したキーを使用してデータを暗号化するために使用されます。 その下には、Azure Cosmos DB SQL API にアクセスするためのクライアント側の論理表現を提供する Azure Cosmos DB Java SDK が使用されます。 Cosmos DB アカウントには 0 個以上のデータベースが含まれており、データベース (DB) には 0 個以上のコンテナーが含まれており、コンテナーには 0 個以上の項目が含まれています。 データベース、コンテナー、および項目の詳細 については、こちらを参照してください。 コンテナーのレベルでいくつかの重要なプロパティが定義されています。その中には、プロビジョニングされたスループットとパーティション キーがあります。
例
次のセクションでは、次のような最も一般的な Cosmos Encryption API タスクをいくつか取り上げたいくつかのコード スニペットを示します。
Cosmos Encryption クライアントを作成する
// Create a new CosmosEncryptionAsyncClient
CosmosAsyncClient cosmosAsyncClient = new CosmosClientBuilder()
.endpoint("<YOUR ENDPOINT HERE>")
.key("<YOUR KEY HERE>")
.buildAsyncClient();
KeyEncryptionKeyClientBuilder keyEncryptionKeyClientBuilder = new KeyEncryptionKeyClientBuilder().credential(tokenCredentials);
CosmosEncryptionAsyncClient cosmosEncryptionAsyncClient =
new CosmosEncryptionClientBuilder().cosmosAsyncClient(cosmosAsyncClient).keyEncryptionKeyResolver(
keyEncryptionKeyClientBuilder).keyEncryptionKeyResolverName(CosmosEncryptionClientBuilder.KEY_RESOLVER_NAME_AZURE_KEY_VAULT).buildAsyncClient();
Cosmos Encryption データベースを作成する
最初にデータベースを作成し、前の例で作成した Cosmos 暗号化クライアントを使用する必要があります。次のように Cosmos 暗号化データベース プロキシ オブジェクトを作成できます。
// This will create a database with the regular cosmosAsyncClient.
CosmosEncryptionAsyncDatabase cosmosEncryptionAsyncDatabase = cosmosEncryptionAsyncClient.getCosmosAsyncClient()
.createDatabaseIfNotExists("<YOUR DATABASE NAME>")
// TIP: Our APIs are Reactor Core based, so try to chain your calls
.map(databaseResponse ->
// Get a reference to the encryption database
// This will create a cosmos encryption database proxy object.
cosmosEncryptionAsyncClient.getCosmosEncryptionAsyncDatabase(databaseResponse.getProperties().getId()))
.block(); // Blocking for demo purposes (avoid doing this in production unless you must)
Cosmos Encryption コンテナーを作成する
最初に ClientEncryptionPolicy を使用してコンテナーを作成し、前の例で作成した Cosmos 暗号化データベース オブジェクトを使用して、次のように Cosmos 暗号化コンテナー プロキシ オブジェクトを作成する必要があります。
//Create Client Encryption Key
EncryptionKeyWrapMetadata metadata = new EncryptionKeyWrapMetadata(this.cosmosEncryptionAsyncClient.getKeyEncryptionKeyResolverName(), "key", "tempmetadata", EncryptionAlgorithm.RSA_OAEP.toString());
CosmosEncryptionAsyncContainer cosmosEncryptionAsyncContainer = cosmosEncryptionAsyncDatabase
.createClientEncryptionKey("key", CosmosEncryptionAlgorithm.AEAD_AES_256_CBC_HMAC_SHA256.getName(), metadata)
// TIP: Our APIs are Reactor Core based, so try to chain your calls
.then(Mono.defer(() -> {
//Create Encryption Container
ClientEncryptionIncludedPath includedPath = new ClientEncryptionIncludedPath();
includedPath.setClientEncryptionKeyId("key");
includedPath.setPath("/sensitiveString");
includedPath.setEncryptionType(CosmosEncryptionType.DETERMINISTIC.toString());
includedPath.setEncryptionAlgorithm(CosmosEncryptionAlgorithm.AEAD_AES_256_CBC_HMAC_SHA256.getName());
List<ClientEncryptionIncludedPath> paths = new ArrayList<>();
paths.add(includedPath);
ClientEncryptionPolicy clientEncryptionPolicy = new ClientEncryptionPolicy(paths);
CosmosContainerProperties properties = new CosmosContainerProperties("<YOUR CONTAINER NAME>", "/mypk");
properties.setClientEncryptionPolicy(clientEncryptionPolicy);
return cosmosEncryptionAsyncDatabase.getCosmosAsyncDatabase().createContainer(properties);
}))
.map(containerResponse ->
// Create a reference to the encryption container
// This will create a cosmos encryption container proxy object.
cosmosEncryptionAsyncDatabase.getCosmosEncryptionAsyncContainer(containerResponse.getProperties().getId()))
.block(); // Blocking for demo purposes (avoid doing this in production unless you must)
アイテムに対する CRUD 操作
// Create an item
Pojo pojo = new Pojo();
pojo.setSensitiveString("Sensitive Information need to be encrypted");
cosmosEncryptionAsyncContainer.createItem(pojo)
.flatMap(response -> {
System.out.println("Created item: " + response.getItem());
// Read that item 👓
return cosmosEncryptionAsyncContainer.readItem(response.getItem().getId(),
new PartitionKey(response.getItem().getId()),
Pojo.class);
})
.flatMap(response -> {
System.out.println("Read item: " + response.getItem());
// Replace that item 🔁
Pojo p = response.getItem();
pojo.setSensitiveString("New Sensitive Information");
return cosmosEncryptionAsyncContainer.replaceItem(p, response.getItem().getId(),
new PartitionKey(response.getItem().getId()));
})
// delete that item 💣
.flatMap(response -> cosmosEncryptionAsyncContainer.deleteItem(response.getItem().getId(),
new PartitionKey(response.getItem().getId())))
.subscribe();
サンプル アプリの概要 については、こちらを参照してください。
トラブルシューティング
全般
Azure Cosmos DB は、高速で柔軟性に優れた分散データベースです。待機時間とスループットが保証されており、シームレスにスケーリングできます。 Azure Cosmos DB でデータベースをスケーリングするために、アーキテクチャを大きく変更したり、複雑なコードを記述したりする必要はありません。 スケールアップとスケールダウンは、API 呼び出しか SDK メソッド呼び出しを 1 回行うだけで簡単に実行できます。 ただし、Azure Cosmos DB にはネットワーク呼び出しによってアクセスするため、Azure Cosmos DB Java SDK v4 を使用するときに最高のパフォーマンスを実現するために、クライアント側の最適化を行うことができます。
パフォーマンス ガイドでは、これらのクライアント側の最適化について説明します。
トラブルシューティング ガイド では、Azure Cosmos DB SQL API アカウントで Azure Cosmos DB Java SDK v4 を使用する場合の一般的な問題、回避策、診断手順、ツールについて説明します。
クライアントのログ記録を有効にする
Azure Cosmos DB Java SDK v4 では、log4j や logback などの一般的なログ記録フレームワークへのログ記録をサポートするロギング ファサードとして SLF4j が使用されます。
たとえば、ログ記録フレームワークとして log4j を使用する場合は、Java classpath に次の libs を追加します。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
また、log4j 構成を追加します。
# this is a sample log4j configuration
# Set root logger level to INFO and its only appender to A1.
log4j.rootLogger=INFO, A1
log4j.category.com.azure.cosmos=INFO
#log4j.category.io.netty=OFF
#log4j.category.io.projectreactor=OFF
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %5X{pid} [%t] %-5p %c - %m%n
次の手順
- Cosmos 暗号化のサンプル プログラム はこちら
- Cosmos DB コア Java SDK クイックスタートのクイック スタート - Cosmos DB SQL API データを管理するための Java アプリの構築
- Azure Cosmos DB サービスについて詳細を確認する
共同作成
このプロジェクトでは、共同作成と提案を歓迎しています。 ほとんどの共同作成では、共同作成者使用許諾契約書 (CLA) にご同意いただき、ご自身の共同作成内容を使用する権利を Microsoft に供与する権利をお持ちであり、かつ実際に供与することを宣言していただく必要があります。
pull request を送信すると、CLA を提供して PR (ラベル、コメントなど) を適宜装飾する必要があるかどうかを CLA ボットが自動的に決定します。 ボットによって提供される手順にそのまま従ってください。 この操作は、Microsoft の CLA を使用するすべてのリポジトリについて、1 回だけ行う必要があります。
このプロジェクトでは、Microsoft オープン ソースの倫理規定を採用しています。 詳しくは、「Code of Conduct FAQ (倫理規定についてよくある質問)」を参照するか、opencode@microsoft.com 宛てに質問またはコメントをお送りください。