

# 既存データのサーバー側の暗号化の更新
<a name="update-sse-encryption"></a>

すべての Amazon S3 バケットにはデフォルトで暗号化が設定されており、オブジェクトは Amazon S3 マネージドキー (SSE-S3) を使用してサーバー側の暗号化により自動的に暗号化されます。このデフォルトの暗号化設定は Amazon S3 バケット内のすべての新しいオブジェクトに適用されます。

`UpdateObjectEncryption` API オペレーションを使用すると、汎用バケット内の既存の暗号化されたオブジェクトのサーバー側の暗号化タイプを、Amazon S3 マネージド暗号化 (SSE-S3) によるサーバー側の暗号化から AWS Key Management Service (AWS KMS) 暗号化キーによるサーバー側の暗号化 (SSE-KMS) にアトミックに更新できます。`UpdateObjectEncryption` API オペレーションでは、[エンベロープ暗号化](https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#enveloping)を使用して、新しく指定したサーバー側の暗号化タイプでオブジェクトの暗号化と復号に使用されたデータキーを再暗号化します。

Amazon S3 は、データ移動なしでこの暗号化タイプの更新を実行します。つまり、`UpdateObjectEncryption` オペレーションを使用すると、データはコピーされず、S3 Glacier Flexible Retrieval または S3 Glacier Deep Archive にアーカイブされたオブジェクトは復元されず、S3 Intelligent-Tiering ストレージクラスのオブジェクトは階層間で移動されません。さらに、`UpdateObjectEncryption` オペレーションでは、ストレージクラス、作成日、最終更新日、ETag、チェックサムプロパティなど、すべてのオブジェクトメタデータプロパティを保持します。

`UpdateObjectEncryption` オペレーションは、汎用バケットでサポートされているすべての S3 ストレージクラスでサポートされています。`UpdateObjectEncryption` オペレーションを使用して、次の操作を実行できます。
+ 暗号化されたオブジェクトを Amazon S3 マネージド暗号化 (SSE-S3) によるサーバー側の暗号化から AWS Key Management Service (AWS KMS) 暗号化キーによるサーバー側の暗号化 (SSE-KMS) に変更します。
+ オブジェクトレベルの SSE-KMS 暗号化オブジェクトを更新して S3 バケットキーを使用するようにすると、Amazon S3 から AWS KMS への AWS KMS リクエストトラフィックが減少します。詳細については、「[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md)」を参照してください。
+ カスタムキーローテーション標準に準拠できるように、データの暗号化に使用されるカスタマーマネージド KMS キーを変更します。

**注記**  
暗号化されていないソースオブジェクトや、AWS KMS keys による二層式サーバー側の暗号化 (DSSE-KMS)、またはお客様が用意した暗号化キー (SSE-C) のいずれかで暗号化されたソースオブジェクトは、このオペレーションではサポートされていません。

通常、`UpdateObjectEncryption` オペレーションは、S3 Glacier Flexible Retrieval や S3 Glacier Deep Archive などのオブジェクトのサイズやストレージクラスに関係なく、ミリ秒単位で完了します。このオペレーションは S3 Intelligent-Tiering のアクセスとしてカウントされないため、オブジェクトのサーバー側の暗号化タイプを変更しても、低頻度アクセス階層またはアーカイブインスタントアクセス階層のオブジェクトは高頻度アクセス階層に自動的に戻されません。

`UpdateObjectEncryption` は、Amazon S3 サーバーアクセスログと AWS CloudTrail データイベントに記録されるオブジェクトレベル (データプレーン) API オペレーションです。詳細については、「[Amazon S3 のログ記録オプション](logging-with-S3.md)」を参照してください。

 `UpdateObjectEncryption` オペレーションの料金は、`PUT`、`COPY`、`POST`、`LIST` リクエスト (1,000 リクエストあたり) と同じで、基になるオブジェクトのストレージクラスに関係なく、常に S3 Standard ストレージクラスリクエストとして課金されます。詳細については、「[Amazon S3 の料金](https://aws.amazon.com/s3/pricing/)」を参照してください。

## 制限と考慮事項
<a name="update-sse-encryption-restrictions"></a>

`UpdateObjectEncryption` オペレーションを使用する場合、以下の制限と考慮事項が適用されます。
+ `UpdateObjectEncryption` オペレーションでは、暗号化されていないオブジェクトや、AWS KMS keys による二層式サーバー側の暗号化 (DSSE-KMS) またはお客様が用意した暗号化キー (SSE-C) のいずれかで暗号化されたオブジェクトはサポートされません。さらに、リクエストされた新しい暗号化タイプの `UpdateObjectEncryption` リクエストとして SSE-S3 を指定することはできません。
+ `UpdateObjectEncryption` オペレーションを使用して、S3 バージョニングが有効になっているバケット内のオブジェクトを更新できます。特定のバージョンの暗号化タイプを更新するには、`UpdateObjectEncryption` リクエストでバージョン ID を指定する必要があります。バージョン ID を指定しない場合、`UpdateObjectEncryption` リクエストはオブジェクトの現在のバージョンに対して実行されます。S3 バージョニングの詳細については、[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md) を参照してください。
+ `UpdateObjectEncryption` オペレーションは、S3 Object Lock の保持モードまたはリーガルホールドが適用されているオブジェクトで失敗します。オブジェクトにガバナンスモードの保持期間またはリーガルホールドがある場合は、`UpdateObjectEncryption` リクエストを発行する前に、まずオブジェクトの Object Lock ステータスを削除する必要があります。Object Lock コンプライアンスモードの保持期間が適用されているオブジェクトでは、`UpdateObjectEncryption` オペレーションを使用できません。S3 オブジェクトロックの詳細については、「[S3 Object Lock を使用したオブジェクトのロック](object-lock.md)」を参照してください。
+ ライブレプリケーションが有効になっているソースバケットに対する `UpdateObjectEncryption` リクエストでは、レプリケート先バケットでレプリカイベントが開始されません。ソースバケットとレプリケート先バケットの両方のオブジェクトの暗号化タイプを変更する場合は、ソースバケットとレプリケート先バケットのオブジェクトに対して個別の `UpdateObjectEncryption` リクエストを開始する必要があります。
+ デフォルトでは、カスタマー管理の KMS キーを指定するすべての `UpdateObjectEncryption` リクエストは、バケット所有者の AWS アカウントが所有する KMS キーに制限されます。AWS Organizations を使用している場合は、AWS サポート に連絡して、組織内の他のメンバーアカウントが所有する AWS KMS keys を使用する機能をリクエストできます。
+ S3 バッチレプリケーションを使用してデータセットをリージョン間でレプリケートし、オブジェクトのサーバー側の暗号化タイプを SSE-S3 から SSE-KMS に更新したことがある場合は、追加のアクセス許可が必要になる場合があります。ソースリージョンバケットでは、`kms:decrypt` アクセス許可が必要です。次に、レプリケート先リージョンのバケットの `kms:decrypt` および `kms:encrypt` アクセス許可が必要です。
+ `UpdateObjectEncryption` リクエストで完全な KMS キー ARN を指定する必要があります。エイリアス名またはエイリアス ARN を使用することはできません。完全な KMS キー ARN は、AWS KMS コンソールまたは AWS KMS `DescribeKey` API を使用して判断できます。

## 必要なアクセス許可
<a name="update-sse-encryption-permissions"></a>

`UpdateObjectEncryption` オペレーションを実行するには、次のアクセス許可が必要です。
+ `s3:PutObject`
+ `s3:UpdateObjectEncryption`
+ `kms:Encrypt`
+ `kms:Decrypt`
+ `kms:GenerateDataKey`
+ `kms:ReEncrypt*`

AWS Organizations を使用している場合は、組織内の他の AWS アカウントのカスタマーマネージド KMS キーでこのオペレーションを使用するには、`organizations:DescribeAccount` アクセス許可が必要です。また、AWS サポート に連絡して、組織内の他のメンバーアカウントが所有する AWS KMS keys を使用する機能をリクエストする必要があります。

`UpdateObjectEncryption` オペレーションを実行するには、IAM ロールに次の AWS Identity and Access Management (IAM) ポリシーを追加します。このポリシーを使用するには、`amzn-s3-demo-bucket` を汎用バケットの名前に置き換え、もう一方の `user input placeholders` を独自の情報に置き換えます。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [{
            "Sid": "AllowUpdateObjectEncryption",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:UpdateObjectEncryption",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:ReEncrypt*",
                "organizations:DescribeAccount"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket",
                "arn:aws:s3:::amzn-s3-demo-bucket/*",
                "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
            ]
        }
    ]
}
```

## 暗号化を一括更新する
<a name="update-sse-encryption-bulk"></a>

1 回のリクエストで複数の Amazon S3 オブジェクトのサーバー側の暗号化タイプを更新するには、S3 バッチオペレーションを使用できます。S3 バッチオペレーションに操作対象のオブジェクトのリストを提供するか、プレフィックス、ストレージクラス、作成日、暗号化タイプ、KMS キー ARN、S3 バケットキーのステータスなどのオブジェクトメタデータに基づいてオブジェクトリストを生成するようにバッチオペレーションに指示することもできます。S3 バッチオペレーションは、各 API オペレーションを呼び出して、指定されたオペレーションを実行します。1 つのバッチオペレーションジョブで、ペタバイト単位のデータを含むバケット内の数十億のオブジェクトに対して、指定されたオペレーションを実行できます。バッチオペレーションの詳細については、「[バッチオペレーションでオブジェクトオペレーションを一括で実行する](batch-ops.md)」を参照してください。

S3 バッチオペレーション機能は、進捗状況の追跡、通知の送信、すべてのアクションの詳細な完了レポートの保存を行い、フルマネージドの監査可能なサーバーレスエクスペリエンスを提供します。S3 バッチオペレーションは、Amazon S3 コンソール、AWS Command Line Interface (AWS CLI)、AWS SDK、または Amazon S3 REST API を通じて使用できます。詳細については、「[オブジェクトの暗号化を更新する](batch-ops-update-encryption.md)」を参照してください。

## オブジェクトの暗号化の更新
<a name="update-sse-encryption-single-object"></a>

オブジェクトのサーバー側の暗号化タイプは、AWS Command Line Interface (AWS CLI) AWS SDK または Amazon S3 REST API を使用して更新できます。

### オブジェクトの暗号化を更新する
<a name="update-sse-encryption-single-object-procedure"></a>

#### の使用AWS CLI
<a name="update-sse-encryption-single-object-cli"></a>

次のコマンドを実行するには、AWS CLI をインストールして設定する必要があります。AWS CLI をまだインストールしていない場合は、「*AWS Command Line Interface ユーザーガイド*」の「[AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)」を参照してください。

別の方法として、AWS CloudShell を使用してコンソールから AWS CLI コマンドを実行することもできます。AWS CloudShell は、AWS マネジメントコンソールから直接起動できる、ブラウザベースの事前認証済みシェルです。詳細については、「AWS CloudShell ユーザーガイド」の「[CloudShell とは](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html)」と「[AWS CloudShell の使用開始](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)」を参照してください。**

**AWS CLI を使用してオブジェクトの暗号化を更新するには**

次のコマンド例を使用するには、`user input placeholders` をユーザー自身の情報に置き換えます。

1. 次のコマンドを使用して、汎用バケット (`amzn-s3-demo-bucket` など) 内の 1 つのオブジェクト (`index.html`) の暗号化を更新し、S3 バケットキーで SSE-KMS を使用します。

   ```
   aws s3api update-object-encryption \
   --bucket amzn-s3-demo-bucket \
   --key index.html \
   --object-encryption '{"SSEKMS": { "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/f12a345a-678e-9bbb-1025-62e317037583", "BucketKeyEnabled": true }}'
   ```
**注記**  
完全な AWS KMS key Amazon リソースネーム (ARN) を指定する必要があります。KMS キー ID と KMS キーエイリアスはサポートされていません。

1. `head-object` コマンドを実行して、オブジェクトの更新された暗号化タイプを表示します。

   ```
   aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html
   ```

#### REST API の使用
<a name="update-sse-encryption-single-object-rest-api"></a>

オブジェクトの暗号化を更新するには、REST リクエストを送信できます。詳細については、[ を参照してください。UpdateObjectEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateObjectEncryption.html)

#### AWS SDK の使用
<a name="update-sse-encryption-single-object-sdk"></a>

AWS SDK を使用して、オブジェクトの暗号化を更新できます。詳細については、「[サポートされる SDK のリスト](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateObjectEncryption.html#API_UpdateObjectEncryption_SeeAlso)」を参照してください。

------
#### [ Java ]

**Example**  
次の AWS SDK for Java 2.x の例では、汎用バケット内のオブジェクトの暗号化タイプを SSE-KMS に更新します。  

```
    public void updateObjectEncryption(String bucketName,
                                       String objectKey,
                                       String versionId,
                                       String kmsKeyArn,
                                       boolean bucketKeyEnabled) {
        // Create the target object encryption type.
        ObjectEncryption objectEncryption = ObjectEncryption.builder()
                .ssekms(SSEKMSEncryption.builder()
                        .kmsKeyArn(kmsKeyArn)
                        .bucketKeyEnabled(bucketKeyEnabled)
                        .build())
                .build();

        // Create the UpdateObjectEncryption request.
        UpdateObjectEncryptionRequest request = UpdateObjectEncryptionRequest.builder()
                .bucket(bucketName)
                .key(objectKey)
                .versionId(versionId)
                .objectEncryption(objectEncryption)
                .build();

        // Update the object encryption.
        try {
            getS3Client().updateObjectEncryption(request);
            logger.info("Object encryption updated to SSE-KMS for {} in bucket {}", objectKey, bucketName);
        } catch (S3Exception e) {
            logger.error("Failed to update to object encryption: {} - Error code: {}", e.awsErrorDetails().errorMessage(),
                    e.awsErrorDetails().errorCode());
            throw e;
        }
    }
```

------
#### [ Python ]

**Example**  
次の AWS SDK for Python (Boto3) の例は、汎用バケット内のオブジェクトの暗号化タイプを SSE-KMS に更新する方法を示しています。  

```
response = client.update_object_encryption(
    Bucket='string',
    Key='string',
    VersionId='string',
    ObjectEncryption={
        'SSEKMS': {
                'KMSKeyArn': 'string',
                'BucketKeyEnabled': True|False
        }
    }
)
```

------