

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Migrasi Klien Enkripsi Amazon S3 (V2 ke V3)
<a name="s3-encryption-migration-v2-v3"></a>

**catatan**  
Jika Anda menggunakan V1 dari klien enkripsi S3, Anda harus terlebih dahulu bermigrasi ke V2 sebelum bermigrasi ke V3. Lihat [Migrasi Klien Enkripsi Amazon S3 (V1 ke V2)](s3-encryption-migration-v1-v2.md) petunjuk tentang migrasi dari V1 ke V2.

Topik ini menunjukkan cara memigrasikan aplikasi Anda dari klien enkripsi Amazon Simple Storage Service (Amazon S3) ke Versi 2 (V3) Amazon Simple Storage Service (Amazon S3) ke Versi 3 (V3), dan memastikan ketersediaan aplikasi selama proses migrasi. V3 memperkenalkan AES GCM dengan Kebijakan Komitmen dan Komitmen Utama untuk meningkatkan keamanan dan melindungi dari gangguan kunci data.

## Ikhtisar Migrasi
<a name="s3-encryption-migration-v2-v3-overview"></a>

Versi 3 dari klien enkripsi Amazon S3 memperkenalkan AES GCM dengan Komitmen Utama untuk keamanan yang ditingkatkan. Algoritma enkripsi baru ini memberikan perlindungan terhadap gangguan kunci data dan memastikan integritas data terenkripsi. Migrasi ke V3 memerlukan perencanaan yang cermat untuk menjaga ketersediaan aplikasi dan aksesibilitas data selama proses berlangsung.

Migrasi ini terjadi dalam dua fase:

1. **Perbarui klien yang ada untuk membaca format baru.** Pertama, gunakan versi terbaru AWS SDK for Ruby ke aplikasi Anda. Ini akan memungkinkan klien enkripsi V2 yang ada untuk mendekripsi objek yang ditulis oleh klien V3 baru. Jika aplikasi Anda menggunakan beberapa AWS SDKs, Anda harus memutakhirkan setiap SDK secara terpisah.

2. **Migrasikan enkripsi dan dekripsi klien ke V3.** Setelah semua klien enkripsi V2 Anda dapat membaca format baru, Anda dapat memigrasikan klien enkripsi dan dekripsi yang ada ke versi V3 masing-masing. Ini termasuk mengonfigurasi Kebijakan Komitmen dan memperbarui kode Anda untuk menggunakan opsi konfigurasi klien baru.

Jika Anda belum bermigrasi dari V1 ke V2, Anda harus menyelesaikan migrasi itu terlebih dahulu. Lihat [Migrasi Klien Enkripsi Amazon S3 (V1 ke V2)](s3-encryption-migration-v1-v2.md) petunjuk terperinci tentang migrasi dari V1 ke V2.

## Memahami Fitur V3
<a name="s3-encryption-migration-v2-v3-understanding"></a>

Versi 3 dari klien enkripsi Amazon S3 memperkenalkan dua fitur keamanan utama: Kebijakan Komitmen dan AES GCM dengan Komitmen Utama. Memahami fitur-fitur ini sangat penting untuk merencanakan strategi migrasi Anda dan memastikan keamanan data terenkripsi Anda.

### Kebijakan Komitmen
<a name="s3-encryption-migration-v2-v3-commitment-policies"></a>

Kebijakan Komitmen mengontrol bagaimana klien enkripsi menangani komitmen utama selama operasi enkripsi dan dekripsi. Komitmen utama memastikan bahwa data terenkripsi hanya dapat didekripsi dengan kunci yang tepat yang digunakan untuk mengenkripsinya, melindungi terhadap jenis serangan kriptografi tertentu.

Klien enkripsi V3 mendukung tiga opsi Kebijakan Komitmen:

 **`FORBID_ENCRYPT_ALLOW_DECRYPT`** 

Kebijakan ini mengenkripsi objek tanpa komitmen utama dan memungkinkan dekripsi kedua objek dengan dan tanpa komitmen utama.
+  **Perilaku enkripsi:** Objek dienkripsi tanpa komitmen kunci, menggunakan rangkaian algoritma yang sama dengan V2.
+  **Perilaku dekripsi:** Dapat mendekripsi objek yang dienkripsi dengan atau tanpa komitmen kunci.
+  **Implikasi keamanan:** Kebijakan ini tidak menegakkan komitmen utama dan memungkinkan gangguan. Objek yang dienkripsi dengan kebijakan ini tidak mendapat manfaat dari perlindungan keamanan yang ditingkatkan dari komitmen utama. Gunakan kebijakan ini hanya selama migrasi bila Anda perlu mempertahankan kompatibilitas dengan perilaku enkripsi V2.
+  **Kompatibilitas versi:** Objek yang dienkripsi dengan kebijakan ini dapat dibaca oleh semua implementasi V2 dan V3 dari klien enkripsi S3.

 **`REQUIRE_ENCRYPT_ALLOW_DECRYPT`**

Kebijakan ini mengenkripsi objek dengan komitmen utama dan memungkinkan dekripsi kedua objek dengan dan tanpa komitmen utama.
+  **Perilaku enkripsi:** Objek dienkripsi dengan komitmen utama menggunakan AES GCM dengan Komitmen Kunci.
+  **Perilaku dekripsi:** Dapat mendekripsi objek yang dienkripsi dengan atau tanpa komitmen kunci, memberikan kompatibilitas mundur.
+  **Implikasi keamanan:** Objek baru mendapat manfaat dari perlindungan komitmen utama, sementara objek yang ada tanpa komitmen utama masih dapat dibaca. Ini memberikan keseimbangan antara keamanan dan kompatibilitas mundur selama migrasi.
+  **Kompatibilitas versi:** Objek yang dienkripsi dengan kebijakan ini hanya dapat dibaca oleh V3 dan implementasi V2 terbaru dari klien enkripsi S3.

 **`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`** 

Kebijakan ini mengenkripsi objek dengan komitmen utama dan hanya memungkinkan dekripsi objek yang dienkripsi dengan komitmen utama.
+  **Perilaku enkripsi:** Objek dienkripsi dengan komitmen utama menggunakan AES GCM dengan Komitmen Kunci.
+  **Perilaku dekripsi:** Hanya dapat mendekripsi objek yang dienkripsi dengan komitmen utama. Upaya untuk mendekripsi objek tanpa komitmen utama akan gagal.
+  **Implikasi keamanan:** Kebijakan ini memberikan tingkat keamanan tertinggi dengan menegakkan komitmen utama untuk semua operasi. Gunakan kebijakan ini hanya setelah semua objek dienkripsi ulang dengan komitmen utama dan semua klien telah ditingkatkan ke V3.
+  **Kompatibilitas versi:** Objek yang dienkripsi dengan kebijakan ini hanya dapat dibaca oleh V3 dan implementasi V2 terbaru dari klien enkripsi S3. Kebijakan ini juga mencegah pembacaan objek yang dienkripsi oleh klien V2 atau V1.

**catatan**  
Saat merencanakan migrasi Anda, mulailah `REQUIRE_ENCRYPT_ALLOW_DECRYPT` dengan mempertahankan kompatibilitas mundur sambil mendapatkan manfaat keamanan dari komitmen utama untuk objek baru. Hanya pindah ke `REQUIRE_ENCRYPT_REQUIRE_DECRYPT` setelah semua objek telah dienkripsi ulang dan semua klien telah ditingkatkan ke V3.

### AES GCM dengan Komitmen Utama
<a name="s3-encryption-migration-v2-v3-aes-gcm-kc"></a>

AES GCM with Key Commitment (`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`) adalah algoritma enkripsi baru yang diperkenalkan di V3 yang memberikan peningkatan keamanan dengan melindungi terhadap gangguan kunci data. Memahami cara kerja algoritme ini dan kapan itu berlaku penting untuk merencanakan migrasi Anda.

 **Bagaimana `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` Berbeda dari Algoritma Sebelumnya** 

Versi sebelumnya dari klien enkripsi S3 menggunakan AES CBC atau AES GCM tanpa komitmen kunci untuk mengenkripsi kunci data dalam File Instruksi. `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`menambahkan komitmen kriptografi untuk proses enkripsi, yang mengikat data terenkripsi ke kunci tertentu. Ini mencegah penyerang merusak kunci data terenkripsi dalam File Instruksi dan menyebabkan klien mendekripsi data dengan kunci yang salah.

Tanpa komitmen kunci, penyerang dapat memodifikasi kunci data terenkripsi dalam File Instruksi sehingga mendekripsi ke kunci yang berbeda, berpotensi memungkinkan akses yang tidak sah atau korupsi data. `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`mencegah serangan ini dengan memastikan bahwa kunci data terenkripsi hanya dapat mendekripsi ke kunci asli yang digunakan selama enkripsi.

 **Kompatibilitas Versi** 

Objek yang dienkripsi hanya `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` dapat didekripsi oleh implementasi V3 dari klien enkripsi S3 dan versi transisi tertentu dari V2 yang menyertakan dukungan untuk membaca format V3. Klien V2 tanpa dukungan transisi ini tidak dapat mendekripsi File Instruksi yang dienkripsi. `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`

**Awas**  
Sebelum mengaktifkan enkripsi dengan `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` (dengan menggunakan `REQUIRE_ENCRYPT_ALLOW_DECRYPT` atau kebijakan `REQUIRE_ENCRYPT_REQUIRE_DECRYPT` komitmen), pastikan bahwa semua klien yang perlu membaca objek terenkripsi Anda telah ditingkatkan ke V3 atau versi transisi yang mendukung format V3. Jika ada klien V2 tanpa dukungan transisi yang mencoba membaca objek yang dienkripsi`ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY`, dekripsi akan gagal.

Selama migrasi, Anda dapat menggunakan kebijakan `FORBID_ENCRYPT_ALLOW_DECRYPT` komitmen untuk melanjutkan enkripsi tanpa `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` tetap mengizinkan klien V3 Anda membaca objek yang dienkripsi dengan komitmen utama. Ini menyediakan jalur migrasi yang aman di mana Anda pertama kali meningkatkan semua pembaca, kemudian beralih ke enkripsi dengan komitmen utama.

## Perbarui Klien yang Ada untuk Membaca Format Baru
<a name="s3-encryption-migration-v2-v3-update-clients"></a>

Klien enkripsi V3 menggunakan algoritma enkripsi dan fitur komitmen utama yang tidak didukung klien V2 secara default. Langkah pertama dalam migrasi adalah memperbarui klien dekripsi V2 Anda ke versi AWS SDK for Ruby yang dapat membaca objek terenkripsi V3. Setelah menyelesaikan langkah ini, klien V2 aplikasi Anda akan dapat mendekripsi objek yang dienkripsi oleh klien enkripsi V3.

Untuk membaca objek yang dienkripsi oleh klien V3 (yang menggunakan `REQUIRE_ENCRYPT_ALLOW_DECRYPT` atau kebijakan `REQUIRE_ENCRYPT_REQUIRE_DECRYPT` komitmen), Anda perlu menggunakan permata versi 1.93.0 atau yang lebih baru. `aws-sdk-s3` Versi ini mencakup dukungan untuk mendekripsi objek yang dienkripsi dengan AES GCM dengan Komitmen Kunci.

 **Instalasi dari Command Line** 

Untuk proyek yang menginstal `aws-sdk-s3` permata dari baris perintah, gunakan opsi versi untuk memverifikasi bahwa versi minimum 1.208.0 diinstal.

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

 **Menggunakan Gemfiles** 

Untuk proyek yang menggunakan Gemfile untuk mengelola dependensi, atur versi minimum `aws-sdk-s3` permata ke 1.208.0. Contoh:

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

1. Ubah Gemfile Anda untuk menentukan versi minimum.

1. Jalankan `bundle update aws-sdk-s3` untuk memperbarui permata.

1. Untuk memverifikasi versi Anda, jalankan`bundle info aws-sdk-s3`.

**catatan**  
Setelah memperbarui ke versi terbaru, klien enkripsi V2 Anda yang ada akan dapat mendekripsi objek yang dienkripsi oleh klien V3. Namun, mereka akan terus mengenkripsi objek baru menggunakan algoritma V2 sampai Anda memigrasikannya ke V3 seperti yang dijelaskan di bagian berikutnya.

## Migrasi Klien Enkripsi dan Dekripsi ke V3
<a name="s3-encryption-migration-v2-v3-migrate"></a>

Setelah memperbarui klien Anda untuk membaca format enkripsi baru, Anda dapat memperbarui aplikasi Anda ke klien enkripsi dan dekripsi V3. Langkah-langkah berikut menunjukkan cara berhasil memigrasikan kode Anda dari V2 ke V3.

Sebelum memperbarui kode Anda untuk menggunakan klien enkripsi V3, pastikan Anda telah mengikuti langkah-langkah sebelumnya dan menggunakan `aws-sdk-s3` permata versi 1.93.0 atau yang lebih baru.

**catatan**  
Saat mendekripsi dengan AES-GCM, baca seluruh objek sampai akhir sebelum Anda mulai menggunakan data yang didekripsi. Ini untuk memverifikasi bahwa objek belum dimodifikasi sejak dienkripsi.

### Mengkonfigurasi Klien V3
<a name="s3-encryption-migration-v2-v3-configure"></a>

Klien enkripsi V3 memperkenalkan opsi konfigurasi baru yang mengontrol perilaku komitmen kunci dan kompatibilitas mundur. Memahami opsi ini sangat penting untuk migrasi yang sukses.

 **commitment\_policy** 

`commitment_policy`Parameter mengontrol bagaimana klien enkripsi menangani komitmen utama selama operasi enkripsi dan dekripsi. Ini adalah opsi konfigurasi paling penting untuk klien V3.
+  `:require_encrypt_allow_decrypt`- Mengenkripsi objek baru dengan komitmen utama dan memungkinkan dekripsi objek dengan atau tanpa komitmen utama. Ini adalah pengaturan yang disarankan untuk migrasi, karena memberikan keamanan yang ditingkatkan untuk objek baru sambil mempertahankan kompatibilitas mundur dengan objek V2 yang ada.
+  `:forbid_encrypt_allow_decrypt`- Mengenkripsi objek baru tanpa komitmen utama (menggunakan algoritma V2) dan memungkinkan dekripsi objek dengan atau tanpa komitmen utama. Gunakan pengaturan ini hanya jika Anda perlu mempertahankan perilaku enkripsi V2 selama migrasi, seperti ketika beberapa klien belum dapat membaca objek terenkripsi V3.
+  `:require_encrypt_require_decrypt`- Mengenkripsi objek baru dengan komitmen utama dan hanya memungkinkan dekripsi objek yang dienkripsi dengan komitmen utama. Gunakan pengaturan ini hanya setelah semua objek dienkripsi ulang dengan komitmen utama dan semua klien telah ditingkatkan ke V3.

 **security\_profile** 

`security_profile`Parameter menentukan dukungan untuk membaca objek yang ditulis oleh versi klien enkripsi yang lebih lama. Parameter ini penting untuk menjaga kompatibilitas mundur selama migrasi.
+  `:v3_and_legacy`- Memungkinkan klien V3 untuk mendekripsi objek yang dienkripsi oleh klien enkripsi V1 dan V2. Gunakan pengaturan ini selama migrasi untuk memastikan klien V3 Anda dapat membaca semua objek terenkripsi yang ada.
+  `:v3`- Memungkinkan klien V3 untuk mendekripsi objek yang dienkripsi oleh klien enkripsi V2 saja. Gunakan pengaturan ini jika Anda telah memigrasikan semua objek V1 ke format V2.
+ Jika tidak ditentukan, klien hanya akan mendekripsi objek yang dienkripsi oleh klien V3. Gunakan ini hanya untuk pengembangan aplikasi baru di mana tidak ada objek lama.

 **amplope\_location** 

`envelope_location`Parameter menentukan di mana metadata enkripsi (termasuk kunci data terenkripsi) disimpan. Parameter ini mempengaruhi objek mana yang dilindungi oleh AES GCM dengan Key Commitment.
+  `:metadata`(Default) - Menyimpan metadata enkripsi di header metadata objek S3. Ini adalah perilaku default dan direkomendasikan untuk sebagian besar kasus penggunaan. Saat menggunakan penyimpanan metadata, AES GCM dengan Komitmen Utama tidak berlaku.
+  `:instruction_file`- Menyimpan metadata enkripsi dalam objek S3 terpisah (File Instruksi) dengan akhiran yang dapat dikonfigurasi. Saat menggunakan File Instruksi, AES GCM dengan Key Commitment melindungi kunci data terenkripsi dari gangguan. Gunakan pengaturan ini jika Anda memerlukan keamanan tambahan yang disediakan oleh komitmen utama untuk kunci data itu sendiri.

Saat menggunakan`:instruction_file`, Anda dapat secara opsional menentukan `instruction_file_suffix` parameter untuk menyesuaikan akhiran yang digunakan untuk objek File Instruksi. Sufiks default adalah`.instruction`.

 **Kapan Menggunakan Setiap Opsi Konfigurasi** 

Selama migrasi, ikuti strategi konfigurasi yang disarankan ini:

1.  **Migrasi Awal:** Set `commitment_policy: :require_encrypt_allow_decrypt` dan`security_profile: :v3_and_legacy`. Ini memungkinkan klien V3 Anda untuk mengenkripsi objek baru dengan komitmen utama sambil tetap dapat mendekripsi semua objek V1 dan V2 yang ada.

1.  **Setelah Semua Klien Diupgrade:** Lanjutkan menggunakan `commitment_policy: :require_encrypt_allow_decrypt` dan `security_profile: :v3_and_legacy` sampai Anda telah mengenkripsi ulang semua objek yang membutuhkan perlindungan komitmen utama.

1.  **Penegakan V3 Penuh:** Hanya setelah semua objek dienkripsi ulang dengan komitmen kunci dan Anda tidak perlu lagi membaca objek V1/V2, Anda dapat secara opsional beralih ke `commitment_policy: :require_encrypt_require_decrypt` dan menghapus `security_profile` parameter (atau mengaturnya ke `:v2` jika objek V2 masih ada).

Untuk`envelope_location`, lanjutkan menggunakan metode penyimpanan yang ada (`:metadata`atau`:instruction_file`) kecuali Anda memiliki alasan khusus untuk mengubahnya. Jika saat ini Anda menggunakan penyimpanan metadata dan menginginkan keamanan tambahan AES GCM dengan Komitmen Kunci untuk kunci data, Anda dapat beralih ke`:instruction_file`, tetapi perhatikan bahwa ini akan memerlukan pembaruan semua klien yang membaca objek ini.

### Migrasikan klien Enkripsi dan Dekripsi ke V3
<a name="s3-encryption-migration-v2-v3-migrate"></a>

Setelah memperbarui klien Anda untuk membaca format enkripsi baru, Anda dapat memperbarui aplikasi Anda ke klien enkripsi dan dekripsi V3. Contoh berikut menunjukkan cara memigrasi kode Anda dari V2 ke V3 dengan sukses.

#### Menggunakan Klien Enkripsi V3
<a name="s3-encryption-migration-v2-v3-using-v3-clients"></a>

 **Pra-migrasi (V2)** 

```
require 'aws-sdk-s3'

# Create V2 encryption client with KMS
client = Aws::S3::EncryptionV2::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v2_and_legacy,
  commitment_policy: :forbid_encrypt_allow_decrypt
)

# Encrypt and upload object
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# Download and decrypt object
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

 **Selama migrasi (V3 dengan kompatibilitas mundur)** 

```
require 'aws-sdk-s3'

# Create V3 encryption client with KMS
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3_and_legacy,
  commitment_policy: :require_encrypt_allow_decrypt
)

# Encrypt and upload object
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# Download and decrypt object
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

 **Pasca-migrasi (V3)** 

```
require 'aws-sdk-s3'

# Create V3 encryption client with KMS
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3,
  # Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT)
  # This encrypts with key commitment and does not decrypt V2 objects
  commitment_policy: :require_encrypt_require_decrypt
)

# Encrypt and upload object
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# Download and decrypt object
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

Perbedaan utama dalam V3 adalah penambahan `commitment_policy` parameter. Mengaturnya untuk `:require_encrypt_require_decrypt` memastikan bahwa objek baru dienkripsi dengan komitmen utama dan bahwa klien hanya mendekripsi objek yang dienkripsi dengan komitmen utama, memberikan keamanan yang ditingkatkan terhadap gangguan kunci data.

`put_object`Panggilan itu sendiri tetap tidak berubah. Semua peningkatan keamanan dikonfigurasi di tingkat klien.

### Contoh Tambahan
<a name="s3-encryption-migration-v2-v3-additional-examples"></a>

Bagian ini memberikan contoh tambahan untuk skenario migrasi tertentu dan opsi konfigurasi yang mungkin berguna selama migrasi V2 ke V3 Anda.

#### File Instruksi vs Penyimpanan Metadata
<a name="s3-encryption-migration-v2-v3-example-storage"></a>

Klien enkripsi S3 dapat menyimpan metadata enkripsi (termasuk kunci data terenkripsi) di dua lokasi berbeda: di header metadata objek S3 atau dalam File Instruksi terpisah. Pilihan metode penyimpanan memengaruhi objek mana yang mendapat manfaat dari AES GCM dengan perlindungan Komitmen Utama.

 **Penyimpanan Metadata (Default)** 

Secara default, klien enkripsi menyimpan metadata enkripsi di header metadata objek S3. Ini adalah pendekatan yang direkomendasikan untuk sebagian besar kasus penggunaan karena menyimpan metadata enkripsi dengan objek dan tidak memerlukan pengelolaan objek File Instruksi terpisah.

```
require 'aws-sdk-s3'

# Create V3 encryption client with metadata storage (default)
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3_and_legacy,
  commitment_policy: :require_encrypt_allow_decrypt,
  envelope_location: :metadata # Explicitly set to metadata (this is the default)
)

# Encrypt and upload object
# Encryption metadata is stored in the object's metadata headers
client.put_object(bucket: 'my-bucket', key: 'my-object',body: 'secret data')
```

Saat menggunakan penyimpanan metadata, AES GCM dengan Komitmen Kunci tidak berlaku untuk kunci data terenkripsi. Namun, enkripsi konten masih mendapat manfaat dari komitmen utama saat menggunakan `commitment_policy: :require_encrypt_allow_decrypt` atau`:require_encrypt_require_decrypt`.

 **Penyimpanan File Instruksi** 

Atau, Anda dapat mengonfigurasi klien enkripsi untuk menyimpan metadata enkripsi dalam objek S3 terpisah yang disebut File Instruksi. Saat menggunakan File Instruksi dengan V3, kunci data terenkripsi dilindungi oleh AES GCM dengan Komitmen Kunci, memberikan keamanan tambahan terhadap gangguan kunci data.

```
require 'aws-sdk-s3'

# Create V3 encryption client with instruction file storage
client = Aws::S3::EncryptionV3::Client.new(
  kms_key_id: kms_key_id,
  key_wrap_schema: :kms_context,
  content_encryption_schema: :aes_gcm_no_padding,
  security_profile: :v3_and_legacy,
  commitment_policy: :require_encrypt_allow_decrypt,
  envelope_location: :instruction_file, # Store metadata in separate instruction file
  instruction_file_suffix: '.instruction' # Optional: customize the suffix (default is '.instruction')
)

# Encrypt and upload object
# Encryption metadata is stored in a separate object: 'my-object.instruction'
client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data')

# When retrieving the object, the client automatically reads the instruction file
resp = client.get_object(bucket: 'my-bucket', key: 'my-object')
decrypted_data = resp.body.read
```

Saat menggunakan`envelope_location: :instruction_file`, klien enkripsi membuat dua objek S3:

1. Objek data terenkripsi (misalnya,) `my-object`

1. File Instruksi yang berisi metadata enkripsi (mis.,) `my-object.instruction`

`instruction_file_suffix`Parameter ini memungkinkan Anda untuk menyesuaikan akhiran yang digunakan untuk File Instruksi. Nilai default-nya adalah `.instruction`.

 **Kapan Menggunakan Setiap Metode Penyimpanan** 
+  **Gunakan Penyimpanan Metadata** untuk sebagian besar skenario. Ini menyederhanakan manajemen objek karena metadata enkripsi berjalan dengan objek.
+  **Gunakan Penyimpanan File Instruksi** ketika ukuran metadata objek menjadi perhatian atau ketika Anda perlu memisahkan metadata enkripsi dari objek terenkripsi. Perhatikan bahwa menggunakan File Instruksi memerlukan pengelolaan dua objek S3 (objek terenkripsi dan file instruksinya), bukan satu.

**Awas**  
Jika Anda mengubah dari penyimpanan metadata ke penyimpanan file instruksi (atau sebaliknya), objek yang ada dienkripsi dengan metode penyimpanan lama tidak akan dapat dibaca oleh klien yang dikonfigurasi dengan metode penyimpanan baru. Rencanakan metode penyimpanan Anda dengan hati-hati dan pertahankan konsistensi di seluruh aplikasi Anda.