

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 更新現有資料的伺服器端加密
<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 和檢查總和屬性。

一般用途儲存貯體支援的所有 S3 儲存類別都支援`UpdateObjectEncryption`此操作。您可以使用 `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 的存取權，因此如果您變更物件的伺服器端加密類型，不常存取層或 Archive Instant Access 層中的物件不會自動分層回經常存取層。

`UpdateObjectEncryption` 是一種物件層級 （資料平面） API 操作，會記錄到 Amazon S3 伺服器存取日誌和 AWS CloudTrail 資料事件。如需詳細資訊，請參閱[Amazon S3 的記錄選項](logging-with-S3.md)。

 `UpdateObjectEncryption` 操作的定價與 `PUT`、`POST`、 `COPY`和 `LIST`請求 （每 1，000 個請求） 相同，無論基礎物件的儲存類別為何，一律以 S3 標準儲存類別請求計費。如需詳細資訊，請參閱 [Simple Storage Service (Amazon S3) 定價](https://aws.amazon.com/s3/pricing/)。

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

使用 `UpdateObjectEncryption`操作時，適用下列限制和考量：
+ `UpdateObjectEncryption` 此操作不支援未加密的物件，或使用 (DSSE-KMS) 或客戶提供的加密金鑰 (SSE-C) 進行 AWS KMS keys 雙層伺服器端加密的物件。此外，您無法將 SSE-S3 指定為請求的新加密類型`UpdateObjectEncryption`請求。
+ 您可以使用 `UpdateObjectEncryption`操作來更新已啟用 S3 版本控制的儲存貯體中的物件。若要更新特定版本的加密類型，您必須在`UpdateObjectEncryption`請求中指定版本 ID。如果您未指定版本 ID，`UpdateObjectEncryption`請求會作用於物件的目前版本。如需 S3 版本控制的詳細資訊，請參閱「[使用 S3 版本控制保留多個版本的物件](Versioning.md)」。
+ `UpdateObjectEncryption` 操作會在套用 S3 物件鎖定保留模式或法務保存的任何物件上失敗。如果物件具有控管模式保留期間或法務保存，您必須先移除物件上的物件鎖定狀態，才能發出`UpdateObjectEncryption`請求。您無法對套用物件鎖定合規模式保留期的物件使用 `UpdateObjectEncryption`操作。如需 S3 物件鎖定的詳細資訊，請參閱[使用物件鎖定來鎖定物件](object-lock.md)。
+ `UpdateObjectEncryption` 已啟用即時複寫的來源儲存貯體請求不會在目的地儲存貯體中啟動複本事件。如果您想要變更來源和目的地儲存貯體中物件的加密類型，則必須對來源和目的地儲存貯體中的物件啟動個別`UpdateObjectEncryption`的請求。
+ 根據預設，指定客戶受管 KMS 金鑰的所有`UpdateObjectEncryption`請求僅限於儲存貯體擁有者 擁有的 KMS 金鑰 AWS 帳戶。如果您使用的是 AWS Organizations，您可以透過聯絡 來請求使用組織中其他成員帳戶 AWS KMS keys 擁有的功能 AWS 支援。
+ 如果您使用 S3 批次複寫跨區域複寫資料集，且您的物件先前已將其伺服器端加密類型從 SSE-S3 更新為 SSE-KMS，則您可能需要額外的許可。在來源區域儲存貯體上，您必須擁有 `kms:decrypt` 許可。然後，您將需要目的地區域中儲存貯體的 `kms:decrypt`和 `kms:encrypt`許可。
+ 您必須在`UpdateObjectEncryption`請求中提供完整的 KMS 金鑰 ARN。您無法使用別名名稱或別名 ARN。您可以在 AWS KMS 主控台或使用 AWS KMS `DescribeKey` API 來判斷完整的 KMS 金鑰 ARN。

## 所需的許可
<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 KMS keys 擁有的功能 AWS 支援。

若要執行 `UpdateObjectEncryption`操作，請將下列 AWS Identity and Access Management (IAM) 政策新增至您的 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>

若要透過單一請求更新多個 Amazon S3 物件的伺服器端加密類型，您可以使用 S3 批次操作。您可以為 S3 Batch Operations 提供要操作的物件清單，也可以指示 Batch Operations 產生以物件清單為基礎的物件中繼資料，包括字首、儲存類別、建立日期、加密類型、KMS 金鑰 ARN 或 S3 儲存貯體金鑰狀態。S3 批次操作會呼叫相應的 API 操作來執行指定操作。單一批次操作任務可以在包含 PB 資料之儲存貯體中的數十億個物件上執行指定的操作。如需批次作業的詳細資訊，請參閱「[使用 Batch Operations 大量執行物件操作](batch-ops.md)」。

S3 Batch Operations 功能會追蹤進度、傳送通知，並存放所有動作的詳細完成報告，提供完整受管、可稽核、無伺服器的體驗。您可以透過 Amazon S3 主控台、 AWS Command Line Interface (AWS CLI) AWS SDKs或 Amazon S3 REST API 使用 S3 批次操作。如需詳細資訊，請參閱[更新物件加密](batch-ops-update-encryption.md)。

## 更新物件的加密
<a name="update-sse-encryption-single-object"></a>

您可以透過 AWS Command Line Interface (AWS CLI) AWS SDKs伺服器端加密類型。 Amazon S3 

### 更新物件的加密
<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 CLI 命令 AWS CloudShell。 AWS CloudShell 是一種以瀏覽器為基礎的預先驗證 Shell，您可以直接從 啟動 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. 使用下列命令來更新一般用途儲存貯體中單一物件 (`{{index.html}}`) 的加密 （例如 `{{amzn-s3-demo-bucket}}`)，以搭配 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 Resource Name (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 請求來更新物件的加密。如需詳細資訊，請參閱[https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateObjectEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateObjectEncryption.html)。

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

您可以使用 AWS SDKs來更新物件的加密。如需詳細資訊，請參閱[支援的 SDKs 清單](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**  
下列 適用於 Python (Boto3) 的 AWS SDK 範例示範如何將一般用途儲存貯體中物件的加密類型更新為 SSE-KMS。  

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

------