

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

# Contoh kode Amazon S3 menggunakan AWS SDK untuk C\$1\$1
<a name="examples-s3"></a>

[Amazon S3](https://aws.amazon.com/s3) adalah penyimpanan objek yang dibangun untuk menyimpan dan mengambil sejumlah data dari mana saja. Ada beberapa kelas yang disediakan oleh antarmuka AWS SDK untuk C\$1\$1 to dengan Amazon S3. 

**catatan**  
Hanya kode yang diperlukan untuk menunjukkan teknik tertentu yang disediakan dalam Panduan ini, tetapi [kode contoh lengkap tersedia di GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp). Pada GitHub Anda dapat mengunduh satu file sumber atau Anda dapat mengkloning repositori secara lokal untuk mendapatkan, membangun, dan menjalankan semua contoh.
+ [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_s3_client.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_s3_client.html) kelas 

  `S3Client`Perpustakaan adalah antarmuka Amazon S3 berfitur lengkap.

  `list_buckets_disabling_dns_cache.cpp`Contoh dalam set ini ditujukan khusus untuk bekerja dengan CURL aktif Linux/Mac (meskipun dapat dimodifikasi untuk bekerja pada Windows). Jika Anda menggunakan Windows, hapus file `list_buckets_disabling_dns_cache.cpp` sebelum membangun proyek karena bergantung pada curl Linux HttpClient .

  Contoh kode yang menggunakan `S3Client` ada di [`s3`folder](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3) di Github. Lihat [Readme](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/README.md) di Github untuk daftar lengkap fungsi yang ditunjukkan oleh kumpulan contoh ini.

  Bagian dari rangkaian `s3` contoh dibahas dalam detail tambahan dalam panduan ini:
  + [Membuat, mencantumkan, dan menghapus bucket](examples-s3-buckets.md)
  + [Operasi pada objek](examples-s3-objects.md)— Mengunggah dan mengunduh objek data
  + [Mengelola Izin Akses Amazon S3](examples-s3-access-permissions.md)
  + [Mengelola Akses ke Bucket Amazon S3 Menggunakan Kebijakan Bucket](examples-s3-bucket-policies.md)
  + [Mengonfigurasi Bucket Amazon S3 sebagai Situs Web](examples-s3-website-configuration.md)
+ [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3-crt/html/class_aws_1_1_s3_crt_1_1_s3_crt_client.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3-crt/html/class_aws_1_1_s3_crt_1_1_s3_crt_client.html) kelas 

  `S3CrtClient`Ditambahkan di SDK versi 1.9. `S3CrtClient`menyediakan throughput tinggi untuk Amazon S3 GET (download) dan PUT (upload) operasi. `S3CrtClient`Ini diimplementasikan di bagian atas pustaka AWS Common Runtime (CRT). 

  Contoh kode yang menggunakan `S3CrtClient` ada di [`s3-crt`folder](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt) di Github. Lihat [Readme](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt/README.md) di Github untuk daftar lengkap fungsi yang ditunjukkan oleh kumpulan contoh ini.
  + [Menggunakan `S3CrtClient` untuk operasi Amazon S3](examples-s3-crt.md)
+ [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-transfer/html/class_aws_1_1_transfer_1_1_transfer_manager.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-transfer/html/class_aws_1_1_transfer_1_1_transfer_manager.html) kelas 

  `TransferManager`adalah layanan yang dikelola sepenuhnya yang memungkinkan transfer file melalui File Transfer Protocol (FTP), File Transfer Protocol melalui SSL (FTPS), atau Secure Shell (SSH) File Transfer Protocol (SFTP) langsung masuk dan keluar dari Amazon S3.

  Contoh kode yang menggunakan `TransferManager` ada di [`transfer-manager`folder](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/transfer-manager) di Github. Lihat [Readme](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/transfer-manager/README.md) di Github untuk daftar lengkap fungsi yang ditunjukkan oleh kumpulan contoh ini.
  + [Menggunakan TransferManager untuk operasi Amazon S3](examples-s3-transfermanager.md)

# Membuat, mencantumkan, dan menghapus bucket
<a name="examples-s3-buckets"></a>

*Setiap *objek* atau file di Amazon Simple Storage Service (Amazon S3) Simple Storage Service (Amazon S3) terdapat dalam bucket, yang mewakili folder objek.* Setiap bucket memiliki nama yang unik secara global di dalamnya AWS. Untuk informasi selengkapnya, lihat [Bekerja dengan Bucket Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html) di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensil](credentials.md).

## Buat daftar bucket
<a name="list-buckets"></a>

Untuk menjalankan `list_buckets` contoh, pada prompt perintah, navigasikan ke folder tempat sistem build Anda membuat executable build Anda. Jalankan seperti yang dapat dieksekusi `run_list_buckets` (nama file yang dapat dieksekusi penuh Anda akan berbeda berdasarkan sistem operasi Anda). Output mencantumkan bucket akun Anda jika Anda memilikinya, atau menampilkan daftar kosong jika Anda tidak memiliki ember.

Dalam`list_buckets.cpp`, ada dua metode.
+ `main()`panggilan`ListBuckets()`. 
+ `ListBuckets()`menggunakan SDK untuk menanyakan bucket Anda.

`S3Client`Objek memanggil `ListBuckets()` metode SDK. Jika berhasil, metode mengembalikan `ListBucketOutcome` objek, yang berisi `ListBucketResult` objek. `ListBucketResult`Objek memanggil `GetBuckets()` metode untuk mendapatkan daftar `Bucket` objek yang berisi informasi tentang setiap bucket Amazon S3 di akun Anda.

 **Kode** 

```
bool AwsDoc::S3::listBuckets(const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);

    auto outcome = client.ListBuckets();

    bool result = true;
    if (!outcome.IsSuccess()) {
        std::cerr << "Failed with error: " << outcome.GetError() << std::endl;
        result = false;
    } else {
        std::cout << "Found " << outcome.GetResult().GetBuckets().size() << " buckets\n";
        for (auto &&b: outcome.GetResult().GetBuckets()) {
            std::cout << b.GetName() << std::endl;
        }
    }

    return result;
}
```

Lihat [contoh list\$1buckets](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/list_buckets.cpp) lengkap di Github.

## Buat bucket
<a name="create-bucket"></a>



Untuk menjalankan `create_bucket` contoh, pada prompt perintah, navigasikan ke folder tempat sistem build Anda membuat executable build Anda. Jalankan seperti yang dapat dieksekusi `run_create_bucket` (nama file yang dapat dieksekusi penuh Anda akan berbeda berdasarkan sistem operasi Anda). Kode membuat bucket kosong di bawah akun Anda dan kemudian menampilkan keberhasilan atau kegagalan permintaan.

Dalam`create_bucket.cpp`, ada dua metode. 
+ `main()`panggilan`CreateBucket()`. Di`main()`, Anda perlu mengubah Wilayah AWS ke Wilayah akun Anda dengan menggunakan`enum`. Anda dapat melihat Wilayah akun Anda dengan masuk ke [Konsol Manajemen AWS](https://console.aws.amazon.com/), dan menemukan Wilayah di sudut kanan atas. 
+ `CreateBucket()`menggunakan SDK untuk membuat bucket. 



`S3Client`Objek memanggil `CreateBucket()` metode SDK, meneruskan a `CreateBucketRequest` dengan nama bucket. Secara default, bucket dibuat di Wilayah *us-east-1 (Virginia N*.). Jika Wilayah Anda bukan *us-east-1* maka kode akan menyiapkan batasan bucket untuk memastikan bucket dibuat di Wilayah Anda.

 **Kode** 

```
bool AwsDoc::S3::createBucket(const Aws::String &bucketName,
                              const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);
    Aws::S3::Model::CreateBucketRequest request;
    request.SetBucket(bucketName);

    if (clientConfig.region != "us-east-1") {
        Aws::S3::Model::CreateBucketConfiguration createBucketConfig;
        createBucketConfig.SetLocationConstraint(
                Aws::S3::Model::BucketLocationConstraintMapper::GetBucketLocationConstraintForName(
                        clientConfig.region));
        request.SetCreateBucketConfiguration(createBucketConfig);
    }

    Aws::S3::Model::CreateBucketOutcome outcome = client.CreateBucket(request);
    if (!outcome.IsSuccess()) {
        auto err = outcome.GetError();
        std::cerr << "Error: createBucket: " <<
                  err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        std::cout << "Created bucket " << bucketName <<
                  " in the specified AWS Region." << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat contoh [create\$1buckets](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/create_bucket.cpp) lengkap di Github.

## Hapus bucket
<a name="delete-bucket"></a>



Untuk menjalankan `delete_bucket` contoh, pada prompt perintah, navigasikan ke folder tempat sistem build Anda membuat executable build Anda. Jalankan seperti yang dapat dieksekusi `run_delete_bucket` (nama file yang dapat dieksekusi penuh Anda akan berbeda berdasarkan sistem operasi Anda). Kode menghapus bucket yang ditentukan di akun Anda dan kemudian menampilkan keberhasilan atau kegagalan permintaan.

Di dalamnya `delete_bucket.cpp` ada dua metode. 
+ `main()`panggilan`DeleteBucket()`. Di`main()`, Anda perlu mengubah Wilayah AWS ke Wilayah akun Anda dengan menggunakan`enum`. Anda juga perlu mengubah `bucket_name` ke nama ember untuk dihapus. 
+ `DeleteBucket()`menggunakan SDK untuk menghapus bucket. 



`S3Client`Objek menggunakan `DeleteBucket()` metode SDK, meneruskan `DeleteBucketRequest` objek dengan nama bucket untuk dihapus. Ember harus kosong agar berhasil.

 **Kode**

```
bool AwsDoc::S3::deleteBucket(const Aws::String &bucketName,
                              const Aws::S3::S3ClientConfiguration &clientConfig) {

    Aws::S3::S3Client client(clientConfig);

    Aws::S3::Model::DeleteBucketRequest request;
    request.SetBucket(bucketName);

    Aws::S3::Model::DeleteBucketOutcome outcome =
            client.DeleteBucket(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();
        std::cerr << "Error: deleteBucket: " <<
                  err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        std::cout << "The bucket was deleted" << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh delete\$1bucket](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_bucket.cpp) lengkap di Github.

# Operasi pada objek
<a name="examples-s3-objects"></a>

Objek Amazon S3 mewakili *file*, yang merupakan kumpulan data. Setiap benda harus berada di dalam [ember](examples-s3-buckets.md).

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensi](credentials.md).

## Unggah file ke ember
<a name="upload-object"></a>

Gunakan `PutObject` fungsi `S3Client` objek, berikan nama bucket, nama kunci, dan file untuk diunggah. `Aws::FStream`digunakan untuk mengunggah konten file lokal ke ember. Bucket harus ada atau kesalahan akan terjadi.

Untuk contoh mengunggah objek secara asinkron, lihat [Pemrograman asinkron menggunakan AWS SDK untuk C\$1\$1](async-methods.md)

 **Kode** 

```
bool AwsDoc::S3::putObject(const Aws::String &bucketName,
                           const Aws::String &fileName,
                           const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::PutObjectRequest request;
    request.SetBucket(bucketName);
    //We are using the name of the file as the key for the object in the bucket.
    //However, this is just a string and can be set according to your retrieval needs.
    request.SetKey(fileName);

    std::shared_ptr<Aws::IOStream> inputData =
            Aws::MakeShared<Aws::FStream>("SampleAllocationTag",
                                          fileName.c_str(),
                                          std::ios_base::in | std::ios_base::binary);

    if (!*inputData) {
        std::cerr << "Error unable to read file " << fileName << std::endl;
        return false;
    }

    request.SetBody(inputData);

    Aws::S3::Model::PutObjectOutcome outcome =
            s3Client.PutObject(request);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error: putObject: " <<
                  outcome.GetError().GetMessage() << std::endl;
    } else {
        std::cout << "Added object '" << fileName << "' to bucket '"
                  << bucketName << "'.";
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_object.cpp) di Github.

## Unggah string ke ember
<a name="upload-object-string"></a>

Gunakan `PutObject` fungsi `S3Client` objek, berikan nama bucket, nama kunci, dan file untuk diunggah. Bucket harus ada atau kesalahan akan terjadi. Contoh ini berbeda dari yang sebelumnya dengan menggunakan `Aws::StringStream` untuk mengunggah objek data string dalam memori langsung ke bucket.

Untuk contoh mengunggah objek secara asinkron, lihat [Pemrograman asinkron menggunakan AWS SDK untuk C\$1\$1](async-methods.md)

 **Kode** 

```
bool AwsDoc::S3::putObjectBuffer(const Aws::String &bucketName,
                                 const Aws::String &objectName,
                                 const std::string &objectContent,
                                 const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::PutObjectRequest request;
    request.SetBucket(bucketName);
    request.SetKey(objectName);

    const std::shared_ptr<Aws::IOStream> inputData =
            Aws::MakeShared<Aws::StringStream>("");
    *inputData << objectContent.c_str();

    request.SetBody(inputData);

    Aws::S3::Model::PutObjectOutcome outcome = s3Client.PutObject(request);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error: putObjectBuffer: " <<
                  outcome.GetError().GetMessage() << std::endl;
    } else {
        std::cout << "Success: Object '" << objectName << "' with content '"
                  << objectContent << "' uploaded to bucket '" << bucketName << "'.";
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_object_buffer.cpp) di Github.

## Mencantumkan Objek
<a name="list-objects"></a>

Untuk mendapatkan daftar objek dalam ember, gunakan `ListObjects` fungsi `S3Client` objek. Sediakan dengan `ListObjectsRequest` yang Anda atur dengan nama ember untuk mencantumkan isinya.

`ListObjects`Fungsi mengembalikan `ListObjectsOutcome` objek yang dapat Anda gunakan untuk mendapatkan daftar objek dalam bentuk `Object` contoh.

 **Kode** 

```
bool AwsDoc::S3::listObjects(const Aws::String &bucketName,
                             Aws::Vector<Aws::String> &keysResult,
                             const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::ListObjectsV2Request request;
    request.WithBucket(bucketName);

    Aws::String continuationToken; // Used for pagination.
    Aws::Vector<Aws::S3::Model::Object> allObjects;

    do {
        if (!continuationToken.empty()) {
            request.SetContinuationToken(continuationToken);
        }

        auto outcome = s3Client.ListObjectsV2(request);

        if (!outcome.IsSuccess()) {
            std::cerr << "Error: listObjects: " <<
                      outcome.GetError().GetMessage() << std::endl;
            return false;
        } else {
            Aws::Vector<Aws::S3::Model::Object> objects =
                    outcome.GetResult().GetContents();

            allObjects.insert(allObjects.end(), objects.begin(), objects.end());
            continuationToken = outcome.GetResult().GetNextContinuationToken();
        }
    } while (!continuationToken.empty());

    std::cout << allObjects.size() << " object(s) found:" << std::endl;

    for (const auto &object: allObjects) {
        std::cout << "  " << object.GetKey() << std::endl;
        keysResult.push_back(object.GetKey());
    }

    return true;
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/list_objects.cpp) di Github.

## Unduh objek
<a name="download-object"></a>

Gunakan `GetObject` fungsi `S3Client` objek, berikan `GetObjectRequest` yang Anda atur dengan nama ember dan kunci objek untuk diunduh. `GetObject`mengembalikan [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/namespace_aws_1_1_s3_1_1_model.html#a6e16a7b25e8c7547934968a538a15272](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/namespace_aws_1_1_s3_1_1_model.html#a6e16a7b25e8c7547934968a538a15272)objek yang terdiri dari a [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_get_object_result.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_get_object_result.html)dan a [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_s3_error.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_s3_error.html). `GetObjectResult`dapat digunakan untuk mengakses data objek S3.

Contoh berikut mengunduh objek dari Amazon S3. Isi objek disimpan dalam variabel lokal dan baris pertama konten adalah output ke konsol.

 **Kode** 

```
bool AwsDoc::S3::getObject(const Aws::String &objectKey,
                           const Aws::String &fromBucket,
                           const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);

    Aws::S3::Model::GetObjectRequest request;
    request.SetBucket(fromBucket);
    request.SetKey(objectKey);

    Aws::S3::Model::GetObjectOutcome outcome =
            client.GetObject(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();
        std::cerr << "Error: getObject: " <<
                  err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        std::cout << "Successfully retrieved '" << objectKey << "' from '"
                  << fromBucket << "'." << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_object.cpp) di Github.

## Hapus objek
<a name="delete-object"></a>

Gunakan `DeleteObject` fungsi `S3Client` objek, meneruskannya `DeleteObjectRequest` yang Anda atur dengan nama ember dan objek untuk diunduh. *Bucket dan kunci objek yang ditentukan harus ada atau kesalahan akan terjadi*.

 **Kode** 

```
bool AwsDoc::S3::deleteObject(const Aws::String &objectKey,
                              const Aws::String &fromBucket,
                              const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);
    Aws::S3::Model::DeleteObjectRequest request;

    request.WithKey(objectKey)
            .WithBucket(fromBucket);

    Aws::S3::Model::DeleteObjectOutcome outcome =
            client.DeleteObject(request);

    if (!outcome.IsSuccess()) {
        auto err = outcome.GetError();
        std::cerr << "Error: deleteObject: " <<
                  err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        std::cout << "Successfully deleted the object." << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_object.cpp) di Github.

# Mengelola Izin Akses Amazon S3
<a name="examples-s3-access-permissions"></a>

Izin akses untuk bucket atau objek Amazon S3 ditentukan dalam daftar kontrol akses (ACL). ACL menentukan pemilik bucket/object dan daftar hibah. Setiap hibah menentukan pengguna (atau penerima hibah) dan izin pengguna untuk mengakses ember/objek, seperti akses BACA atau TULIS.

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensil](credentials.md).

## Mengelola Daftar Kontrol Akses Objek
<a name="manage-an-object-s-access-control-list"></a>

Daftar kontrol akses untuk objek dapat diambil dengan memanggil `S3Client` metode`GetObjectAcl`. Metode ini menerima nama-nama objek dan embernya. Nilai pengembalian termasuk ACL `Owner` dan daftar. `Grants`

```
bool AwsDoc::S3::getObjectAcl(const Aws::String &bucketName,
                              const Aws::String &objectKey,
                              const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::GetObjectAclRequest request;
    request.SetBucket(bucketName);
    request.SetKey(objectKey);

    Aws::S3::Model::GetObjectAclOutcome outcome =
            s3Client.GetObjectAcl(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();
        std::cerr << "Error: getObjectAcl: "
                  << err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        Aws::Vector<Aws::S3::Model::Grant> grants =
                outcome.GetResult().GetGrants();

        for (auto it = grants.begin(); it != grants.end(); it++) {
            std::cout << "For object " << objectKey << ": "
                      << std::endl << std::endl;

            Aws::S3::Model::Grant grant = *it;
            Aws::S3::Model::Grantee grantee = grant.GetGrantee();

            if (grantee.TypeHasBeenSet()) {
                std::cout << "Type:          "
                          << getGranteeTypeString(grantee.GetType()) << std::endl;
            }

            if (grantee.DisplayNameHasBeenSet()) {
                std::cout << "Display name:  "
                          << grantee.GetDisplayName() << std::endl;
            }

            if (grantee.EmailAddressHasBeenSet()) {
                std::cout << "Email address: "
                          << grantee.GetEmailAddress() << std::endl;
            }

            if (grantee.IDHasBeenSet()) {
                std::cout << "ID:            "
                          << grantee.GetID() << std::endl;
            }

            if (grantee.URIHasBeenSet()) {
                std::cout << "URI:           "
                          << grantee.GetURI() << std::endl;
            }

            std::cout << "Permission:    " <<
                      getPermissionString(grant.GetPermission()) <<
                      std::endl << std::endl;
        }
    }

    return outcome.IsSuccess();
}

//! Routine which converts a built-in type enumeration to a human-readable string.
/*!
 \param type: Type enumeration.
 \return String: Human-readable string
*/
Aws::String getGranteeTypeString(const Aws::S3::Model::Type &type) {
    switch (type) {
        case Aws::S3::Model::Type::AmazonCustomerByEmail:
            return "Email address of an AWS account";
        case Aws::S3::Model::Type::CanonicalUser:
            return "Canonical user ID of an AWS account";
        case Aws::S3::Model::Type::Group:
            return "Predefined Amazon S3 group";
        case Aws::S3::Model::Type::NOT_SET:
            return "Not set";
        default:
            return "Type unknown";
    }
}

//! Routine which converts a built-in type enumeration to a human-readable string.
/*!
 \param permission: Permission enumeration.
 \return String: Human-readable string
*/
Aws::String getPermissionString(const Aws::S3::Model::Permission &permission) {
    switch (permission) {
        case Aws::S3::Model::Permission::FULL_CONTROL:
            return "Can read this object's data and its metadata, "
                   "and read/write this object's permissions";
        case Aws::S3::Model::Permission::NOT_SET:
            return "Permission not set";
        case Aws::S3::Model::Permission::READ:
            return "Can read this object's data and its metadata";
        case Aws::S3::Model::Permission::READ_ACP:
            return "Can read this object's permissions";
            // case Aws::S3::Model::Permission::WRITE // Not applicable.
        case Aws::S3::Model::Permission::WRITE_ACP:
            return "Can write this object's permissions";
        default:
            return "Permission unknown";
    }
}
```

ACL dapat dimodifikasi dengan membuat ACL baru atau mengubah hibah yang ditentukan dalam ACL saat ini. ACL yang diperbarui menjadi ACL baru saat ini dengan meneruskannya ke metode. `PutObjectAcl`

Kode berikut menggunakan ACL diambil oleh `GetObjectAcl` dan menambahkan hibah baru untuk itu. Pengguna atau penerima diberikan izin BACA untuk objek tersebut. ACL yang dimodifikasi diteruskan ke`PutObjectAcl`, menjadikannya ACL baru saat ini. 

```
bool AwsDoc::S3::putObjectAcl(const Aws::String &bucketName, const Aws::String &objectKey, const Aws::String &ownerID,
                              const Aws::String &granteePermission, const Aws::String &granteeType,
                              const Aws::String &granteeID, const Aws::String &granteeEmailAddress,
                              const Aws::String &granteeURI, const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::Owner owner;
    owner.SetID(ownerID);

    Aws::S3::Model::Grantee grantee;
    grantee.SetType(setGranteeType(granteeType));

    if (!granteeEmailAddress.empty()) {
        grantee.SetEmailAddress(granteeEmailAddress);
    }

    if (!granteeID.empty()) {
        grantee.SetID(granteeID);
    }

    if (!granteeURI.empty()) {
        grantee.SetURI(granteeURI);
    }

    Aws::S3::Model::Grant grant;
    grant.SetGrantee(grantee);
    grant.SetPermission(setGranteePermission(granteePermission));

    Aws::Vector<Aws::S3::Model::Grant> grants;
    grants.push_back(grant);

    Aws::S3::Model::AccessControlPolicy acp;
    acp.SetOwner(owner);
    acp.SetGrants(grants);

    Aws::S3::Model::PutObjectAclRequest request;
    request.SetAccessControlPolicy(acp);
    request.SetBucket(bucketName);
    request.SetKey(objectKey);

    Aws::S3::Model::PutObjectAclOutcome outcome =
            s3Client.PutObjectAcl(request);

    if (!outcome.IsSuccess()) {
        auto error = outcome.GetError();
        std::cerr << "Error: putObjectAcl: " << error.GetExceptionName()
                  << " - " << error.GetMessage() << std::endl;
    } else {
        std::cout << "Successfully added an ACL to the object '" << objectKey
                  << "' in the bucket '" << bucketName << "'." << std::endl;
    }

    return outcome.IsSuccess();
}

//! Routine which converts a human-readable string to a built-in type enumeration.
/*!
 \param access: Human readable string.
 \return Permission: Permission enumeration.
*/
Aws::S3::Model::Permission setGranteePermission(const Aws::String &access) {
    if (access == "FULL_CONTROL")
        return Aws::S3::Model::Permission::FULL_CONTROL;
    if (access == "WRITE")
        return Aws::S3::Model::Permission::WRITE;
    if (access == "READ")
        return Aws::S3::Model::Permission::READ;
    if (access == "WRITE_ACP")
        return Aws::S3::Model::Permission::WRITE_ACP;
    if (access == "READ_ACP")
        return Aws::S3::Model::Permission::READ_ACP;
    return Aws::S3::Model::Permission::NOT_SET;
}

//! Routine which converts a human-readable string to a built-in type enumeration.
/*!
 \param type: Human readable string.
 \return Type: Type enumeration.
*/
Aws::S3::Model::Type setGranteeType(const Aws::String &type) {
    if (type == "Amazon customer by email")
        return Aws::S3::Model::Type::AmazonCustomerByEmail;
    if (type == "Canonical user")
        return Aws::S3::Model::Type::CanonicalUser;
    if (type == "Group")
        return Aws::S3::Model::Type::Group;
    return Aws::S3::Model::Type::NOT_SET;
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_put_object_acl.cpp) di Github.

## Mengelola Daftar Kontrol Akses Bucket
<a name="manage-a-bucket-s-access-control-list"></a>

Dalam kebanyakan kasus, metode yang lebih disukai untuk menyetel izin akses bucket adalah dengan menentukan kebijakan bucket. Namun, bucket juga mendukung daftar kontrol akses bagi pengguna yang ingin menggunakannya.

Pengelolaan daftar kontrol akses untuk bucket identik dengan yang digunakan untuk objek. `GetBucketAcl`Metode ini mengambil ACL bucket saat ini dan `PutBucketAcl` menerapkan ACL baru ke bucket.

Kode berikut menunjukkan mendapatkan dan menyetel ACL bucket.

```
//! Routine which demonstrates setting the ACL for an S3 bucket.
/*!
  \param bucketName: Name of a bucket.
  \param ownerID: The canonical ID of the bucket owner.
   See https://docs.aws.amazon.com/AmazonS3/latest/userguide/finding-canonical-user-id.html for more information.
  \param granteePermission: The access level to enable for the grantee.
  \param granteeType: The type of grantee.
  \param granteeID: The canonical ID of the grantee.
  \param granteeEmailAddress: The email address associated with the grantee's AWS account.
  \param granteeURI: The URI of a built-in access group.
  \param clientConfig: Aws client configuration.
  \return bool: Function succeeded.
*/

bool AwsDoc::S3::getPutBucketAcl(const Aws::String &bucketName,
                                 const Aws::String &ownerID,
                                 const Aws::String &granteePermission,
                                 const Aws::String &granteeType,
                                 const Aws::String &granteeID,
                                 const Aws::String &granteeEmailAddress,
                                 const Aws::String &granteeURI,
                                 const Aws::S3::S3ClientConfiguration &clientConfig) {
    bool result = ::putBucketAcl(bucketName, ownerID, granteePermission, granteeType,
                                 granteeID,
                                 granteeEmailAddress,
                                 granteeURI,
                                 clientConfig);
    if (result) {
        result = ::getBucketAcl(bucketName, clientConfig);
    }

    return result;
}

//! Routine which demonstrates setting the ACL for an S3 bucket.
/*!
  \param bucketName: Name of from bucket.
  \param ownerID: The canonical ID of the bucket owner.
   See https://docs.aws.amazon.com/AmazonS3/latest/userguide/finding-canonical-user-id.html for more information.
  \param granteePermission: The access level to enable for the grantee.
  \param granteeType: The type of grantee.
  \param granteeID: The canonical ID of the grantee.
  \param granteeEmailAddress: The email address associated with the grantee's AWS account.
  \param granteeURI: The URI of a built-in access group.
  \param clientConfig: Aws client configuration.
  \return bool: Function succeeded.
*/

bool putBucketAcl(const Aws::String &bucketName,
                  const Aws::String &ownerID,
                  const Aws::String &granteePermission,
                  const Aws::String &granteeType,
                  const Aws::String &granteeID,
                  const Aws::String &granteeEmailAddress,
                  const Aws::String &granteeURI,
                  const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::Owner owner;
    owner.SetID(ownerID);

    Aws::S3::Model::Grantee grantee;
    grantee.SetType(setGranteeType(granteeType));

    if (!granteeEmailAddress.empty()) {
        grantee.SetEmailAddress(granteeEmailAddress);
    }

    if (!granteeID.empty()) {
        grantee.SetID(granteeID);
    }

    if (!granteeURI.empty()) {
        grantee.SetURI(granteeURI);
    }

    Aws::S3::Model::Grant grant;
    grant.SetGrantee(grantee);
    grant.SetPermission(setGranteePermission(granteePermission));

    Aws::Vector<Aws::S3::Model::Grant> grants;
    grants.push_back(grant);

    Aws::S3::Model::AccessControlPolicy acp;
    acp.SetOwner(owner);
    acp.SetGrants(grants);

    Aws::S3::Model::PutBucketAclRequest request;
    request.SetAccessControlPolicy(acp);
    request.SetBucket(bucketName);

    Aws::S3::Model::PutBucketAclOutcome outcome =
            s3Client.PutBucketAcl(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &error = outcome.GetError();

        std::cerr << "Error: putBucketAcl: " << error.GetExceptionName()
                  << " - " << error.GetMessage() << std::endl;
    } else {
        std::cout << "Successfully added an ACL to the bucket '" << bucketName
                  << "'." << std::endl;
    }

    return outcome.IsSuccess();
}

//! Routine which demonstrates getting the ACL for an S3 bucket.
/*!
  \param bucketName: Name of the s3 bucket.
  \param clientConfig: Aws client configuration.
  \return bool: Function succeeded.
*/
bool getBucketAcl(const Aws::String &bucketName,
                  const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::GetBucketAclRequest request;
    request.SetBucket(bucketName);

    Aws::S3::Model::GetBucketAclOutcome outcome =
            s3Client.GetBucketAcl(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();
        std::cerr << "Error: getBucketAcl: "
                  << err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        const Aws::Vector<Aws::S3::Model::Grant> &grants =
                outcome.GetResult().GetGrants();

        for (const Aws::S3::Model::Grant &grant: grants) {
            const Aws::S3::Model::Grantee &grantee = grant.GetGrantee();

            std::cout << "For bucket " << bucketName << ": "
                      << std::endl << std::endl;

            if (grantee.TypeHasBeenSet()) {
                std::cout << "Type:          "
                          << getGranteeTypeString(grantee.GetType()) << std::endl;
            }

            if (grantee.DisplayNameHasBeenSet()) {
                std::cout << "Display name:  "
                          << grantee.GetDisplayName() << std::endl;
            }

            if (grantee.EmailAddressHasBeenSet()) {
                std::cout << "Email address: "
                          << grantee.GetEmailAddress() << std::endl;
            }

            if (grantee.IDHasBeenSet()) {
                std::cout << "ID:            "
                          << grantee.GetID() << std::endl;
            }

            if (grantee.URIHasBeenSet()) {
                std::cout << "URI:           "
                          << grantee.GetURI() << std::endl;
            }

            std::cout << "Permission:    " <<
                      getPermissionString(grant.GetPermission()) <<
                      std::endl << std::endl;
        }
    }

    return outcome.IsSuccess();
}

//! Routine which converts a built-in type enumeration to a human-readable string.
/*!
 \param permission: Permission enumeration.
 \return String: Human-readable string.
*/

Aws::String getPermissionString(const Aws::S3::Model::Permission &permission) {
    switch (permission) {
        case Aws::S3::Model::Permission::FULL_CONTROL:
            return "Can list objects in this bucket, create/overwrite/delete "
                   "objects in this bucket, and read/write this "
                   "bucket's permissions";
        case Aws::S3::Model::Permission::NOT_SET:
            return "Permission not set";
        case Aws::S3::Model::Permission::READ:
            return "Can list objects in this bucket";
        case Aws::S3::Model::Permission::READ_ACP:
            return "Can read this bucket's permissions";
        case Aws::S3::Model::Permission::WRITE:
            return "Can create, overwrite, and delete objects in this bucket";
        case Aws::S3::Model::Permission::WRITE_ACP:
            return "Can write this bucket's permissions";
        default:
            return "Permission unknown";
    }
}

//! Routine which converts a human-readable string to a built-in type enumeration
/*!
 \param access: Human readable string.
 \return Permission: Permission enumeration.
*/
Aws::S3::Model::Permission setGranteePermission(const Aws::String &access) {
    if (access == "FULL_CONTROL")
        return Aws::S3::Model::Permission::FULL_CONTROL;
    if (access == "WRITE")
        return Aws::S3::Model::Permission::WRITE;
    if (access == "READ")
        return Aws::S3::Model::Permission::READ;
    if (access == "WRITE_ACP")
        return Aws::S3::Model::Permission::WRITE_ACP;
    if (access == "READ_ACP")
        return Aws::S3::Model::Permission::READ_ACP;
    return Aws::S3::Model::Permission::NOT_SET;
}

//! Routine which converts a built-in type enumeration to a human-readable string.
/*!
 \param type: Type enumeration.
 \return bool: Human-readable string.
*/
Aws::String getGranteeTypeString(const Aws::S3::Model::Type &type) {
    switch (type) {
        case Aws::S3::Model::Type::AmazonCustomerByEmail:
            return "Email address of an AWS account";
        case Aws::S3::Model::Type::CanonicalUser:
            return "Canonical user ID of an AWS account";
        case Aws::S3::Model::Type::Group:
            return "Predefined Amazon S3 group";
        case Aws::S3::Model::Type::NOT_SET:
            return "Not set";
        default:
            return "Type unknown";
    }
}

Aws::S3::Model::Type setGranteeType(const Aws::String &type) {
    if (type == "Amazon customer by email")
        return Aws::S3::Model::Type::AmazonCustomerByEmail;
    if (type == "Canonical user")
        return Aws::S3::Model::Type::CanonicalUser;
    if (type == "Group")
        return Aws::S3::Model::Type::Group;
    return Aws::S3::Model::Type::NOT_SET;
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_put_bucket_acl.cpp) di Github.

# Mengelola Akses ke Bucket Amazon S3 Menggunakan Kebijakan Bucket
<a name="examples-s3-bucket-policies"></a>

Anda dapat menyetel, mendapatkan, atau menghapus *kebijakan bucket* untuk mengelola akses ke bucket Amazon S3 Anda.

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensyal](credentials.md).

## Menetapkan Kebijakan Bucket
<a name="set-s3-bucket-policy"></a>

Anda dapat menyetel kebijakan bucket untuk bucket S3 tertentu dengan memanggil `PutBucketPolicy` fungsi dan menyediakannya dengan nama bucket dan representasi JSON kebijakan di file. `S3Client` [PutBucketPolicyRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_put_bucket_policy_request.html)

 **Kode** 

```
//! Build a policy JSON string.
/*!
  \param userArn: Aws user Amazon Resource Name (ARN).
      For more information, see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns.
  \param bucketName: Name of a bucket.
  \return String: Policy as JSON string.
*/

Aws::String getPolicyString(const Aws::String &userArn,
                            const Aws::String &bucketName) {
    return
            "{\n"
            "   \"Version\":\"2012-10-17\",\n"
            "   \"Statement\":[\n"
            "       {\n"
            "           \"Sid\": \"1\",\n"
            "           \"Effect\": \"Allow\",\n"
            "           \"Principal\": {\n"
            "               \"AWS\": \""
            + userArn +
            "\"\n""           },\n"
            "           \"Action\": [ \"s3:getObject\" ],\n"
            "           \"Resource\": [ \"arn:aws:s3:::"
            + bucketName +
            "/*\" ]\n"
            "       }\n"
            "   ]\n"
            "}";
}
```

```
bool AwsDoc::S3::putBucketPolicy(const Aws::String &bucketName,
                                 const Aws::String &policyBody,
                                 const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    std::shared_ptr<Aws::StringStream> request_body =
            Aws::MakeShared<Aws::StringStream>("");
    *request_body << policyBody;

    Aws::S3::Model::PutBucketPolicyRequest request;
    request.SetBucket(bucketName);
    request.SetBody(request_body);

    Aws::S3::Model::PutBucketPolicyOutcome outcome =
            s3Client.PutBucketPolicy(request);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error: putBucketPolicy: "
                  << outcome.GetError().GetMessage() << std::endl;
    } else {
        std::cout << "Set the following policy body for the bucket '" <<
                  bucketName << "':" << std::endl << std::endl;
        std::cout << policyBody << std::endl;
    }

    return outcome.IsSuccess();
}
```

**catatan**  
Kelas [JsonValueutilitas Aws: :Utils: :Json::](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/class_aws_1_1_utils_1_1_json_1_1_json_value.html) dapat digunakan untuk membantu Anda membangun objek JSON yang valid untuk diteruskan. `PutBucketPolicy`

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_bucket_policy.cpp) di Github.

## Dapatkan Kebijakan Bucket
<a name="get-s3-bucket-policy"></a>

Untuk mengambil kebijakan bucket Amazon S3, panggil fungsi `S3Client` `GetBucketPolicy` tersebut, berikan nama bucket di file. [GetBucketPolicyRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_get_bucket_policy_request.html)

 **Kode** 

```
bool AwsDoc::S3::getBucketPolicy(const Aws::String &bucketName,
                                 const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::GetBucketPolicyRequest request;
    request.SetBucket(bucketName);

    Aws::S3::Model::GetBucketPolicyOutcome outcome =
            s3Client.GetBucketPolicy(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();
        std::cerr << "Error: getBucketPolicy: "
                  << err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        Aws::StringStream policy_stream;
        Aws::String line;

        outcome.GetResult().GetPolicy() >> line;
        policy_stream << line;

        std::cout << "Retrieve the policy for bucket '" << bucketName << "':\n\n" <<
                  policy_stream.str() << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_bucket_policy.cpp) di Github.

## Menghapus Kebijakan Bucket
<a name="delete-s3-bucket-policy"></a>

Untuk menghapus kebijakan bucket, panggil `DeleteBucketPolicy` fungsi tersebut`S3Client`, berikan nama bucket di file [DeleteBucketPolicyRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_delete_bucket_policy_request.html).

 **Kode** 

```
bool AwsDoc::S3::deleteBucketPolicy(const Aws::String &bucketName,
                                    const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);

    Aws::S3::Model::DeleteBucketPolicyRequest request;
    request.SetBucket(bucketName);

    Aws::S3::Model::DeleteBucketPolicyOutcome outcome = client.DeleteBucketPolicy(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();
        std::cerr << "Error: deleteBucketPolicy: " <<
                  err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        std::cout << "Policy was deleted from the bucket." << std::endl;
    }

    return outcome.IsSuccess();
}
```

Fungsi ini berhasil meskipun bucket belum memiliki kebijakan. Jika Anda menentukan nama bucket yang tidak ada atau jika Anda tidak memiliki akses ke bucket, maka akan `AmazonServiceException` ditampilkan.

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_bucket_policy.cpp) di Github.

## Info Selengkapnya
<a name="more-info"></a>
+  [PutBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/PutBucketPolicy.html)di Referensi API Layanan Penyimpanan Sederhana Amazon
+  [GetBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/GetBucketPolicy.html)di Referensi API Layanan Penyimpanan Sederhana Amazon
+  [DeleteBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/DeleteBucketPolicy.html)di Referensi API Layanan Penyimpanan Sederhana Amazon
+  [Ikhtisar Bahasa Kebijakan Akses](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html) di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon
+  [Contoh Kebijakan Bucket](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html) di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon

# Mengonfigurasi Bucket Amazon S3 sebagai Situs Web
<a name="examples-s3-website-configuration"></a>

Anda dapat mengonfigurasi bucket Amazon S3 agar berperilaku sebagai situs web. Untuk melakukan ini, Anda perlu mengatur konfigurasi situs webnya.

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensil](credentials.md).

## Mengatur Konfigurasi Situs Web Bucket
<a name="set-a-bucket-s-website-configuration"></a>

Untuk menyetel konfigurasi situs web bucket Amazon S3, panggil `PutBucketWebsite` fungsi dengan [PutBucketWebsiteRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_put_bucket_website_request.html)objek yang berisi nama bucket dan konfigurasi situs webnya, yang [WebsiteConfiguration](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_website_configuration.html)disediakan dalam objek. `S3Client`

*Diperlukan* pengaturan dokumen indeks; semua parameter lainnya bersifat opsional.

 **Kode** 

```
bool AwsDoc::S3::putWebsiteConfig(const Aws::String &bucketName,
                                  const Aws::String &indexPage, const Aws::String &errorPage,
                                  const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);

    Aws::S3::Model::IndexDocument indexDocument;
    indexDocument.SetSuffix(indexPage);

    Aws::S3::Model::ErrorDocument errorDocument;
    errorDocument.SetKey(errorPage);

    Aws::S3::Model::WebsiteConfiguration websiteConfiguration;
    websiteConfiguration.SetIndexDocument(indexDocument);
    websiteConfiguration.SetErrorDocument(errorDocument);

    Aws::S3::Model::PutBucketWebsiteRequest request;
    request.SetBucket(bucketName);
    request.SetWebsiteConfiguration(websiteConfiguration);

    Aws::S3::Model::PutBucketWebsiteOutcome outcome =
            client.PutBucketWebsite(request);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error: PutBucketWebsite: "
                  << outcome.GetError().GetMessage() << std::endl;
    } else {
        std::cout << "Success: Set website configuration for bucket '"
                  << bucketName << "'." << std::endl;
    }

    return outcome.IsSuccess();
}
```

**catatan**  
Menyetel konfigurasi situs web tidak mengubah izin akses untuk bucket Anda. Untuk membuat file Anda terlihat di web, Anda juga perlu menetapkan *kebijakan bucket* yang memungkinkan akses baca publik ke file di bucket. Untuk informasi selengkapnya, lihat [Mengelola Akses ke Bucket Amazon S3 Menggunakan Kebijakan Bucket](examples-s3-bucket-policies.md).

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_website_config.cpp) di Github.

## Dapatkan Konfigurasi Situs Web Bucket
<a name="get-a-bucket-s-website-configuration"></a>

Untuk mendapatkan konfigurasi situs web bucket Amazon S3, panggil `GetBucketWebsite` fungsi dengan nama bucket [GetBucketWebsiteRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_get_bucket_website_request.html)yang berisi untuk mengambil konfigurasi. `S3Client`

Konfigurasi akan dikembalikan sebagai [GetBucketWebsiteResult](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_get_bucket_website_result.html)objek dalam objek hasil. Jika tidak ada konfigurasi situs web untuk bucket, maka `null` akan dikembalikan.

 **Kode** 

```
bool AwsDoc::S3::getWebsiteConfig(const Aws::String &bucketName,
                                  const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client s3Client(clientConfig);

    Aws::S3::Model::GetBucketWebsiteRequest request;
    request.SetBucket(bucketName);

    Aws::S3::Model::GetBucketWebsiteOutcome outcome =
            s3Client.GetBucketWebsite(request);

    if (!outcome.IsSuccess()) {
        const Aws::S3::S3Error &err = outcome.GetError();

        std::cerr << "Error: GetBucketWebsite: "
                  << err.GetMessage() << std::endl;
    } else {
        Aws::S3::Model::GetBucketWebsiteResult websiteResult = outcome.GetResult();

        std::cout << "Success: GetBucketWebsite: "
                  << std::endl << std::endl
                  << "For bucket '" << bucketName << "':"
                  << std::endl
                  << "Index page : "
                  << websiteResult.GetIndexDocument().GetSuffix()
                  << std::endl
                  << "Error page: "
                  << websiteResult.GetErrorDocument().GetKey()
                  << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_website_config.cpp) di Github.

## Menghapus Konfigurasi Situs Web Bucket
<a name="delete-a-bucket-s-website-configuration"></a>

Untuk menghapus konfigurasi situs web bucket Amazon S3, panggil `DeleteBucketWebsite` fungsi dengan [DeleteBucketWebsiteRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3/html/class_aws_1_1_s3_1_1_model_1_1_delete_bucket_website_request.html): yang berisi nama bucket untuk menghapus konfigurasi. `S3Client`

 **Kode** 

```
bool AwsDoc::S3::deleteBucketWebsite(const Aws::String &bucketName,
                                     const Aws::S3::S3ClientConfiguration &clientConfig) {
    Aws::S3::S3Client client(clientConfig);
    Aws::S3::Model::DeleteBucketWebsiteRequest request;
    request.SetBucket(bucketName);

    Aws::S3::Model::DeleteBucketWebsiteOutcome outcome =
            client.DeleteBucketWebsite(request);

    if (!outcome.IsSuccess()) {
        auto err = outcome.GetError();
        std::cerr << "Error: deleteBucketWebsite: " <<
                  err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
    } else {
        std::cout << "Website configuration was removed." << std::endl;
    }

    return outcome.IsSuccess();
}
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_website_config.cpp) di Github.

## Informasi Selengkapnya
<a name="more-information"></a>
+  [Situs web PUT Bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html) di Referensi API Layanan Penyimpanan Sederhana Amazon
+  [DAPATKAN situs web Bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETwebsite.html) di Referensi API Layanan Penyimpanan Sederhana Amazon
+  [HAPUS situs web Bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEwebsite.html) di Referensi API Layanan Penyimpanan Sederhana Amazon

# Menggunakan TransferManager untuk operasi Amazon S3
<a name="examples-s3-transfermanager"></a>

Anda dapat menggunakan AWS SDK untuk C\$1\$1 `TransferManager` kelas untuk mentransfer file dengan andal dari lingkungan lokal ke Amazon S3 dan menyalin objek dari satu lokasi Amazon S3 ke lokasi lain. `TransferManager`bisa mendapatkan kemajuan transfer dan jeda atau melanjutkan unggahan dan unduhan.

**catatan**  
Agar tidak dikenakan biaya untuk unggahan yang tidak lengkap atau sebagian, sebaiknya aktifkan aturan [AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html)siklus hidup di bucket Amazon S3.  
Aturan ini mengarahkan Amazon S3 untuk membatalkan unggahan multibagian yang tidak selesai dalam jumlah hari tertentu setelah dimulai. Ketika batas waktu yang ditetapkan terlampaui, Amazon S3 membatalkan unggahan dan kemudian menghapus data unggahan yang tidak lengkap.   
Untuk informasi selengkapnya, lihat [Menyetel konfigurasi siklus hidup pada bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html) di Panduan Pengguna Amazon S3.

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensil](credentials.md).

## Unggah dan unduh objek menggunakan `TransferManager`
<a name="stream"></a>

Contoh ini menunjukkan bagaimana [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-transfer/html/class_aws_1_1_transfer_1_1_transfer_manager.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-transfer/html/class_aws_1_1_transfer_1_1_transfer_manager.html)mentransfer objek besar dalam memori. `UploadFile`dan `DownloadFile` metode keduanya disebut secara asinkron dan mengembalikan a `TransferHandle` untuk mengelola status permintaan Anda. Jika objek yang diunggah lebih besar dari `bufferSize` maka unggahan multipart akan dilakukan. `bufferSize`Default ke 5MB, tetapi ini dapat dikonfigurasi melalui. [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-transfer/html/struct_aws_1_1_transfer_1_1_transfer_manager_configuration.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-transfer/html/struct_aws_1_1_transfer_1_1_transfer_manager_configuration.html) 

```
        auto s3_client = Aws::MakeShared<Aws::S3::S3Client>("S3Client");
        auto executor = Aws::MakeShared<Aws::Utils::Threading::PooledThreadExecutor>("executor", 25);
        Aws::Transfer::TransferManagerConfiguration transfer_config(executor.get());
        transfer_config.s3Client = s3_client;

        // Create buffer to hold data received by the data stream.
        Aws::Utils::Array<unsigned char> buffer(BUFFER_SIZE);

        // The local variable 'streamBuffer' is captured by reference in a lambda.
        // It must persist until all downloading by the 'transfer_manager' is complete.
        Stream::PreallocatedStreamBuf streamBuffer(buffer.GetUnderlyingData(), buffer.GetLength());

        auto transfer_manager = Aws::Transfer::TransferManager::Create(transfer_config);

        auto uploadHandle = transfer_manager->UploadFile(LOCAL_FILE, BUCKET, KEY, "text/plain", Aws::Map<Aws::String, Aws::String>());
        uploadHandle->WaitUntilFinished();
        bool success = uploadHandle->GetStatus() == Transfer::TransferStatus::COMPLETED; 
      
        if (!success)
        {
            auto err = uploadHandle->GetLastError();           
            std::cout << "File upload failed:  "<< err.GetMessage() << std::endl;
        }
        else
        {
            std::cout << "File upload finished." << std::endl;

            auto downloadHandle = transfer_manager->DownloadFile(BUCKET,
                KEY,
                [&]() { //Define a lambda expression for the callback method parameter to stream back the data.
                    return Aws::New<MyUnderlyingStream>("TestTag", &streamBuffer);
                });
            downloadHandle->WaitUntilFinished();// Block calling thread until download is complete.
            auto downStat = downloadHandle->GetStatus();
            if (downStat != Transfer::TransferStatus::COMPLETED)
            {
                auto err = downloadHandle->GetLastError();
                std::cout << "File download failed:  " << err.GetMessage() << std::endl;
            }
            std::cout << "File download to memory finished."  << std::endl;
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/transfer-manager/transferOnStream.cpp) di Github.

# Menggunakan `S3CrtClient` untuk operasi Amazon S3
<a name="examples-s3-crt"></a>

`S3CrtClient`Kelas ini tersedia dalam versi 1.9 AWS SDK untuk C\$1\$1 dan meningkatkan throughput mengunggah dan mengunduh file data besar ke dan dari Amazon S3. Untuk informasi selengkapnya tentang peningkatan rilis ini, lihat [Meningkatkan Throughput Amazon S3](https://github.com/aws/aws-sdk-cpp/wiki/Improving-S3-Throughput-with-AWS-SDK-for-CPP-v1.9) dengan v1.9 AWS SDK untuk C\$1\$1 

`S3CrtClient`Ini diimplementasikan di bagian atas pustaka [AWS Common Runtime (CRT)](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html).

**catatan**  
Agar tidak dikenakan biaya untuk unggahan yang tidak lengkap atau sebagian, sebaiknya aktifkan aturan [AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html)siklus hidup di bucket Amazon S3.  
Aturan ini mengarahkan Amazon S3 untuk membatalkan unggahan multibagian yang tidak selesai dalam jumlah hari tertentu setelah dimulai. Ketika batas waktu yang ditetapkan terlampaui, Amazon S3 membatalkan unggahan dan kemudian menghapus data unggahan yang tidak lengkap.   
Untuk informasi selengkapnya, lihat [Menyetel konfigurasi siklus hidup pada bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html) di Panduan Pengguna Amazon S3.

## Prasyarat
<a name="codeExamplePrereq"></a>

Sebelum Anda mulai, kami sarankan Anda membaca [Memulai menggunakan AWS SDK untuk C\$1\$1](getting-started.md). 

Unduh kode contoh dan buat solusinya seperti yang dijelaskan dalam[Memulai contoh kode](getting-started-code-examples.md). 

Untuk menjalankan contoh, profil pengguna yang digunakan kode Anda untuk membuat permintaan harus memiliki izin yang tepat AWS (untuk layanan dan tindakan). Untuk informasi selengkapnya, lihat [Menyediakan AWS kredensil](credentials.md).

## Unggah dan unduh objek menggunakan `S3CrtClient`
<a name="stream"></a>

Contoh ini menunjukkan bagaimana menggunakan. [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3-crt/html/class_aws_1_1_s3_crt_1_1_s3_crt_client.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3-crt/html/class_aws_1_1_s3_crt_1_1_s3_crt_client.html) Contoh membuat bucket, mengunggah objek, mengunduh objek, lalu menghapus file dan bucket. Operasi PUT berubah menjadi unggahan multibagian. Operasi GET berubah menjadi beberapa permintaan GET “berkisar”. Untuk informasi selengkapnya tentang unggahan multibagian, lihat [Mengunggah dan menyalin objek menggunakan unggahan multibagian di](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html) Panduan Pengguna Amazon S3. 

File data yang disediakan,`ny.json`, akan diunggah sebagai unggahan multibagian dalam contoh ini. Ini dapat dikonfirmasi dengan melihat log debug setelah program dijalankan dengan sukses.

Jika unggahan gagal, an `AbortMultipartUpload` dikeluarkan di pustaka CRT yang mendasarinya untuk membersihkan bagian yang sudah diunggah. Namun, tidak semua kegagalan dapat ditangani secara internal (seperti kabel jaringan yang dicabut). Disarankan untuk membuat aturan siklus hidup di bucket Amazon S3 Anda untuk memastikan data yang diunggah sebagian tidak berlama-lama di akun Anda (sebagian data yang diunggah masih dapat ditagih). Untuk mengetahui cara mengatur aturan siklus hidup, lihat [Menemukan dan Menghapus Unggahan Multibagian yang Tidak Lengkap untuk Menurunkan Biaya Amazon](https://aws.amazon.com/blogs/aws-cost-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/ ) S3. 

**Menggunakan log debug untuk menjelajahi detail unggahan multibagian**

1. Dalam`main()`, perhatikan bahwa ada "TODO" komentar dengan instruksi untuk memperbarui kode.

   1. Untuk`file_name`: Dari tautan yang disediakan dalam kode komentar unduh file data sampel`ny.json`, atau gunakan file data besar Anda sendiri.

   1. Untuk`region`: Perbarui `region` variabel, menggunakan enum, ke Wilayah AWS akun Anda. Untuk menemukan Wilayah akun Anda, masuk ke Konsol Manajemen AWS, dan temukan Wilayah di sudut kanan atas.

1. Bangun contoh.

1. Salin file yang ditentukan oleh variabel `file_name` ke folder executable Anda dan jalankan executable. `s3-crt-demo`

1. Di folder yang dapat dieksekusi, temukan file terbaru`.log`.

1. Buka file log, pilih **cari**, dan masukkan**partNumber**.

1. Log berisi entri yang mirip dengan berikut ini, di mana `partNumber` dan `uploadId` ditentukan untuk setiap bagian dari file yang diunggah:

    `PUT /my-object partNumber=1&uploadId=gsk8vDbmnlA5EseDo._LDEgq22Qmt0SeuszYxMsZ9ABt503VqDIFOP8xzZI1P0zp.ToS.qo5kK16HNWogZF3KpRo.Dc7QnLZIK0BTmzCWwWoPax4T21hvP6nPdz9591F content-length:8388608 host:my-bucketasdfasdf.s3.us-east-2.amazonaws.com x-amz-content-sha256:UNSIGNED-PAYLOAD`

    and 

    `PUT /my-object partNumber=2&uploadId=gsk8vDbmnlA5EseDo._LDEgq22Qmt0SeuszYxMsZ9ABt503VqDIFOP8xzZI1P0zp.ToS.qo5kK16HNWogZF3KpRo.Dc7QnLZIK0BTmzCWwWoPax4T21hvP6nPdz9591F content-length:8388608 host:my-bucketasdfasdf.s3.us-east-2.amazonaws.com x-amz-content-sha256:UNSIGNED-PAYLOAD `

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt/s3-crt-demo.cpp) di Github.