

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

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

**注記**  
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 Ruby の更新バージョンをアプリケーションにデプロイします。これにより、既存の V1 暗号化クライアントが、新しい V2 クライアントによって書き込まれたオブジェクトを復号できるようになります。アプリケーションで AWS SDKs、各 SDK を個別にアップグレードする必要があります。

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

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

V2 暗号化クライアントは、古いバージョンのクライアントではサポートされていない暗号化アルゴリズムを使用します。移行の最初のステップとして、V1 復号化クライアントを最新の SDK リリースに更新します。このステップを完了すると、アプリケーションの V1 クライアントが V2 暗号化クライアントによって暗号化されたオブジェクトを復号できるようになります。 AWS SDK for Ruby の各メジャーバージョンの詳細については、以下を参照してください。

### AWS SDK for Ruby バージョン 3 の更新
<a name="update-aws-sdk-for-ruby-version-3-v1-v2"></a>

バージョン 3 は AWS SDK for Ruby の最新バージョンです。この移行を完了するには、バージョン 1.76.0 以降の `aws-sdk-s3` gem を使用する必要があります。

 **コマンドラインからインストールする** 

`aws-sdk-s3` gem をインストールするプロジェクトの場合、version オプションを使用して、1.76.0 以降のバージョンがインストールされていることを確認します。

```
gem install aws-sdk-s3 -v '>= 1.76.0'
```

 **Gemfile の使用** 

Gemfile を使用して依存関係を管理するプロジェクトでは、`aws-sdk-s3` gem の最小バージョンを 1.76.0 に設定します。例: 

```
gem 'aws-sdk-s3', '>= 1.76.0'
```

1. Gemfile を変更します。

1. `bundle update aws-sdk-s3` を実行します。バージョンを確認するには、`bundle info aws-sdk-s3` を実行します。

### AWS SDK for Ruby バージョン 2 のアップグレード
<a name="upgdate-aws-sdk-for-ruby-version-2-v1-v2"></a>

 AWS SDK for Ruby のバージョン 2 は、2021 年 11 月 21 日に[メンテナンスモード](https://aws.amazon.com/blogs/developer/deprecation-schedule-for-aws-sdk-for-ruby-v2/)に入ります。この移行を完了するには、バージョン 2.11.562 以降の aws-sdk gem を使用する必要があります。

 **コマンドラインからインストールする** 

`aws-sdk` gem をインストールするプロジェクトの場合、コマンドラインから、version オプションを使用して、2.11.562 以降のバージョンがインストールされていることを確認します。

```
gem install aws-sdk -v '>= 2.11.562'
```

 **Gemfile の使用** 

Gemfile を使用して依存関係を管理するプロジェクトでは、`aws-sdk` gem の最小バージョンを 2.11.562 に設定します。例: 

```
gem 'aws-sdk', '>= 2.11.562'
```

1. Gemfile を変更します。Gemfile.lock ファイルがある場合は、それを削除または更新します。

1. `bundle update aws-sdk` を実行します。バージョンを確認するには、`bundle info aws-sdk` を実行します。

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

クライアントを更新して新しい暗号化形式を読み取るようにした後で、V2 暗号化および復号化クライアントを使用するようにアプリケーションを更新できます。次の手順は、コードを V1 から V2 に正常に移行する方法を示しています。

V2 暗号化クライアントを使用するようにコードを更新する前に、前の手順を実行し、`aws-sdk-s3` gem バージョン 2.11.562 以降を使用していることを確認します。

**注記**  
AES-GCM で復号する場合は、復号されたデータの使用を開始する前に、オブジェクト全体を最後まで読み取ります。これは、オブジェクトが暗号化されてから変更されていないことを確認するためものステップです。

### V2 暗号化クライアントを設定する
<a name="configuring-v2-encryption-clients-v1-v2"></a>

*EncryptionV2::Client* では追加の設定が必要です。設定の詳細については、[EncryptionV2::Client のドキュメント](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/EncryptionV2/Client.html#initialize-instance_method)または、このトピックの後半で示されている例を参照してください。

1. **クライアント構成でキーラップ方式とコンテンツ暗号化アルゴリズムを指定する必要があります。**新しい `EncryptionV2::Client` を作成する場合、`key_wrap_schema` および `content_encryption_schema` に値を指定する必要があります。

 `key_wrap_schema` - を使用している場合は AWS KMS、これを に設定する必要があります`:kms_context`。対称 (AES) キーを使用する場合は、これを `:aes_gcm` に設定する必要があります。非対称 (RSA) キーを使用する場合は、これを `:rsa_oaep_sha1` に設定する必要があります。

 `content_encryption_schema` - これは、*:aes\_gcm\_no\_padding* に設定する必要があります。

2. **クライアント構成で security\_profile を指定する必要があります。**新しい `EncryptionV2::Client` を作成する場合、`security_profile` に値を指定する必要があります。*security\_profile* パラメータは、以前の V1 `Encryption::Client` を使用して書き込まれたオブジェクトの読み取りのサポートを決定します。2 つの値 *:v2* および *:v2\_and\_legacy* があります。移行をサポートするには、`security_profile` を *:v2\_and\_legacy* に設定します。*:v2* は、新しいアプリケーションの開発でのみ使用します。

3. **AWS KMS key ID はデフォルトで適用されます。**V1 では`Encryption::Client`、クライアントの作成`kms_key_id`に使用される が に提供されていませんでした AWS KMS `Decrypt call`。 はこの情報をメタデータから取得し、対称暗号文 blob に追加 AWS KMS できます。V2、E`ncryptionV2::Client` では、*kms\_key\_id* は AWS KMS Decrypt 呼び出しに渡され、オブジェクトの暗号化に使用されるキーと一致しない場合、呼び出しは失敗します。コードが以前に特定の`kms_key_id` の設定を行わないことに依存していた場合、クライアント作成時に `kms_key_id: :kms_allow_decrypt_with_any_cmk` を設定するか、`get_object` の呼び出しで `kms_allow_decrypt_with_any_cmk: true` を設定します。

### 例: 対称 (AES) キーの使用
<a name="example-using-a-symmetric-aes-key-v1-v2"></a>

 **移行前** 

```
client = Aws::S3::Encryption::Client.new(encryption_key: aes_key)
client.put_object(bucket: bucket, key: key, body: secret_data)
resp = client.get_object(bucket: bucket, key: key)
```

 **移行後** 

```
client = Aws::S3::EncryptionV2::Client.new(
  encryption_key: rsa_key,
  key_wrap_schema: :rsa_oaep_sha1, # the key_wrap_schema must be rsa_oaep_sha1 for asymmetric keys
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client
 )
client.put_object(bucket: bucket, key: key, body: secret_data)  # No changes
resp = client.get_object(bucket: bucket, key: key) # No changes
```

### 例: kms\_key\_id AWS KMS で を使用する
<a name="example-using-aws-kms-with-kms-key-id-v1-v2"></a>

 **移行前** 

```
client = Aws::S3::Encryption::Client.new(kms_key_id: kms_key_id)
client.put_object(bucket: bucket, key: key, body: secret_data)
resp = client.get_object(bucket: bucket, key: key)
```

 **移行後** 

```
client = Aws::S3::EncryptionV2::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context, # the key_wrap_schema must be kms_context for KMS keys
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client
)
client.put_object(bucket: bucket, key: key, body: secret_data)  # No changes
resp = client.get_object(bucket: bucket, key: key) # No change
```

### 例: kms\_key\_id AWS KMS なしで を使用する
<a name="example-using-aws-kms-without-kms-key-id-v1-v2"></a>

 **移行前** 

```
client = Aws::S3::Encryption::Client.new(kms_key_id: kms_key_id)
client.put_object(bucket: bucket, key: key, body: secret_data)
resp = client.get_object(bucket: bucket, key: key)
```

 **移行後** 

```
client = Aws::S3::EncryptionV2::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context, # the key_wrap_schema must be kms_context for KMS keys
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client
)
client.put_object(bucket: bucket, key: key, body: secret_data)  # No changes
resp = client.get_object(bucket: bucket, key: key, kms_allow_decrypt_with_any_cmk: true) # To allow decrypting with any cmk
```

 **移行後 (代替方法)** 

S2 暗号化クライアントを使用してオブジェクトを読み取って復号するだけの場合 (書き込みおよび暗号化は行わない)、以下のコードを使用します。

```
client = Aws::S3::EncryptionV2::Client.new(
  kms_key_id: :kms_allow_decrypt_with_any_cmk, # set kms_key_id to allow all get_object requests to use any cmk
  key_wrap_schema: :kms_context, # the key_wrap_schema must be kms_context for KMS keys
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v2_and_legacy # to allow reading/decrypting objects encrypted by the V1 encryption client
)
resp = client.get_object(bucket: bucket, key: key) # No change
```