

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

# を使用した Amazon S3 コード例 AWS SDK for C\$1\$1
<a name="examples-s3"></a>

[Amazon S3](https://aws.amazon.com/s3) は、どこからでも任意の量のデータを保存および取得できるオブジェクトストレージです。Amazon S3 とインターフェイス AWS SDK for C\$1\$1 するために、 には複数のクラスが用意されています。

**注記**  
このガイドには、特定の手法を示すために必要最低限のコードのみを掲載していますが、[完全なコード例は GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp)。GitHub では、ソースファイル単体をダウンロードすることも、リポジトリをローカルにクローンして、すべての例を取得、ビルド、実行することもできます。
+ [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) クラス 

  `S3Client` ライブラリは、Amazon S3 とのやり取りを完全サポートするインターフェイスです。

  このセットの `list_buckets_disabling_dns_cache.cpp` の例は、特に Linux/Mac 上の CURL で動作するように調整されています (ただし、Windows で動作するように変更することもできます)。Windows を使用している場合は、ビルド前に `list_buckets_disabling_dns_cache.cpp` ファイルを削除してください。このファイルは Linux の curl HttpClient に依存しているためです。

  `S3Client` を利用したコードは GitHub の [`s3` フォルダ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3) にあります。このセットのコード例で使用されている関数の完全なリストについては、GitHub の [Readme](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/README.md) を参照してください。

  このセットの `s3` コード例の一部については、このガイドでさらに詳しく説明しています。
  + [バケットの作成、一覧表示、削除](examples-s3-buckets.md)
  + [オブジェクトに対するオペレーション](examples-s3-objects.md) – データオブジェクトのアップロードとダウンロード
  + [Amazon S3 アクセス許可の管理](examples-s3-access-permissions.md)
  + [バケットポリシーを使用した Amazon S3 バケットへのアクセスの管理](examples-s3-bucket-policies.md)
  + [ウェブサイトとしての Amazon S3 バケットの設定](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) クラス 

  `S3CrtClient` は SDK バージョン 1.9 で追加されました。`S3CrtClient` により、Amazon S3 の GET (ダウンロード) および PUT (アップロード) オペレーションのスループットが向上します。`S3CrtClient` は、 AWS 共通ランタイム (CRT) ライブラリの上部に実装されます。

  `S3CrtClient` を利用したコードは GitHub の [`s3-crt` フォルダ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt) にあります。このセットのコード例で使用されている関数の完全なリストについては、GitHub の [Readme](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt/README.md) を参照してください。
  + [Amazon S3 オペレーションでの `S3CrtClient` の使用](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) クラス 

  `TransferManager` は、File Transfer Protocol (FTP)、File Transfer Protocol over SSL (FTPS)、または Secure Shell (SSH) File Transfer Protocol (SFTP) を介して Amazon S3 との間でファイルを直接転送できるフルマネージドサービスです。

  `TransferManager` を利用したコードは GitHub の [`transfer-manager` フォルダ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/transfer-manager) にあります。このセットのコード例で使用されている関数の完全なリストについては、GitHub の [Readme](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/transfer-manager/README.md) を参照してください。
  + [Amazon S3 オペレーションでの TransferManager の使用](examples-s3-transfermanager.md)

# バケットの作成、一覧表示、削除
<a name="examples-s3-buckets"></a>

Amazon Simple Storage Service (Amazon S3) 内のすべての*オブジェクト*またはファイルは、オブジェクトのフォルダを表す*バケット*に含まれています。各バケットの名前は AWS 内でグローバルに一意である必要があります。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「[Amazon S3 バケットの使用](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html)」を参照してください。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1 の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、リクエストに使用するユーザープロファイルに、AWS のサービスとアクションに対する適切なアクセス許可が付与されている必要があります。詳細については、「[AWS 認証情報の提供](credentials.md)」を参照してください。

## バケットの一覧表示
<a name="list-buckets"></a>

`list_buckets` の例を実行するには、コマンドプロンプトで、ビルドシステムによる実行可能ファイルの作成先フォルダに移動します。実行可能ファイルを `run_list_buckets` のように実行します (完全な実行可能ファイル名はオペレーティングシステムによって異なります)。出力には、アカウントにバケットがある場合は一覧表示され、バケットがない場合は空のリストが表示されます。

`list_buckets.cpp` には 2 つの方法があります。
+ `main()` が `ListBuckets()` を呼び出す。
+ `ListBuckets()` が SDK を使用してバケットをクエリする。

`S3Client` オブジェクトは SDK の `ListBuckets()` メソッドを呼び出します。成功すると、このメソッドは `ListBucketOutcome` オブジェクトを返します。このオブジェクトには `ListBucketResult` オブジェクトが含まれています。`ListBucketResult` オブジェクトは `GetBuckets()` メソッドを呼び出して、アカウント内の各 Amazon S3 バケットに関する情報を含む `Bucket` オブジェクトのリストを取得します。

 **コード** 

```
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;
}
```

GitHub で完全な [list\$1buckets の例](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/list_buckets.cpp)を参照してください。

## バケットを作成する
<a name="create-bucket"></a>



`create_bucket` の例を実行するには、コマンドプロンプトで、ビルドシステムによる実行可能ファイルの作成先フォルダに移動します。実行可能ファイルを `run_create_bucket` のように実行します (完全な実行可能ファイル名はオペレーティングシステムによって異なります)。このコードはアカウントに空のバケットを作成し、そのリクエストの成功または失敗を表示します。

`create_bucket.cpp` には 2 つの方法があります。
+ `main()` が `CreateBucket()` を呼び出す。`main()` で、`enum` を使用して、アカウントのリージョンに応じて AWS リージョン を変更する必要があります。アカウントのリージョンを確認するには、[AWS マネジメントコンソール](https://console.aws.amazon.com/) にログインし、右上隅に表示されるリージョン名を見つけます。
+ `CreateBucket()` が SDK を使用してバケットを作成する。



`S3Client` オブジェクトは SDK の `CreateBucket()` メソッドの呼び出しで、バケット名を `CreateBucketRequest` で指定して渡します。デフォルトでは、バケットは *us-east-1* (バージニア北部) リージョンに作成されます。リージョンが *us-east-1* でない場合、バケットが指定リージョンに作成されるように、このコードはバケットの制約を設定します。

 **コード** 

```
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();
}
```

GitHub で完全な [create\$1buckets の例](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/create_bucket.cpp)を参照してください。

## バケットを削除する
<a name="delete-bucket"></a>



`delete_bucket` の例を実行するには、コマンドプロンプトで、ビルドシステムによる実行可能ファイルの作成先フォルダに移動します。実行可能ファイルを `run_delete_bucket` のように実行します (完全な実行可能ファイル名はオペレーティングシステムによって異なります)。このコードは、アカウント内の指定されたバケットを削除し、リクエストの成功または失敗を表示します。

`delete_bucket.cpp` には 2 つの方法があります。
+ `main()` が `DeleteBucket()` を呼び出す。`main()` で、`enum` を使用して、アカウントのリージョンに応じて AWS リージョン を変更する必要があります。また、`bucket_name` を削除対象のバケットの名前に変更する必要もあります。
+ `DeleteBucket()` が SDK を使用してバケットを削除する。



`S3Client` オブジェクトは、SDK の `DeleteBucket()` メソッドの使用時に、削除対象のバケットの名前を `DeleteBucketRequest` オブジェクトで指定して渡します。成功するには、バケットが空である必要があります。

 **コード**

```
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();
}
```

GitHub で完全な [delete\$1bucket の例](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_bucket.cpp)を参照してください。

# オブジェクトに対するオペレーション
<a name="examples-s3-objects"></a>

Amazon S3 オブジェクトは、データの集合である*ファイル*を表します。すべてのオブジェクトが[バケット](examples-s3-buckets.md)内にある必要があります。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、コードがリクエストを行うために使用するユーザープロファイルに適切なアクセス許可が必要です AWS ( サービスと アクション用）。詳細については、[AWS 「認証情報の提供](credentials.md)」を参照してください。

## バケットにファイルをアップロードする
<a name="upload-object"></a>

`S3Client` オブジェクトの `PutObject` 関数の使用時に、バケット名、キー名、アップロードするファイルを指定します。`Aws::FStream` は、ローカルファイルの内容をバケットにアップロードするために使用されます。バケットが存在している必要があり、存在しない場合はエラーが発生します。

オブジェクトを非同期でアップロードする例については、「[を使用した非同期プログラミング AWS SDK for C\$1\$1](async-methods.md)」を参照してください。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_object.cpp) で完全な例をご覧ください。

## バケットに文字列をアップロードする
<a name="upload-object-string"></a>

`S3Client` オブジェクトの `PutObject` 関数の使用時に、バケット名、キー名、アップロードするファイルを指定します。バケットが存在している必要があり、存在しない場合はエラーが発生します。この例では、前回と異なり、`Aws::StringStream` を使用してインメモリの文字列データオブジェクトをバケットに直接アップロードします。

オブジェクトを非同期でアップロードする例については、「[を使用した非同期プログラミング AWS SDK for C\$1\$1](async-methods.md)」を参照してください。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_object_buffer.cpp) で完全な例をご覧ください。

## オブジェクトのリスト化
<a name="list-objects"></a>

バケット内のオブジェクトのリストを取得するには、`S3Client` オブジェクトの `ListObjects` 関数を使用します。リストを取得するバケットの名前を `ListObjectsRequest` で指定して渡します。

`ListObjects` 関数は `ListObjectsOutcome` オブジェクトを返します。このオブジェクトを使用して、`Object` インスタンスの形式でオブジェクトのリストを取得できます。

 **Code** 

```
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;
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/list_objects.cpp) で完全な例をご覧ください。

## オブジェクトのダウンロード
<a name="download-object"></a>

`S3Client` オブジェクトの `GetObject` 関数の使用時に、バケット名とオブジェクトキーを `GetObjectRequest` で指定して渡します。`GetObject` は [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) オブジェクトを返します。このオブジェクトは [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) と [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` を使用して、S3 オブジェクトのデータにアクセスできます。

次の例は、Amazon S3 からオブジェクトをダウンロードします。オブジェクトの内容はローカル変数に保存され、最初の 1 行がコンソールに出力されます。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_object.cpp) で完全な例をご覧ください。

## オブジェクトの削除
<a name="delete-object"></a>

`S3Client` オブジェクトの `DeleteObject` 関数の使用時に、ダウンロード対象のバケットとオブジェクトの名前を `DeleteObjectRequest` で指定して渡します。*指定されたバケットとオブジェクトキーが存在している必要があり、存在しない場合エラーが発生します*。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_object.cpp) で完全な例をご覧ください。

# Amazon S3 アクセス許可の管理
<a name="examples-s3-access-permissions"></a>

Amazon S3 バケットまたはオブジェクトのアクセス許可は、アクセスコントロールリスト (ACL) で定義されます。ACL では、バケット/オブジェクトの所有者、およびアクセス許可付与設定の一覧を指定します。アクセス許可付与設定では、ユーザー (被付与者) と、バケット/オブジェクトに対してそのユーザーに付与するアクセス許可 (READ や WRITE など) を指定します。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、コードがリクエストを行うために使用するユーザープロファイルに適切なアクセス許可が必要です AWS ( サービスと アクション用）。詳細については、[AWS 「認証情報の提供](credentials.md)」を参照してください。

## オブジェクトのアクセスコントロールリストを管理する
<a name="manage-an-object-s-access-control-list"></a>

オブジェクトのアクセスコントロールリストは `S3Client` メソッド `GetObjectAcl` を呼び出すことで取得できます。メソッドは、オブジェクトとそのバケットの名前を受け入れます。戻り値には ACL の `Owner`、および`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 は、新規に作成するか、既存の ACL のアクセス許可付与設定を編集することで変更できます。更新された ACL は、`PutObjectAcl` メソッドに渡すことで新しい現在の ACL になります。

次のコードでは、`GetObjectAcl` で取得した ACL に新しいアクセス許可付与設定を追加しています。ユーザー (被付与者) には、オブジェクトに対する READ アクセス許可が付与されます。変更された ACL は `PutObjectAcl` に渡され、新たな ACL として適用されます。

```
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;
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_put_object_acl.cpp) で完全な例をご覧ください。

## バケットのアクセスコントロールリストを管理する
<a name="manage-a-bucket-s-access-control-list"></a>

多くの場合、バケットに対するアクセス許可を設定するには、バケットポリシーを定義することをお勧めします。ただし、希望すればバケットに対してアクセスコントロールリストを使用することも可能です。

バケットに対するアクセスコントロールリストの管理は、オブジェクトに使用されるものと同じです。`GetBucketAcl` メソッドでバケットの現在の ACL を取得し、`PutBucketAcl` メソッドで新しい ACL をバケットに適用します。

次のコードでは、バケットに対する ACL の取得および設定方法を示しています。

```
//! 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;
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_put_bucket_acl.cpp) で完全な例をご覧ください。

# バケットポリシーを使用した Amazon S3 バケットへのアクセスの管理
<a name="examples-s3-bucket-policies"></a>

*バケットポリシー*を設定、取得、または削除して、Amazon S3 バケットへのアクセスを管理できます。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、コードがリクエストを行うために使用するユーザープロファイルに適切なアクセス許可が必要です AWS ( サービスと アクション用）。詳細については、[AWS 「認証情報の提供](credentials.md)」を参照してください。

## バケットポリシーの設定
<a name="set-s3-bucket-policy"></a>

特定の S3 バケットに対するバケットポリシーを設定するには、`S3Client` の `PutBucketPolicy` 関数の呼び出しで、バケット名とポリシーの JSON 表現を [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) で指定して渡します。

 **コード** 

```
//! 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();
}
```

**注記**  
[Aws::Utils::Json::JsonValue](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) ユーティリティクラスを使用すると、有効な JSON オブジェクトをコンストラクトして `PutBucketPolicy` に渡すことができます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_bucket_policy.cpp) で完全な例をご覧ください。

## バケットポリシーの取得
<a name="get-s3-bucket-policy"></a>

Amazon S3 バケットのポリシーを取得するには、`S3Client` の `GetBucketPolicy` 関数の呼び出しで、バケット名を [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) で指定して渡します。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_bucket_policy.cpp) で完全な例をご覧ください。

## バケットポリシーの削除
<a name="delete-s3-bucket-policy"></a>

バケットポリシーを削除するには、`S3Client` の `DeleteBucketPolicy` 関数の呼び出しで、バケット名を [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) で指定して渡します。

 **コード** 

```
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();
}
```

バケットにポリシーが存在しない場合でも、この関数は成功します。指定した名前のバケットが存在していないか、バケットへのアクセス権がない場合は、`AmazonServiceException` がスローされます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_bucket_policy.cpp) で完全な例をご覧ください。

## 詳細情報
<a name="more-info"></a>
+  「Amazon Simple Storage Service API リファレンス」の「[PutBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/PutBucketPolicy.html)」
+  「Amazon Simple Storage Service API リファレンス」の「[GetBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/GetBucketPolicy.html)」
+  「Amazon Simple Storage Service API リファレンス」の「[DeleteBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/DeleteBucketPolicy.html)」
+  「Amazon Simple Storage Service ユーザーガイド」の「[アクセスポリシー言語の概要](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html)」
+  「Amazon Simple Storage Service ユーザーガイド」の「[バケットポリシーの例](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html)」

# ウェブサイトとしての Amazon S3 バケットの設定
<a name="examples-s3-website-configuration"></a>

Amazon S3 バケットをウェブサイトとして動作するように設定できます。これを行うには、ウェブサイト設定をセットする必要があります。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、コードがリクエストを行うために使用するユーザープロファイルに適切なアクセス許可が必要です AWS ( サービスと アクション用）。詳細については、[AWS 「認証情報の提供](credentials.md)」を参照してください。

## バケットのウェブサイト設定をセットする
<a name="set-a-bucket-s-website-configuration"></a>

Amazon S3 バケットのウェブサイト設定を行うには、`S3Client` の `PutBucketWebsite` 関数の呼び出しで、バケット名とそのウェブサイト設定を [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) オブジェクトで指定して渡します。ウェブサイト設定は [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) オブジェクトに指定されている必要があります。

インデックスドキュメントの設定は*必要です*が、他のすべてのパラメータはオプションです。

 **コード** 

```
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();
}
```

**注記**  
ウェブサイト設定をセットしても、バケットのアクセス権限は変更されません。ウェブ上でファイルが表示されるようにするには、バケットのファイルにパブリック読み取りアクセスを許可する*バケットポリシー*も設定する必要があります。詳細については、「[バケットポリシーを使用した Amazon S3 バケットへのアクセス管理](examples-s3-bucket-policies.md)」を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/put_website_config.cpp) で完全な例をご覧ください。

## バケットのウェブサイト設定を取得する
<a name="get-a-bucket-s-website-configuration"></a>

Amazon S3 バケットのウェブサイト設定を取得するには、`S3Client` の `GetBucketWebsite` 関数の呼び出しで、バケット名を [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) で指定して渡します。

この設定は、結果オブジェクトに入れて [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) オブジェクトとして返されます。バケットのウェブサイト設定がない場合は、`null` が返されます。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/get_website_config.cpp) で完全な例をご覧ください。

## バケットのウェブサイト設定を削除する
<a name="delete-a-bucket-s-website-configuration"></a>

Amazon S3 バケットのウェブサイト設定を削除するには、`S3Client` の `DeleteBucketWebsite` 関数の呼び出しで、設定を削除するバケットの名前を [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) で指定して渡します。

 **Code** 

```
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();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3/delete_website_config.cpp) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  「Amazon Simple Storage Service API リファレンス」の「[PUT Bucket website](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html)」
+  「Amazon Simple Storage Service API リファレンス」の「[GET Bucket website](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETwebsite.html)」
+  「Amazon Simple Storage Service API リファレンス」の「[DELETE Bucket website](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEwebsite.html)」

# Amazon S3 オペレーションでの TransferManager の使用
<a name="examples-s3-transfermanager"></a>

クラスを使用して AWS SDK for C\$1\$1 `TransferManager`、ローカル環境から Amazon S3 にファイルを確実に転送し、ある Amazon S3 の場所から別の場所にオブジェクトをコピーできます。 `TransferManager`は転送の進行状況を取得し、アップロードとダウンロードを一時停止または再開できます。

**注記**  
不完全または部分的なアップロードに対して課金されないように、Amazon S3 バケットで [AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html) ライフサイクルルールを有効にすることをお勧めします。  
このルールは、開始後、指定された日数内に完了しないマルチパートアップロードを中止するよう Amazon S3 に指示します。設定した時間制限を超えると、Amazon S3 はアップロードを中止して、不完全なアップロードデータを削除します。  
詳細については、Amazon S3 ユーザーガイドの「[バケットのライフサイクル設定の指定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)」を参照してください。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、コードがリクエストを行うために使用するユーザープロファイルに適切なアクセス許可が必要です AWS ( サービスと アクション用）。詳細については、[AWS 「認証情報の提供](credentials.md)」を参照してください。

## `TransferManager` を使用したオブジェクトのアップロードとダウンロード
<a name="stream"></a>

この例では、[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) を使用して、大きなオブジェクトをメモリ内で転送する方法を示します。`UploadFile` および `DownloadFile` メソッドはどちらも非同期で呼び出され、リクエストのステータス管理用に `TransferHandle` を返します。アップロードされたオブジェクトが `bufferSize` より大きい場合、マルチパートアップロードが実行されます。`bufferSize` はデフォルトで 5MB ですが、このサイズは [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;
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/transfer-manager/transferOnStream.cpp) で完全な例をご覧ください。

# Amazon S3 オペレーションでの `S3CrtClient` の使用
<a name="examples-s3-crt"></a>

`S3CrtClient` クラスは のバージョン 1.9 で利用 AWS SDK for C\$1\$1 でき、Amazon S3 との間で大きなデータファイルをアップロードおよびダウンロードするスループットが向上します。このリリースの改善点の詳細については、[「v1.9 による Amazon S3 スループットの向上」を参照してください。 AWS SDK for C\$1\$1](https://github.com/aws/aws-sdk-cpp/wiki/Improving-S3-Throughput-with-AWS-SDK-for-CPP-v1.9)

`S3CrtClient` は [AWS 共通ランタイム (CRT) ライブラリ](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html)の上位に実装されています。

**注記**  
不完全または部分的なアップロードに対して課金されないように、Amazon S3 バケットで [AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html) ライフサイクルルールを有効にすることをお勧めします。  
このルールは、開始後、指定された日数内に完了しないマルチパートアップロードを中止するよう Amazon S3 に指示します。設定した時間制限を超えると、Amazon S3 はアップロードを中止して、不完全なアップロードデータを削除します。  
詳細については、Amazon S3 ユーザーガイドの「[バケットのライフサイクル設定の指定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)」を参照してください。

## 前提条件
<a name="codeExamplePrereq"></a>

作業を始める前に「[AWS SDK for C\$1\$1の開始方法](getting-started.md)」を読むことをお勧めします。

コード例をダウンロードし、「[コード例の開始方法](getting-started-code-examples.md)」の説明に従ってソリューションをビルドします。

例を実行するには、コードがリクエストを行うために使用するユーザープロファイルに適切なアクセス許可が必要です AWS ( サービスと アクション用）。詳細については、[AWS 「認証情報の提供](credentials.md)」を参照してください。

## `S3CrtClient` を使用したオブジェクトのアップロードとダウンロード
<a name="stream"></a>

この例では [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) の使用方法を示します。この例では、バケットを作成し、オブジェクトをアップロードし、そのオブジェクトをダウンロードした後、ファイルとバケットを削除します。PUT オペレーションはマルチパートアップロードになります。GET オペレーションは複数の「範囲指定」 GET リクエストになります。マルチパートアップロードの詳細については、「Amazon S3 ユーザーガイド」の「[マルチパートアップロードを使用したオブジェクトのアップロードとコピー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)」を参照してください。

この例で使用されるデータファイル `ny.json` は、マルチパートアップロードとしてアップロードされます。この動作は、プログラムの正常な実行後にデバッグログを表示することで確認できます。

アップロードが失敗した場合、基礎となる CRT ライブラリで `AbortMultipartUpload` が発行されて、既にアップロードされたパートがクリーンアップされます。ただし、すべての失敗が内部で処理できるわけではありません (ネットワークケーブルが抜けている場合など)。アカウント内に部分的にアップロードされたデータが残らないように、Amazon S3 バケットにライフサイクルルールを設定することをお勧めします (部分的にアップロードされたデータにも料金が発生します)。ライフサイクルルールの設定方法については、「[Amazon S3 のコスト削減のための不完全なマルチパートアップロードの検出と削除](https://aws.amazon.com/blogs/aws-cost-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/ )」を参照してください。

**デバッグログを使用したマルチパートアップロードの詳細の調査**

1. `main()` 内には、コードの更新手順が記載された「TODO」コメントがあることに注意してください。

   1. `file_name`: コードコメント内のリンクからサンプルデータファイル `ny.json` をダウンロードするか、自前の大きなデータファイルを使用します。

   1. の場合`region`: 列挙型を使用して `region`変数をアカウントの に更新 AWS リージョン します。自分のアカウントのリージョンを見つけるには、 AWS マネジメントコンソールにログインし、右上隅にあるリージョンを確認します。

1. 例をビルドします。

1. 変数 `file_name` で指定されたファイルを実行可能ファイルのあるフォルダにコピーし、`s3-crt-demo` 実行可能ファイルを実行します。

1. 実行可能ファイルのあるフォルダで、最新の `.log` ファイルを見つけます。

1. ログファイルを開き、**[検索]** を選択して、「**partNumber**」と入力します。

1. ログには次のようなエントリが含まれています。アップロードされたファイルのパートごとに `partNumber` と `uploadId` が指定されています。

    `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`

    と 

    `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 `

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt/s3-crt-demo.cpp) で完全な例をご覧ください。