

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

# Amazon S3 暗号化クライアントの移行 (V1 から V2)
<a name="s3-encryption-migration-v1-v2"></a>

**注記**  
Amazon S3 暗号化クライアントの V2 を使用していて、V3 に移行する場合は、「」を参照してください[Amazon S3 暗号化クライアントの移行 (V2 から V3)](s3-encryption-migration-v2-v3.md)。

このトピックでは、アプリケーションで使用している Amazon Simple Storage Service (Amazon S3) 暗号化クライアントをバージョン 1 (V1) からバージョン 2 (V2) に移行し、移行プロセス全体でアプリケーションの可用性を確保する方法について説明します。

## 移行の概要
<a name="migration-overview-v1-v2"></a>

この移行は 2 つのフェーズから構成されます。

1. **新しいフォーマットを読み取るために既存のクライアントを更新します。**まず、更新されたバージョンの AWS SDK for C\+\+ をアプリケーションにデプロイします。これにより、既存の V1 暗号化クライアントが、新しい V2 クライアントによって書き込まれたオブジェクトを復号できるようになります。アプリケーションで AWS SDKs、各 SDK を個別にアップグレードする必要があります。

2. **暗号化および復号クライアントを V2 に移行します。**すべての V1 暗号化クライアントが新しいフォーマットを読み取ることができるようになったら、既存の暗号化および復号化クライアントをそれぞれの V2 バージョンに移行できます。

## 新しいフォーマットを読み取るために既存のクライアントを更新する
<a name="update-existing-clients-to-read-new-formats-v1-v2"></a>

まず、既存のクライアントを最新の SDK リリースに更新する必要があります。このステップを完了すると、アプリケーションの V1 クライアントは、アプリケーションのコードベースを更新することなく、V2 暗号化クライアントによって暗号化されたオブジェクトを復号できます。

### の最新バージョンをビルドしてインストールする AWS SDK for C\+\+
<a name="build-and-install-the-latest-version-of-the-sdk-cpp-v1-v2"></a>

 **ソースから SDK を利用するアプリケーション** 

ソース AWS SDK for C\+\+ から を構築してインストールする場合は、GitHub の から SDK ソースをダウンロードまたはクローン[`aws/aws-sdk-cpp`](https://github.com/aws/aws-sdk-cpp)します。その後、通常のビルドおよびインストール手順を繰り返します。

1.8.x より前のバージョン AWS SDK for C\+\+ からアップグレードする場合は、各メジャーバージョンで導入された重大な変更について、この [CHANGELOG](https://github.com/aws/aws-sdk-cpp/blob/master/CHANGELOG.md) を参照してください。をビルドおよびインストールする方法の詳細については AWS SDK for C\+\+、「」を参照してください[ソースコード AWS SDK for C\+\+ から を取得する](sdk-from-source.md)。

 **Vcpkg から SDK を利用するアプリケーション** 

アプリケーションで [Vcpkg](https://github.com/microsoft/vcpkg) を使用して SDK の更新を追跡している場合は、既存の Vcpkg アップグレード方法を使用して SDK を最新バージョンにアップグレードするだけです。バージョンがリリースされてからパッケージマネージャーで使用可能になるまでに遅延があることに注意してください。最新バージョンは[ソースからインストール](sdk-from-source.md)することで常に使用できます。

次のコマンドを実行してパッケージ `aws-sdk-cpp` をアップグレードできます。

```
vcpkg upgrade aws-sdk-cpp
```

次に、パッケージ `aws-sdk-cpp` のバージョンを確認します。

```
vcpkg list aws-sdk-cpp
```

バージョンは 1.8.24 以降である必要があります。

で Vcpkg を使用する方法の詳細については AWS SDK for C\+\+、「」を参照してください[パッケージマネージャー AWS SDK for C\+\+ から を取得する](sdk-from-pm.md)。

### アプリケーションのビルド、インストール、デプロイする
<a name="build-install-and-deploy-your-applications-v1-v2"></a>

アプリケーションが と静的にリンクされている場合 AWS SDK for C\+\+、アプリケーションにコードの変更は必要ありませんが、最新の SDK の変更を使用するためにアプリケーションを再度構築する必要があります。動的リンクの場合、このステップは不要です。

アプリケーションの依存関係バージョンをアップグレードし、アプリケーションの機能を確認したら、フリートへのアプリケーションのデプロイに進みます。アプリケーションのデプロイが完了したら、V2 の暗号化・復号クライアントへの移行フェーズに進むことができます。

## 暗号化および復号クライアントを V2 に移行する
<a name="migrate-encryption-and-decryption-clients-to-v2-v1-v2"></a>

以下の手順は、Amazon S3 の暗号化クライアントのコードを V1 から V2 へ正常に移行する方法を示しています。コードの変更が必要なため、静的または動的にリンクしているかどうかにかかわらず、アプリケーションを再構築する必要があります AWS SDK for C\+\+。

### 新しい暗号化マテリアルの使用
<a name="using-new-encryption-materials-v1-v2"></a>

V2 Amazon S3 暗号化クライアントと V2 暗号設定で、次の暗号化マテリアルは廃止されました。
+  `SimpleEncryptionMaterials` 
+  `KMSEncryptionMaterials` 

代わりに、次の安全な暗号マテリアルが使用されます。
+  `SimpleEncryptionMaterialsWithGCMAAD` 
+  `KMSWithContextEncryptionMaterials` 

V2 S3 暗号化クライアントをコンストラクトするには、次のコード変更が必要です。
+   
**S3 暗号化クライアント作成時に `KMSEncryptionMaterials` を使用している場合:**  
  + V2 S3 暗号化クライアントを作成するときは、`KMSEncryptionMaterials` を `KMSWithContextEncryptionMaterials` に置き換え、それを V2 暗号設定で指定します。
  + V2 Amazon S3 暗号化クライアントでオブジェクトを配置するときは、CEK の暗号化に使用する KMS コンテキストとして、文字列–文字列のコンテキストマップを明示的に指定する必要があります。このマップは空でも構いません。
+   
**S3 暗号化クライアント作成時に `SimpleEncryptionMaterials` を使用している場合:**  
  + V2 Amazon S3 暗号化クライアントを作成するときは、`SimpleEncryptionMaterials` を `SimpleEncryptionMaterialsWithGCMAAD` に置き換え、それを V2 暗号化設定で指定します。
  + V2 Amazon S3 暗号化クライアントでオブジェクトを配置するときは、空の文字列–文字列コンテキストマップを明示的に指定する必要があります。指定しない場合、SDK はエラーを返します。

 **例: KMS/KMSWithContext キーラップアルゴリズムの使用** 

 *移行前 (KMS キーラップ)* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", CUSTOMER_MASTER_KEY_ID);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
encryptionClient.PutObject(putObjectRequest);
```

 *移行後 (KMSWithContext キーラップ)* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID);
CryptoConfigurationV2 cryptoConfig(materials);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
Aws::Map<Aws::String, Aws::String> kmsContextMap;
kmsContextMap.emplace("client", "aws-sdk-cpp");
kmsContextMap.emplace("version", "1.8.0");
encryptionClient.PutObject(putObjectRequest, kmsContextMap /* could be empty as well */);
```

 **例: AES/AES-GCM キーラップアルゴリズムの使用** 

 *移行前 (AES キーラップ)* 

```
auto materials = Aws::MakeShared<SimpleEncryptionMaterials>("s3Encryption", HashingUtils::Base64Decode(AES_MASTER_KEY_BASE64));
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
encryptionClient.PutObject(putObjectRequest);
```

 *移行後 (AES-GCM キーラップ)* 

```
auto materials = Aws::MakeShared<SimpleEncryptionMaterialsWithGCMAAD>("s3EncryptionV2", HashingUtils::Base64Decode(AES_MASTER_KEY_BASE64));
CryptoConfigurationV2 cryptoConfig(materials);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
encryptionClient.PutObject(putObjectRequest, {} /* must be an empty map */);
```

## その他の例
<a name="additional-examples-v1-v2"></a>

次の例は、V1 から V2 への移行に関連する特定のユースケースに対処する方法を示しています。

### レガシー Amazon S3 暗号化クライアントによって暗号化されたオブジェクトの復号
<a name="decrypt-objects-encrypted-by-legacy-amazon-s3-encryption-clients-v1-v2"></a>

デフォルトでは、V2 Amazon S3 暗号化クライアントを使用して、非推奨のキーラップアルゴリズムまたは非推奨のコンテンツ暗号化スキーマで暗号化されたオブジェクトを復号することはできません。

次のキーラップアルゴリズムは廃止されました。
+  `KMS` 
+  `AES_KEY_WRAP` 

また、次のコンテンツ暗号化スキーマも廃止されました。
+  `CBC` 
+  `CTR` 

でレガシー Amazon S3 AWS SDK for C\+\+ 暗号化クライアントを使用してオブジェクトを暗号化している場合は、次の場合に廃止されたメソッドを使用する可能性があります。
+ `SimpleEncryptionMaterials` または `KMSEncryptionMaterials` を使用していた。
+ 暗号化設定で `Crypto Mode` として `ENCRYPTION_ONLY` を使用していた。

廃止されたキーラップアルゴリズムや暗号化スキーマで暗号化されたオブジェクトを V2 Amazon S3 暗号化クライアントで復号するには、V2 暗号設定で `SecurityProfile` のデフォルト値を `V2` から `V2_AND_LEGACY` にオーバーライドする必要があります。

 **例** 

 *移行前* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", CUSTOMER_MASTER_KEY_ID);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

 *移行後* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID);
CryptoConfigurationV2 cryptoConfig(materials);
cryptoConfig.SetSecurityProfile(SecurityProfile::V2_AND_LEGACY);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

### バイト範囲を指定してオブジェクトを復号する
<a name="decrypt-objects-with-range-v1-v2"></a>

レガシー Amazon S3 暗号化クライアントでは、S3 オブジェクトを復号するときにバイト範囲を指定できます。V2 の Amazon S3 暗号化クライアントでは、この機能はデフォルトで `DISABLED` になっています。したがって、V2 暗号化設定で `RangeGetMode` のデフォルト値を `DISABLED` から `ALL` にオーバーライドする必要があります。

 **例** 

 *移行前* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", CUSTOMER_MASTER_KEY_ID);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
getObjectRequest.WithRange("bytes=38-75");
encryptionClient.GetObject(getObjectRequest);
```

 *移行後* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID);
CryptoConfigurationV2 cryptoConfig(materials);
cryptoConfig.SetUnAuthenticatedRangeGet(RangeGetMode::ALL);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
getObjectRequest.WithRange("bytes=38-75");
encryptionClient.GetObject(getObjectRequest);
```

### 任意の CMK でオブジェクトを復号する
<a name="decrypt-objects-with-any-cmk-v1-v2"></a>

`KMSWithContextEncryptionMaterials` で暗号化されたオブジェクトを復号するとき、V2 Amazon S3 暗号化クライアントは空のマスターキーを提供することで、KMS が適切な CMK を特定できるようになります。この機能はデフォルトで `DISABLED` になっています。KMS 暗号化マテリアルに対して `SetKMSDecryptWithAnyCMK(true)` を呼び出して、この機能を明示的に設定する必要があります。

 **例** 

 *移行前* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", ""/* provide an empty KMS Master Key*/);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

 *移行後* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", ""/* provide an empty KMS Master Key*/);
materials.SetKMSDecryptWithAnyCMK(true);
CryptoConfigurationV2 cryptoConfig(materials);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

これらすべての移行シナリオに対応する完全なコードについては、GitHub の「[Amazon S3 Encryption example](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3encryption)」を参照してください。