

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

# AWS SDK for PHP バージョン 3 での Amazon S3 暗号化クライアント移行 (V1 から V2)
<a name="s3-encryption-migration-v1-v2"></a>

**注記**  
Amazon S3 暗号化クライアントのバージョン 2 (V2) を使用していて、バージョン 3 (V3) に移行する場合は、「」を参照してください[AWS SDK for PHP バージョン 3 での 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 PHP をアプリケーションにデプロイします。これにより、既存の 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 PHPの各メジャーバージョンについては、以下の詳細を参照してください。

### AWS SDK for PHP バージョン 3 のアップグレード
<a name="upgrading-aws-sdk-for-php-version-3-v1-v2"></a>

バージョン 3 は AWS SDK for PHPの最新バージョンです。この移行を完了するには、バージョン 3.148.0 以降の `aws/aws-sdk-php` パッケージを使用する必要があります。

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

Composer を使用してインストールされたプロジェクトについては、Composer ファイルで SDK パッケージを SDK のバージョン 3.148.0 に更新し、次のコマンドを実行します。

```
composer update aws/aws-sdk-php
```

 **Phar または Zip ファイルを使用したインストール** 

次のいずれかの方法を使用します。更新された SDK ファイルは、必ず require ステートメントによって決定されるコードで求められる場所に配置してください。

Phar ファイルを使用してインストールされたプロジェクトについては、更新されたファイル ([`aws.phar`](https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.phar)) をダウンロードします。

```
<?php
  require '/path/to/aws.phar';
?>
```

Zip ファイルを使用してインストールされたプロジェクトについては、更新されたファイル ([``](https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip)) をダウンロードします。

```
<?php
  require '/path/to/aws-autoloader.php';
?>
```

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

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

### V2 クライアントへの更新の要件
<a name="requirements-for-updating-to-v2-clients-v1-v2"></a>

1. AWS KMS 暗号化コンテキストは、 `S3EncryptionClientV2::putObject`および `S3EncryptionClientV2::putObjectAsync`メソッドに渡される必要があります。 AWS KMS 暗号化コンテキストは、キーと値のペアの連想配列であり、 AWS KMS キー暗号化のために暗号化コンテキストに追加する必要があります。追加のコンテキストが必要ない場合は、空の配列を渡すことができます。

2. `@SecurityProfile` は `S3EncryptionClientV2` の `getObject` および `getObjectAsync` メソッドに渡す必要があります。`@SecurityProfile` は `getObject...` メソッドの新しい必須パラメータです。`'V2'` に設定すると、V2 互換形式で暗号化されたオブジェクトのみ復号化できます。また、このパラメータを `'V2_AND_LEGACY'` に設定すると、V1 互換形式で暗号化されたオブジェクトを復号化することができます。移行をサポートするために、`@SecurityProfile` を `'V2_AND_LEGACY'` に設定します。`'V2'` は、新しいアプリケーションの開発でのみ使用します。

3. (オプション) `@KmsAllowDecryptWithAnyCmk` パラメータを `S3EncryptionClientV2::getObject` と `S3EncryptionClientV2::getObjectAsync* methods.` に含め、`@KmsAllowDecryptWithAnyCmk` という新しいパラメータを追加しました。このパラメータを `true` に設定すると、KMS キーを指定することなく復号化が可能になります。デフォルト値は `false` です。

4. V2 クライアントで復号化する場合、`"getObject..."` メソッド呼び出しで `@KmsAllowDecryptWithAnyCmk` パラメータが `true` に設定されていない場合、`KmsMaterialsProviderV2` のコンストラクタに `kms-key-id` を指定する必要があります。

## 移行の例
<a name="migration-examples-v1-v2"></a>

### 例 1: V2 クライアントへの移行
<a name="example-1-migrating-to-v2-clients-v1-v2"></a>

 **移行前** 

```
use Aws\S3\Crypto\S3EncryptionClient;
use Aws\S3\S3Client;

$encryptionClient = new S3EncryptionClient(
    new S3Client([
        'profile' => 'default',
        'region' => 'us-east-1',
        'version' => 'latest',
    ])
);
```

 **移行後** 

```
use Aws\S3\Crypto\S3EncryptionClientV2;
use Aws\S3\S3Client;

$encryptionClient = new S3EncryptionClientV2(
    new S3Client([
        'profile' => 'default',
        'region' => 'us-east-1',
        'version' => 'latest',
    ])
);
```

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

**注記**  
これらの例では、例 1 で定義されたインポートと変数を使用しています。例えば、`$encryptionClient`。

 **移行前** 

```
use Aws\Crypto\KmsMaterialsProvider;
use Aws\Kms\KmsClient;

$kmsKeyId = 'kms-key-id';
$materialsProvider = new KmsMaterialsProvider(
    new KmsClient([
        'profile' => 'default',
        'region' => 'us-east-1',
        'version' => 'latest',
    ]),
    $kmsKeyId
);

$bucket = 'the-bucket-name';
$key = 'the-file-name';
$cipherOptions = [
    'Cipher' => 'gcm',
    'KeySize' => 256,
];

$encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);

$result = $encryptionClient->getObject([
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

 **移行後** 

```
use Aws\Crypto\KmsMaterialsProviderV2;
use Aws\Kms\KmsClient;

$kmsKeyId = 'kms-key-id';
$materialsProvider = new KmsMaterialsProviderV2(
    new KmsClient([
        'profile' => 'default',
        'region' => 'us-east-1',
        'version' => 'latest',
    ]),
    $kmsKeyId
);

$bucket = 'the-bucket-name';
$key = 'the-file-name';
$cipherOptions = [
    'Cipher' => 'gcm',
    'KeySize' => 256,
];

$encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    '@KmsEncryptionContext' => ['context-key' => 'context-value'],
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);
$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => true,
    '@SecurityProfile' => 'V2_AND_LEGACY',
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```