

# S3 on Outposts オブジェクトの操作
<a name="S3OutpostsWorkingObjects"></a>

Amazon S3 on Outposts を使用すると、AWS Outposts で S3 バケットを作成し、ローカルデータアクセス、ローカルデータ処理、データレジデンシーを必要とするアプリケーション用に、オンプレミスのオブジェクトを簡単に保存および取得できます。S3 on Outposts は、新しいストレージクラス、S3 Outposts (`OUTPOSTS`) を提供し、これは Amazon S3 API を使用し、AWS Outposts 上の複数のデバイスやサーバー間でデータを永続的かつ冗長的に保存するように設計されています。仮想プライベートクラウド (VPC) を介したアクセスポイントとエンドポイント接続を使用して、Outposts バケットと通信します。Outposts バケットでは、Amazon S3 と同じ API と機能 (アクセスポリシー、暗号化、タグ付けなど) を使用できます。AWS マネジメントコンソール、AWS Command Line Interface (AWS CLI)、AWS SDK、または REST API を使用して S3 on Outposts を使用できます。

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

オブジェクト ARN は次の形式を使用し、Outpost が属する AWS リージョン、AWS アカウント ID、Outpost ID、バケット名、およびオブジェクトキーが含まれます。

```
arn:aws:s3-outposts:us-west-2:123456789012:​outpost/op-01ac5d28a6a232904/bucket/amzn-s3-demo-bucket1/object/myobject
```

Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

**Topics**
+ [S3 on Outposts バケットにオブジェクトをアップロードする](S3OutpostsUploadObjects.md)
+ [AWS SDK for Java を使用して Amazon S3 on Outposts バケットにオブジェクトをコピーする](S3OutpostsCopyObject.md)
+ [Amazon S3 on Outposts バケットからオブジェクトを取得する](S3OutpostsGetObject.md)
+ [Amazon S3 on Outposts バケット内のオブジェクトを一覧表示する](S3OutpostsListObjects.md)
+ [Amazon S3 on Outposts バケット内のオブジェクトを削除する](S3OutpostsDeleteObject.md)
+ [HeadBucket を使用して、S3 on Outposts バケットが存在し、アクセス許可があるかどうかを調べる](S3OutpostsHeadBucket.md)
+ [SDK for Java でのマルチパートアップロードの実行と管理](S3OutpostsMPU.md)
+ [S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)
+ [ローカルの Amazon EMR on Outposts を使用した Amazon S3 on Outposts](s3-outposts-emr.md)
+ [認可と認証キャッシング](s3-outposts-auth-cache.md)

# S3 on Outposts バケットにオブジェクトをアップロードする
<a name="S3OutpostsUploadObjects"></a>

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

以下の AWS CLI および AWS SDK for Java の例は、アクセスポイントを使用して S3 on Outposts バケットにオブジェクトをアップロードする方法を示しています。

------
#### [ AWS CLI ]

**Example**  
次の例では、S3 on Outposts バケット (`s3-outposts:PutObject`) に、AWS CLI を使って `sample-object.xml` という名前のオブジェクトを配置します。このコマンドを使用するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。このコマンドの詳細については、「*AWS CLI リファレンス*」の「[put-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html)」を参照してください。  

```
aws s3api put-object --bucket arn:aws:s3-outposts:Region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --key sample-object.xml --body sample-object.xml
```

------
#### [ SDK for Java ]

**Example**  
AWS SDK for Java を使用して S3 Outposts バケットにオブジェクトをアップロードする方法の例については、「*AWS SDK for Java 2.x のコード例*」の「[PutObjectOnOutpost.java](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/outposts/PutObjectOnOutpost.java)」を参照してください。

------

# AWS SDK for Java を使用して Amazon S3 on Outposts バケットにオブジェクトをコピーする
<a name="S3OutpostsCopyObject"></a>

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

次の例は、AWS SDK for Java を使用して、S3 on Outposts バケット内のオブジェクトをコピーする方法を示しています。

## AWS SDK for Java の使用
<a name="S3OutpostsCopyObjectJava"></a>

次の S3 on Outposts の例では、SDK for Java を使用してオブジェクトを同じバケットの新しいオブジェクトにコピーします。この例を実行するには、`user input placeholders` をユーザー自身の情報に置き換えます。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CopyObjectRequest;

public class CopyObject {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";
        String sourceKey = "*** Source object key ***";
        String destinationKey = "*** Destination object key ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Copy the object into a new object in the same bucket.
            CopyObjectRequest copyObjectRequest = new CopyObjectRequest(accessPointArn, sourceKey, accessPointArn, destinationKey);
            s3Client.copyObject(copyObjectRequest);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# Amazon S3 on Outposts バケットからオブジェクトを取得する
<a name="S3OutpostsGetObject"></a>

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

以下の例は、AWS Command Line Interface(AWS CLI) と AWS SDK for Java を使用してオブジェクトをダウンロード (取得) する方法を示しています。

## の使用AWS CLI
<a name="S3OutpostsGetObjectCLI"></a>

次の例では、S3 on Outposts バケット (`s3-outposts:GetObject`) から、AWS CLI を使って `sample-object.xml` という名前のオブジェクトを取得します。このコマンドを使用するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。このコマンドの詳細については、「*AWS CLI リファレンス*」の「[get-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html)」を参照してください。

```
aws s3api get-object --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --key testkey sample-object.xml
```

## AWS SDK for Java の使用
<a name="S3OutpostsGetObjectJava"></a>

次の S3 on Outposts の例では、SDK for Java を使用してオブジェクトを取得します。この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。詳細については、[Amazon Simple Storage Service API リファレンス](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)の *GetObject* を参照してください。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ResponseHeaderOverrides;
import com.amazonaws.services.s3.model.S3Object;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetObject {
    public static void main(String[] args) throws IOException {
        String accessPointArn = "*** access point ARN ***";
        String key = "*** Object key ***";

        S3Object fullObject = null, objectPortion = null, headerOverrideObject = null;
        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Get an object and print its contents.
            System.out.println("Downloading an object");
            fullObject = s3Client.getObject(new GetObjectRequest(accessPointArn, key));
            System.out.println("Content-Type: " + fullObject.getObjectMetadata().getContentType());
            System.out.println("Content: ");
            displayTextInputStream(fullObject.getObjectContent());

            // Get a range of bytes from an object and print the bytes.
            GetObjectRequest rangeObjectRequest = new GetObjectRequest(accessPointArn, key)
                    .withRange(0, 9);
            objectPortion = s3Client.getObject(rangeObjectRequest);
            System.out.println("Printing bytes retrieved.");
            displayTextInputStream(objectPortion.getObjectContent());

            // Get an entire object, overriding the specified response headers, and print the object's content.
            ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides()
                    .withCacheControl("No-cache")
                    .withContentDisposition("attachment; filename=example.txt");
            GetObjectRequest getObjectRequestHeaderOverride = new GetObjectRequest(accessPointArn, key)
                    .withResponseHeaders(headerOverrides);
            headerOverrideObject = s3Client.getObject(getObjectRequestHeaderOverride);
            displayTextInputStream(headerOverrideObject.getObjectContent());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        } finally {
            // To ensure that the network connection doesn't remain open, close any open input streams.
            if (fullObject != null) {
                fullObject.close();
            }
            if (objectPortion != null) {
                objectPortion.close();
            }
            if (headerOverrideObject != null) {
                headerOverrideObject.close();
            }
        }
    }

    private static void displayTextInputStream(InputStream input) throws IOException {
        // Read the text input stream one line at a time and display each line.
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println();
    }
}
```

# Amazon S3 on Outposts バケット内のオブジェクトを一覧表示する
<a name="S3OutpostsListObjects"></a>

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

**注記**  
Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

次の例は、AWS CLI および AWS SDK for Java を使用して、S3 on Outposts バケット内のオブジェクトを一覧表示する方法を示しています。

## AWS CLI の使用
<a name="S3OutpostsListObjectsCLI"></a>

次の例では、S3 on Outposts バケット (`s3-outposts:ListObjectsV2`) 内のオブジェクトを、AWS CLI を使用して一覧表示します。このコマンドを使用するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。このコマンドの詳細については、「*AWS CLI リファレンス*」の「[list-objects-v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-objects-v2.html)」を参照してください。

```
aws s3api list-objects-v2 --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point
```

**注記**  
AWS SDK を通じて Amazon S3 on Outposts でこのアクションを使用する場合、バケット名の代わりに Outposts のアクセスポイント ARN を以下の形式で提供します: `arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-Outposts-Access-Point`。S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

## AWS SDK for Java の使用
<a name="S3OutpostsListObjectsJava"></a>

次の S3 on Outposts の例では、SDK for Java を使用してバケット内のオブジェクトを一覧表示します。この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。

**重要**  
この例では、`ListObjects`API オペレーションの最新リビジョンである [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) を使用します。この改訂版の API オペレーションをアプリケーション開発に使用することをお勧めします。下位互換性のために、Amazon S3 はこの API の以前のバージョンであるオペレーションを引き続きサポートします。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class ListObjectsV2 {

    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            System.out.println("Listing objects");

            // maxKeys is set to 2 to demonstrate the use of
            // ListObjectsV2Result.getNextContinuationToken()
            ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(accessPointArn).withMaxKeys(2);
            ListObjectsV2Result result;

            do {
                result = s3Client.listObjectsV2(req);

                for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
                    System.out.printf(" - %s (size: %d)\n", objectSummary.getKey(), objectSummary.getSize());
                }
                // If there are more than maxKeys keys in the bucket, get a continuation token
                // and list the next objects.
                String token = result.getNextContinuationToken();
                System.out.println("Next Continuation Token: " + token);
                req.setContinuationToken(token);
            } while (result.isTruncated());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# Amazon S3 on Outposts バケット内のオブジェクトを削除する
<a name="S3OutpostsDeleteObject"></a>

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

次の例は、AWS Command Line Interface (AWS CLI) と AWS SDK for Java を使用して、S3 on Outposts バケット内の単一のオブジェクトまたは複数のオブジェクトを削除する方法を示しています。

## AWS CLI の使用
<a name="S3OutpostsDeleteObjectsCLI"></a>

以下の例は、S3 on Outposts バケットから単一のオブジェクトまたは複数のオブジェクトを削除する方法を示しています。







------
#### [ delete-object ]

次の例では、`sample-object.xml` を使用して、S3 on Outposts バケット (`s3-outposts:DeleteObject`) から AWS CLI という名前のオブジェクトを削除します。このコマンドを使用するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。このコマンドの詳細については、「[AWS CLI リファレンス](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html)」の「*delete-object*」を参照してください。

```
aws s3api delete-object --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --key sample-object.xml
```

------
#### [ delete-objects ]

以下の例では、AWS CLI を使用して、S3 on Outposts バケット (`s3-outposts:DeleteObject`) から `sample-object.xml` と `test1.text` という名前の 2 つのオブジェクトを削除します。このコマンドを使用するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。このコマンドの詳細については、「[AWS CLI リファレンス](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html)」の「*delete-objects*」を参照してください。

```
aws s3api delete-objects --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --delete file://delete.json

delete.json
{
  "Objects": [
    {
      "Key": "test1.txt"
    },
    {
      "Key": "sample-object.xml"
    }
  ],
  "Quiet": false
}
```

------

## AWS SDK for Java の使用
<a name="S3OutpostsDeleteObjectsJava"></a>

以下の例は、S3 on Outposts バケットから単一のオブジェクトまたは複数のオブジェクトを削除する方法を示しています。

------
#### [ DeleteObject ]

次の S3 on Outposts の例では、SDK for Java を使用してバケット内のオブジェクトを削除します。この例を使用するには、Outpost のアクセスポイント ARN と、削除するオブジェクトのキー名を指定します。詳細については、*Amazon Simple Storage Service API リファレンス*の「[DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)」を参照してください。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.DeleteObjectRequest;

public class DeleteObject {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";
        String keyName = "*** key name ****";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            s3Client.deleteObject(new DeleteObjectRequest(accessPointArn, keyName));
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ DeleteObjects ]

次の S3 on Outposts の例では、SDK for Java を使用してバケット内のオブジェクトをアップロードして、削除します。この例を使用するには、Outpost のアクセスポイント ARN を指定します。詳細については、「*Amazon Simple Storage Service API リファレンス*」の「[DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)」を参照してください。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.DeleteObjectsRequest;
import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion;
import com.amazonaws.services.s3.model.DeleteObjectsResult;

import java.util.ArrayList;

public class DeleteObjects {

    public static void main(String[] args) {
       String accessPointArn = "arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point";
        

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Upload three sample objects.
            ArrayList<KeyVersion> keys = new ArrayList<KeyVersion>();
            for (int i = 0; i < 3; i++) {
                String keyName = "delete object example " + i;
                s3Client.putObject(accessPointArn, keyName, "Object number " + i + " to be deleted.");
                keys.add(new KeyVersion(keyName));
            }
            System.out.println(keys.size() + " objects successfully created.");

            // Delete the sample objects.
            DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(accessPointArn)
                    .withKeys(keys)
                    .withQuiet(false);

            // Verify that the objects were deleted successfully.
            DeleteObjectsResult delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest);
            int successfulDeletes = delObjRes.getDeletedObjects().size();
            System.out.println(successfulDeletes + " objects successfully deleted.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------

# HeadBucket を使用して、S3 on Outposts バケットが存在し、アクセス許可があるかどうかを調べる
<a name="S3OutpostsHeadBucket"></a>

オブジェクトは、Amazon S3 on Outposts に保存される基本エンティティです。すべてのオブジェクトはバケット内に保存されます。Outpost バケット内の任意のオブジェクトにアクセスするには、アクセスポイントを使用する必要があります。オブジェクト操作のためにバケットを指定するときには、アクセスポイントの Amazon リソースネーム (ARN) またはアクセスポイントエイリアスを使用します。アクセスポイントエイリアスの詳細については、「[S3 on Outposts アクセスポイントでのバケット形式のエイリアスの使用](s3-outposts-access-points-alias.md)」を参照してください。

次の例は、S3 on Outposts アクセスポイントの ARN 形式を示し、これは、Outpost が属するリージョンの AWS リージョン コード、AWS アカウント ID、Outpost ID、アクセスポイント名を含みます。

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

S3 on Outposts ARN の詳細については、「[S3 on Outposts のリソース ARN](S3OutpostsIAM.md#S3OutpostsARN)」を参照してください。

**注記**  
Amazon S3 on Outposts では、オブジェクトデータは常に Outpost に保存されます。AWS が Outpost ラックを設置すると、データの常駐要件を満たすために、データは Outpost にローカルに保たれます。オブジェクトが Outpost を離れたり、AWS リージョン 外に出たりすることはありません。AWS マネジメントコンソールはリージョン内でホストされるため、コンソールを使用して Outpost にオブジェクトをアップロードしたり、管理したりすることはできません。ただし REST API、AWS Command Line Interface (AWS CLI)、および AWS SDK を使用して、アクセスポイントを介してオブジェクトのアップロードと管理を行うことができます。

以下の AWS Command Line Interface (AWS CLI) と AWS SDK for Java の例は、HeadBucket API オペレーショを使用して、Amazon S3 on Outposts バケットが存在し、そのバケットにアクセスする許可があるかどうかを調べる方法を示しています。詳細については、「*Amazon Simple Storage Service API リファレンス」*の「[HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html)」を参照してください。

## の使用AWS CLI
<a name="S3OutpostsHeadBucketCLI"></a>

次の S3 on Outposts AWS CLI の例では、`head-bucket` コマンドを使用して、バケットが存在し、そのバケットにアクセスする許可があるかどうかを調べます。このコマンドを使用するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。詳細については、「*AWS CLI リファレンス*」の「[head-bucket](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/head-bucket.html)」を参照してください。

```
aws s3api head-bucket --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point
```

## AWS SDK for Java の使用
<a name="S3OutpostsHeadBucketJava"></a>

次の S3 on Outposts の例は、バケットが存在するかどうか、また、そのバケットにアクセスする許可があるかどうかを調べる方法を示しています。この例を使用するには、Outpost のアクセスポイント ARN を指定します。詳細については、「*Amazon Simple Storage Service API リファレンス」*の「[HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html)」を参照してください。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.HeadBucketRequest;

public class HeadBucket {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            s3Client.headBucket(new HeadBucketRequest(accessPointArn));
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# SDK for Java でのマルチパートアップロードの実行と管理
<a name="S3OutpostsMPU"></a>

Amazon S3 on Outposts を使用すると、AWS Outposts リソースで S3 バケットを作成し、ローカルデータアクセス、ローカルデータ処理、データレジデンシーを必要とするアプリケーション用に、オンプレミスのオブジェクトを保存および取得できます。AWS マネジメントコンソール、AWS Command Line Interface (AWS CLI)、AWS SDK、または REST API を使用して S3 on Outposts を使用できます。詳細については、「[Amazon S3 on Outposts とは](S3onOutposts.md)」を参照してください。

以下の例は、AWS SDK for Java で S3 on Outposts を使用して、マルチパートアップロードを実行し、管理する方法を示しています。

**Topics**
+ [S3 on Outposts バケット内のオブジェクトのマルチパートアップロードを実行する](#S3OutpostsInitiateMultipartUploadJava)
+ [S3 on Outposts バケット内のラージオブジェクトをマルチパートアップロードでコピーする](#S3OutpostsCopyPartJava)
+ [S3 on Outposts バケットにオブジェクトのパーツを一覧表示する](#S3OutpostsListPartsJava)
+ [S3 on Outposts バケット内の進行中のマルチパートアップロードのリストを取得する](#S3OutpostsListMultipartUploadsJava)

## S3 on Outposts バケット内のオブジェクトのマルチパートアップロードを実行する
<a name="S3OutpostsInitiateMultipartUploadJava"></a>

次の S3 on Outposts の例では、SDK for Java を使用して、バケットへオブジェクトのマルチパートアップロードを開始、アップロード、完了します。この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「[マルチパートアップロードを使用したオブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html)」を参照してください。**

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.ArrayList;
import java.util.List;

public class MultipartUploadCopy {
    public static void main(String[] args) {
        String accessPointArn = "*** Source access point ARN ***";
        String sourceObjectKey = "*** Source object key ***";
        String destObjectKey = "*** Target object key ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Initiate the multipart upload.
            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(accessPointArn, destObjectKey);
            InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initRequest);

            // Get the object size to track the end of the copy operation.
            GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(accessPointArn, sourceObjectKey);
            ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest);
            long objectSize = metadataResult.getContentLength();

            // Copy the object using 5 MB parts.
            long partSize = 5 * 1024 * 1024;
            long bytePosition = 0;
            int partNum = 1;
            List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>();
            while (bytePosition < objectSize) {
                // The last part might be smaller than partSize, so check to make sure
                // that lastByte isn't beyond the end of the object.
                long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1);

                // Copy this part.
                CopyPartRequest copyRequest = new CopyPartRequest()
                        .withSourceBucketName(accessPointArn)
                        .withSourceKey(sourceObjectKey)
                        .withDestinationBucketName(accessPointArn)
                        .withDestinationKey(destObjectKey)
                        .withUploadId(initResult.getUploadId())
                        .withFirstByte(bytePosition)
                        .withLastByte(lastByte)
                        .withPartNumber(partNum++);
                copyResponses.add(s3Client.copyPart(copyRequest));
                bytePosition += partSize;
            }

            // Complete the upload request to concatenate all uploaded parts and make the copied object available.
            CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
                    accessPointArn,
                    destObjectKey,
                    initResult.getUploadId(),
                    getETags(copyResponses));
            s3Client.completeMultipartUpload(completeRequest);
            System.out.println("Multipart copy complete.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client  
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    // This is a helper function to construct a list of ETags.
    private static List<PartETag> getETags(List<CopyPartResult> responses) {
        List<PartETag> etags = new ArrayList<PartETag>();
        for (CopyPartResult response : responses) {
            etags.add(new PartETag(response.getPartNumber(), response.getETag()));
        }
        return etags;
    }
```

## S3 on Outposts バケット内のラージオブジェクトをマルチパートアップロードでコピーする
<a name="S3OutpostsCopyPartJava"></a>

次の S3 on Outposts の例では、SDK for Java を使用してバケットにオブジェクトをコピーします。この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.ArrayList;
import java.util.List;

public class MultipartUploadCopy {
    public static void main(String[] args) {
        String accessPointArn = "*** Source access point ARN ***";
        String sourceObjectKey = "*** Source object key ***";
        String destObjectKey = "*** Target object key ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Initiate the multipart upload.
            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(accessPointArn, destObjectKey);
            InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initRequest);

            // Get the object size to track the end of the copy operation.
            GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(accessPointArn, sourceObjectKey);
            ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest);
            long objectSize = metadataResult.getContentLength();

            // Copy the object using 5 MB parts.
            long partSize = 5 * 1024 * 1024;
            long bytePosition = 0;
            int partNum = 1;
            List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>();
            while (bytePosition < objectSize) {
                // The last part might be smaller than partSize, so check to make sure
                // that lastByte isn't beyond the end of the object.
                long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1);

                // Copy this part.
                CopyPartRequest copyRequest = new CopyPartRequest()
                        .withSourceBucketName(accessPointArn)
                        .withSourceKey(sourceObjectKey)
                        .withDestinationBucketName(accessPointArn)
                        .withDestinationKey(destObjectKey)
                        .withUploadId(initResult.getUploadId())
                        .withFirstByte(bytePosition)
                        .withLastByte(lastByte)
                        .withPartNumber(partNum++);
                copyResponses.add(s3Client.copyPart(copyRequest));
                bytePosition += partSize;
            }

            // Complete the upload request to concatenate all uploaded parts and make the copied object available.
            CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
                    accessPointArn,
                    destObjectKey,
                    initResult.getUploadId(),
                    getETags(copyResponses));
            s3Client.completeMultipartUpload(completeRequest);
            System.out.println("Multipart copy complete.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client  
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    // This is a helper function to construct a list of ETags.
    private static List<PartETag> getETags(List<CopyPartResult> responses) {
        List<PartETag> etags = new ArrayList<PartETag>();
        for (CopyPartResult response : responses) {
            etags.add(new PartETag(response.getPartNumber(), response.getETag()));
        }
        return etags;
    }
}
```

## S3 on Outposts バケットにオブジェクトのパーツを一覧表示する
<a name="S3OutpostsListPartsJava"></a>

次の S3 on Outposts の例では、SDK for Java を使用してバケット内のオブジェクトのパーツを一覧表示します。この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.List;

public class ListParts {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";
        String keyName = "*** Key name ***";
        String uploadId = "*** Upload ID ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            ListPartsRequest listPartsRequest = new ListPartsRequest(accessPointArn, keyName, uploadId);
            PartListing partListing = s3Client.listParts(listPartsRequest);
            List<PartSummary> partSummaries = partListing.getParts();

            System.out.println(partSummaries.size() + " multipart upload parts");
            for (PartSummary p : partSummaries) {
                System.out.println("Upload part: Part number = \"" + p.getPartNumber() + "\", ETag = " + p.getETag());
            }

        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

## S3 on Outposts バケット内の進行中のマルチパートアップロードのリストを取得する
<a name="S3OutpostsListMultipartUploadsJava"></a>

次の S3 on Outposts の例では、Outposts バケットから SDK for Java を使用して、進行中のマルチパートアップロードのリストを取得する方法を示します。この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListMultipartUploadsRequest;
import com.amazonaws.services.s3.model.MultipartUpload;
import com.amazonaws.services.s3.model.MultipartUploadListing;

import java.util.List;

public class ListMultipartUploads {
    public static void main(String[] args) {
                String accessPointArn = "*** access point ARN ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Retrieve a list of all in-progress multipart uploads.
            ListMultipartUploadsRequest allMultipartUploadsRequest = new ListMultipartUploadsRequest(accessPointArn);
            MultipartUploadListing multipartUploadListing = s3Client.listMultipartUploads(allMultipartUploadsRequest);
            List<MultipartUpload> uploads = multipartUploadListing.getMultipartUploads();

            // Display information about all in-progress multipart uploads.
            System.out.println(uploads.size() + " multipart upload(s) in progress.");
            for (MultipartUpload u : uploads) {
                System.out.println("Upload in progress: Key = \"" + u.getKey() + "\", id = " + u.getUploadId());
            }
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# S3 on Outposts での署名付き URL の使用
<a name="S3OutpostsPresignedURL"></a>

バケットポリシーを更新せずに、Outpost にローカルに保存されているオブジェクトへの時間制限付きのアクセス許可を付与するには、事前署名付きの URL を使用します。署名付き URL を使用すると、バケット所有者は仮想プライベートクラウド (VPC) 内の個人とオブジェクトを共有したり、オブジェクトをアップロードまたは削除する権限を、これらのユーザーに付与したりできます。

AWS SDK または AWS Command Line Interface(AWS CLI) を使用して署名付き URL を作成する際には、その URL に対し特定のアクションを関連付けます。また、1 秒から 7 日まで指定可能なカスタム有効期限を選択して、署名付き URL に対し期間制限付きのアクセス許可を付与できます。署名付き URL を共有すると、VPC 内のユーザーは署名元のユーザーと同じように、URL に埋め込まれたアクションを実行できるようになります。この URL は有効期限が切れると失効し、以後は機能しなくなります。

## 署名付き URL 機能の制限
<a name="S3OutpostsPresignedUrlUploadObjectLimitCapabilities"></a>

署名付き URL の機能は、それを作成したユーザーの許可によって制限されます。本質的に署名付き URL は、それらを保有しているユーザーに対しアクセスを許可するためのベアラートークンです。そのため、適切に保護することをお勧めします。

**AWS Signature Version 4 (SigV4)**  
署名済み URL リクエストが AWS Signature Version 4 (SigV4) により認証される際に実行する特定の動作を適用するには、バケットポリシーとアクセスポイントポリシーで条件キーを使用します。例えば、`s3-outposts:signatureAge` 条件を使用するバケットポリシーを作成し、署名が作成されてから 10 分以上経過している場合に、`example-outpost-bucket` バケット内のオブジェクトに対する Amazon S3 on Outposts の署名付き URL リクエストを、すべて拒否することができます。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Deny a presigned URL request if the signature is more than 10 minutes old",
            "Effect": "Deny",
            "Principal": {"AWS":"444455556666"},
            "Action": "s3-outposts:*",
            "Resource": "arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/bucket/example-outpost-bucket/object/*",
            "Condition": {
                "NumericGreaterThan": {"s3-outposts:signatureAge": 600000},
                "StringEquals": {"s3-outposts:authType": "REST-QUERY-STRING"}
            }
        }
    ]
}
```

------

Signature Version 4 を使用している署名付き URL リクエストで、その認証時に実行する特定の動作を適用するための条件キー、および他のポリシー例のリストについては、「[AWS Signature Version 4 (SigV4) での認証固有ポリシーキー](s3-outposts-bucket-policy-s3-sigv4-conditions.md)」を参照してください。

**ネットワークパスでの制限**  
署名付き URL の使用と、S3 on Outposts アクセスをすべて特定のネットワークパスに制限する場合は、その特定のネットワークパスを使用しながら (IAM) ポリシーを記述できます。呼び出しを行う IAM プリンシパルに対する制限を設定するには、ID ベースの AWS Identity and Access Management (IAM) ポリシー (ユーザー、グループ、ロールポリシーなど) を使用できます。S3 on Outposts リソースでの制限を設定する場合は、リソースベースのポリシー (バケットポリシーやアクセスポイントポリシーなど) を使用します。

IAM プリンシパルでのネットワークパスの制限では、これらの認証情報のユーザーは、指定したネットワークからリクエストを送信する必要があります。バケットまたはアクセスポイントの制限により、そのリソースに対するすべてのリクエストは、指定したネットワークから発信される必要があります。これらの制限は、署名付き URL のシナリオ以外でも適用されます。

使用する IAM グローバル条件は、エンドポイントのタイプによって異なります。S3 on Outposts でパブリックエンドポイントを使用している場合は、`aws:SourceIp` を使用します。S3 on Outposts の VPC エンドポイントを使用している場合は、`aws:SourceVpc` または `aws:SourceVpce` を使用します。

次の IAM ポリシーステートメントでは、プリンシパルは、指定されたネットワーク範囲からのみ AWS にアクセスする必要があります。このポリシーステートメントでは、すべてのアクセスがその範囲から発信される必要があります。これは、S3 on Outposts の署名付き URL を使用するユーザーに対しても当てはまります。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

```
{
    "Sid": "NetworkRestrictionForIAMPrincipal",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
        "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"},
        "BoolIfExists": {"aws:ViaAWSService": "false"}
    }
}
```

S3 on Outposts バケットへのアクセスを特定のネットワーク範囲に制限するために、`aws:SourceIP` AWS グローバル条件キーを使用するバケットポリシーの例については、「[S3 on Outposts で IAM を設定する](S3OutpostsIAM.md)」を参照してください。

## 署名付き URL を作成できるユーザー
<a name="S3Outpostswho-presigned-url"></a>

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。しかし、VPC 内のユーザーがオブジェクトに正常にアクセスするには、署名付き URL をベースにするオペレーションの実行許可を持っているユーザーにより、この署名付き URL が作成されている必要があります。

以下の認証情報は、署名付き URL の作成に使用することができます。
+ **IAM インスタンスプロファイル** – 最大 6 時間有効。
+ **AWS Security Token Service** – AWS アカウント ルートユーザーや IAM ユーザーの認証情報など、永続的な認証情報を使用して署名されている場合は、最大 36 時間まで有効。
+ **IAM ユーザー** – AWS Signature Version 4 を使用している場合は、最大 7 日間まで有効。

  最大 7 日間有効の署名付き URL を作成するには、まず、使用する SDK への IAM ユーザー認証情報 (アクセスキーとシークレットキー) の委任を行います。次に、AWS Signature Version 4 を使用して署名付き URL を生成します。

**注記**  
一時トークンを使用して作成した署名付き URL において、URL の有効期限の終了より先にそのトークンが有効期限切れになった場合は、URL も失効します。
署名付き URL は、その URL を保有しているすべてのユーザーに S3 on Outposts バケットへのアクセスを許可するため、適切な保護を行うことをお勧めします。署名付き URL の保護の詳細については、「[署名付き URL 機能の制限](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities)」を参照してください。

## S3 on Outposts は、どのタイミングで署名付き URL の有効期限切れの日時を確認しますか?
<a name="S3Outpostspresigned-url-when-checked"></a>

S3 on Outposts は、HTTP リクエスト時に署名付き URL の有効期限日時を確認します。例えば、有効期限が切れる時刻の直前にクライアントが大きなファイルのダウンロードを開始した場合は、ダウンロード中に有効期限時刻が経過しても、そのダウンロードは継続されます。しかし、接続が中断し、クライアントがダウンロードを再開しようとした時点で有効期限切れの時刻が経過している場合には、そのダウンロードは失敗します。

署名付き URL を使用してオブジェクトを共有またはアップロードする方法の詳細については、次のトピックを参照してください。

**Topics**
+ [署名付き URL 機能の制限](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities)
+ [署名付き URL を作成できるユーザー](#S3Outpostswho-presigned-url)
+ [S3 on Outposts は、どのタイミングで署名付き URL の有効期限切れの日時を確認しますか?](#S3Outpostspresigned-url-when-checked)
+ [署名付き URL を使用したオブジェクトの共有](S3OutpostsShareObjectPresignedURL.md)
+ [S3 on Outposts バケットにオブジェクトをアップロードするための署名付き URL の生成](S3OutpostsPresignedUrlUploadObject.md)

# 署名付き URL を使用したオブジェクトの共有
<a name="S3OutpostsShareObjectPresignedURL"></a>

バケットポリシーを更新せずに、Outpost にローカルに保存されているオブジェクトへの時間制限付きのアクセス許可を付与するには、事前署名付きの URL を使用します。署名付き URL を使用すると、バケット所有者は仮想プライベートクラウド (VPC) 内の個人とオブジェクトを共有したり、オブジェクトをアップロードまたは削除する権限を、これらのユーザーに付与したりできます。

AWS SDK または AWS Command Line Interface(AWS CLI) を使用して署名付き URL を作成する際には、その URL に対し特定のアクションを関連付けます。また、1 秒から 7 日まで指定可能なカスタム有効期限を選択して、署名付き URL に対し期間制限付きのアクセス許可を付与できます。署名付き URL を共有すると、VPC 内のユーザーは署名元のユーザーと同じように、URL に埋め込まれたアクションを実行できるようになります。この URL は有効期限が切れると失効し、以後は機能しなくなります。



署名付き URL を作成する場合には、ご自身のセキュリティ認証情報を設定し、さらに次の情報を指定する必要があります。
+ Outposts バケット上の Amazon S3 アクセスポイントの Amazon リソースネーム (ARN)
+ オブジェクトキー
+ HTTP メソッド (オブジェクトをダウンロードするための `GET`)
+ 有効期限の終了日時

署名付き URL は、指定した期間内でのみ有効です。つまり、有効期限が切れる日時の前に、URL で許可されているアクションを開始する必要があります。有効期限が切れる日時までは、署名付き URL を複数回使用できます。一時トークンを使用して署名付き URL を作成した場合、トークンが有効期限切れになると、URL の有効期限より前であってもその URL は失効します。

署名付き URL へのアクセス権を持つ仮想プライベートクラウド (VPC) のユーザーは、このオブジェクトにアクセスできます。例えば、プライベートのバケット内にプライベートの動画を格納している場合は、署名付き URL を生成することで、その動画を他ユーザーと共有できます。署名付き URL は、その URL を保有するすべてのユーザーに S3 on Outposts バケットへのアクセス許可を付与するため、この URL には適切な保護を行うことをお勧めします。署名付き URL の保護の詳細については、[署名付き URL 機能の制限](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities) を参照してください。

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。ただし、署名付き URL の基となるオペレーションを実行するアクセス許可を持つユーザーが、その署名付き URL を作成する必要があります。詳細については、「[署名付き URL を作成できるユーザー](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url)」を参照してください。

AWS SDK とAWS CLI を使用すると、S3 on Outposts バケット内にあるオブジェクトを共有するための署名付き URL を生成できます。詳細については、以下の例を参照してください。

## AWS SDK の使用
<a name="S3OutpostsShareObjectPreSignedURLSDK"></a>

AWS SDK を使用して署名付き URL を生成します。この URL を他ユーザーに配布すると、そのユーザーがオブジェクトを取得できるようになります。

**注記**  
署名付き URL の生成に AWS SDK を使用した場合、その署名付き URL の最大有効期限は、作成時点から 7 日間となります。

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

**Example**  
次のサンプルコードは、署名付き URL を生成します。この URL は、Outposts バケット上の S3 からオブジェクトを取得可能にするために他のユーザーに配布できます。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.HttpMethod;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;

import java.io.IOException;
import java.net.URL;
import java.time.Instant;

public class GeneratePresignedURL {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String accessPointArn = "*** access point ARN ***";
        String objectKey = "*** object key ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Set the presigned URL to expire after one hour.
            java.util.Date expiration = new java.util.Date();
            long expTimeMillis = Instant.now().toEpochMilli();
            expTimeMillis += 1000 * 60 * 60;
            expiration.setTime(expTimeMillis);

            // Generate the presigned URL.
            System.out.println("Generating pre-signed URL.");
            GeneratePresignedUrlRequest generatePresignedUrlRequest =
                    new GeneratePresignedUrlRequest(accessPointArn, objectKey)
                            .withMethod(HttpMethod.GET)
                            .withExpiration(expiration);
            URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

            System.out.println("Pre-Signed URL: " + url.toString());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

**Example**  
次のサンプルコードは、署名付き URL を生成します。この URL は、Outposts バケット上の S3 からオブジェクトを取得可能にするために他のユーザーに配布できます。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;

namespace Amazon.DocSamples.S3
{
    class GenPresignedURLTest
    {
        private const string accessPointArn = "*** access point ARN ***"; 
        private const string objectKey = "*** object key ***";
        // Specify how long the presigned URL lasts, in hours.
        private const double timeoutDuration = 12;
        // Specify your bucket Region (an example Region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            string urlString = GeneratePreSignedURL(timeoutDuration);
        }
        static string GeneratePreSignedURL(double duration)
        {
            string urlString = "";
            try
            {
                GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
                {
                    BucketName = accessPointArn,
                    Key = objectKey,
                    Expires = DateTime.UtcNow.AddHours(duration)
                };
                urlString = s3Client.GetPreSignedURL(request1);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            return urlString;
        }
    }
}
```

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

次の例では、SDK for Python (Boto3) を使用して、オブジェクトを共有するための署名付き URL を生成しています。例えば、Boto3 クライアントおよび `generate_presigned_url` 関数を使用して、オブジェクトを `GET` する署名付き URL を生成します。

```
import boto3
    url = boto3.client('s3').generate_presigned_url(
    ClientMethod='get_object', 
    Params={'Bucket': 'ACCESS_POINT_ARN', 'Key': 'OBJECT_KEY'},
    ExpiresIn=3600)
```

SDK for Python (Boto3) を使用して署名付き URL を生成する方法については、「*AWS SDK for Python (Boto) API リファレンス*」の「[Python](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url)」を参照してください。

------

## の使用AWS CLI
<a name="S3OutpostsShareObjectPresignedCLI"></a>

次の例では、AWS CLI コマンドにより、S3 on Outposts バケットのための署名付き URL を生成します。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

**注記**  
署名付き URL の作成に AWS CLI を使用した場合、その署名付き URL の最大有効期限は、作成時点から 7 日間になります。

```
aws s3 presign s3://arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/example-outpost-access-point/mydoc.txt --expires-in 604800
```

詳細については、 「AWS CLI コマンドリファレンス」の「[presign](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html)」を参照してください。

# S3 on Outposts バケットにオブジェクトをアップロードするための署名付き URL の生成
<a name="S3OutpostsPresignedUrlUploadObject"></a>

バケットポリシーを更新せずに、Outpost にローカルに保存されているオブジェクトへの時間制限付きのアクセス許可を付与するには、事前署名付きの URL を使用します。署名付き URL を使用すると、バケット所有者は仮想プライベートクラウド (VPC) 内の個人とオブジェクトを共有したり、オブジェクトをアップロードまたは削除する権限を、これらのユーザーに付与したりできます。

AWS SDK または AWS Command Line Interface(AWS CLI) を使用して署名付き URL を作成する際には、その URL に対し特定のアクションを関連付けます。また、1 秒から 7 日まで指定可能なカスタム有効期限を選択して、署名付き URL に対し期間制限付きのアクセス許可を付与できます。署名付き URL を共有すると、VPC 内のユーザーは署名元のユーザーと同じように、URL に埋め込まれたアクションを実行できるようになります。この URL は有効期限が切れると失効し、以後は機能しなくなります。

署名付き URL を作成する場合には、ご自身のセキュリティ認証情報を設定し、さらに次の情報を指定する必要があります。
+ Outposts バケット上の Amazon S3 アクセスポイントの Amazon リソースネーム (ARN)
+ オブジェクトキー
+ HTTP メソッド (オブジェクトをアップロードするための `PUT`)
+ 有効期限の終了日時

署名付き URL は、指定した期間内でのみ有効です。つまり、有効期限が切れる日時の前に、URL で許可されているアクションを開始する必要があります。有効期限が切れる日時までは、署名付き URL を複数回使用できます。一時トークンを使用して署名付き URL を作成した場合、トークンが有効期限切れになると、URL の有効期限より前であってもその URL は失効します。

マルチパートアップロードなど、複数のステップで構成されているアクションでは、すべてのステップを有効期限が切れる前に開始する必要があります。有効期限が切れた URL を使用して、S3 on Outposts がステップの開始を試みた場合は、エラーが発生します。

署名付き URL へのアクセス権を持つ仮想プライベートクラウド (VPC) 内のユーザーは、オブジェクトをアップロードすることが可能です。例えば、署名付き URL にアクセスできる VPC 内のユーザーは、お客様のバケットへのオブジェクトのアップロードが可能です。署名付き URL は、その URL を保有するすべてのユーザーに対し、S3 on Outposts バケットへのアクセスを許可するため、これらの URL には適切な保護を行うことをお勧めします。署名付き URL の保護の詳細については、[署名付き URL 機能の制限](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities) を参照してください。

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。ただし、署名付き URL の基となるオペレーションを実行するアクセス許可を持つユーザーが、その署名付き URL を作成する必要があります。詳細については、「[署名付き URL を作成できるユーザー](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url)」を参照してください。

## AWS SDK を使用した S3 on Outposts オブジェクトオペレーションへの署名付き URL の生成
<a name="s3-outposts-presigned-urls-upload-examples"></a>

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

**SDK for Java 2.x**  
この例では、限られた時間内に S3 on Outposts バケットにオブジェクトをアップロードするために使用できる、署名付き URL を生成する方法を説明します。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。  

```
    public static void signBucket(S3Presigner presigner, String outpostAccessPointArn, String keyName) {

        try {
            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(accessPointArn)
                    .key(keyName)
                    .contentType("text/plain")
                    .build();

            PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))
                    .putObjectRequest(objectRequest)
                    .build();

            PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);


            String myURL = presignedRequest.url().toString();
            System.out.println("Presigned URL to upload a file to: " +myURL);
            System.out.println("Which HTTP method must be used when uploading a file: " +
                    presignedRequest.httpRequest().method());

            // Upload content to the S3 on Outposts bucket by using this URL.
            URL url = presignedRequest.url();

            // Create the connection and use it to upload the new object by using the presigned URL.
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type","text/plain");
            connection.setRequestMethod("PUT");
            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
            out.write("This text was uploaded as an object by using a presigned URL.");
            out.close();

            connection.getResponseCode();
            System.out.println("HTTP response code is " + connection.getResponseCode());

        } catch (S3Exception e) {
            e.getStackTrace();
        } catch (IOException e) {
            e.getStackTrace();
        }
    }
```

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

**SDK for Python (Boto3)**  
S3 on Outposts アクションを期間限定で実行できる署名付き URL の生成方法を示します。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。この URL でリクエストを行うには、`Requests` パッケージを使用します。  

```
import argparse
import logging
import boto3
from botocore.exceptions import ClientError
import requests

logger = logging.getLogger(__name__)


def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
    """
    Generate a presigned S3 on Outposts URL that can be used to perform an action.

    :param s3_client: A Boto3 Amazon S3 client.
    :param client_method: The name of the client method that the URL performs.
    :param method_parameters: The parameters of the specified client method.
    :param expires_in: The number of seconds that the presigned URL is valid for.
    :return: The presigned URL.
    """
    try:
        url = s3_client.generate_presigned_url(
            ClientMethod=client_method,
            Params=method_parameters,
            ExpiresIn=expires_in
        )
        logger.info("Got presigned URL: %s", url)
    except ClientError:
        logger.exception(
            "Couldn't get a presigned URL for client method '%s'.", client_method)
        raise
    return url


def usage_demo():
    logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')

    print('-'*88)
    print("Welcome to the Amazon S3 on Outposts presigned URL demo.")
    print('-'*88)

    parser = argparse.ArgumentParser()
    parser.add_argument('accessPointArn', help="The name of the S3 on Outposts access point ARN.")
    parser.add_argument(
        'key', help="For a GET operation, the key of the object in S3 on Outposts. For a "
                    "PUT operation, the name of a file to upload.")
    parser.add_argument(
        'action', choices=('get', 'put'), help="The action to perform.")
    args = parser.parse_args()

    s3_client = boto3.client('s3')
    client_action = 'get_object' if args.action == 'get' else 'put_object'
    url = generate_presigned_url(
        s3_client, client_action, {'Bucket': args.accessPointArn, 'Key': args.key}, 1000)

    print("Using the Requests package to send a request to the URL.")
    response = None
    if args.action == 'get':
        response = requests.get(url)
    elif args.action == 'put':
        print("Putting data to the URL.")
        try:
            with open(args.key, 'r') as object_file:
                object_text = object_file.read()
            response = requests.put(url, data=object_text)
        except FileNotFoundError:
            print(f"Couldn't find {args.key}. For a PUT operation, the key must be the "
                  f"name of a file that exists on your computer.")

    if response is not None:
        print("Got response:")
        print(f"Status: {response.status_code}")
        print(response.text)

    print('-'*88)


if __name__ == '__main__':
    usage_demo()
```

------

# ローカルの Amazon EMR on Outposts を使用した Amazon S3 on Outposts
<a name="s3-outposts-emr"></a>

Amazon EMR は、Apache Hadoop や Apache Spark などのビッグデータフレームワークを AWS で簡単に実行して、膨大な量のデータを処理および分析できるマネージドクラスタープラットフォームです。これらのフレームワークと、関連するオープンソースプロジェクトを使用することで、分析用のデータやビジネスインテリジェンスワークロードを処理できます。Amazon EMR は、大量のデータを変換したり、他の AWS データストアやデータベースとの間で出し入れしたりできるようにします。また、Amazon S3 on Outposts をサポートしています。Amazon EMR の詳細については、「Amazon EMR 管理ガイド」の「[Outposts での Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-outposts.html)」を参照してください。**

Amazon S3 on Outposts については、Amazon EMR はバージョン 7.0.0 で Apache Hadoop S3A コネクタのサポートを開始しました。以前のバージョンの Amazon EMR はローカルの S3 on Outposts をサポートしておらず、EMR ファイルシステム (EMRFS) はサポートされていません。

**サポートされているアプリケーション**  
Amazon S3 on Outposts を使用した Amazon EMR は、次のアプリケーションをサポートしています。
+ Hadoop
+ Spark
+ Hue
+ Hive
+ Sqoop
+ Pig
+ Hudi
+ Flink

詳細については、「[Amazon EMR リリースガイド](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html)」を参照してください。

## Amazon S3 on Outposts バケットを作成して設定する
<a name="create-outposts-bucket"></a>

Amazon EMR では、Amazon S3 on Outposts で AWS SDK for Java を使用して、入力データと出力データを保存します。Amazon EMR ログファイルは、選択したリージョンの Amazon S3 ロケーションに保存され、Outpost にローカルに保存されることはありません。詳細については、「Amazon EMR 管理ガイド」の「[Amazon EMR ログ](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)」を参照してください。**

Amazon S3 と DNS の要件に従うには、S3 on Outposts バケットに命名に関する制約と制限があります。詳細については、「[S3 on Outposts バケットを作成する](S3OutpostsCreateBucket.md)」を参照してください。

Amazon EMR バージョン 7.0.0 以降では、S3 on Outposts と S3A ファイルシステムで Amazon EMR を使用できます。

**前提条件**  
**S3 on Outposts アクセス許可** – Amazon EMR インスタンスプロファイルを作成する場合、ロールには S3 on Outposts の AWS Identity and Access Management (IAM) 名前空間が含まれている必要があります。S3 on Outposts には独自の名前空間、`s3-outposts*` があります。この名前空間を使用するポリシーの例については、「[S3 on Outposts で IAM を設定する](S3OutpostsIAM.md)」を参照してください。

**S3A コネクタ** – Amazon S3 on Outposts バケットのデータにアクセスするように EMR クラスターを設定するには、Apache Hadoop S3A コネクタを使用する必要があります。コネクタを使用するには、すべての S3 URI が `s3a` スキームを使用していることを確認してください。そうでない場合は、S3 URI が S3A コネクタと連携するように EMR クラスターに使用するファイルシステムの実装を設定できます。

S3A コネクタと連携するようにファイルシステムの実装を設定するには、EMR クラスターの `fs.file_scheme.impl` および `fs.AbstractFileSystem.file_scheme.impl` 設定プロパティを使用します。`file_scheme` は使用している S3 URI のタイプに対応します。次の例を使用するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。例えば、`s3` スキームを使用する S3 URI ファイルシステムの実装を変更するには、次のクラスター設定プロパティを指定します。

```
1. [
2.   {
3. "Classification": "core-site",
4.     "Properties": {
5.     "fs.s3.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
6.     "fs.AbstractFileSystem.s3.impl": "org.apache.hadoop.fs.s3a.S3A"
7.     }
8.   }
9. ]
```

S3A を使用するには、`fs.file_scheme.impl` 設定プロパティを `org.apache.hadoop.fs.s3a.S3AFileSystem` に設定し、`fs.AbstractFileSystem.file_scheme.impl` プロパティを `org.apache.hadoop.fs.s3a.S3A` に設定します。

例えば、パス `s3a://bucket/...` にアクセスする場合は、`fs.s3a.impl` プロパティを `org.apache.hadoop.fs.s3a.S3AFileSystem` に設定し、`fs.AbstractFileSystem.s3a.impl` プロパティを `org.apache.hadoop.fs.s3a.S3A` に設定します。

## Amazon S3 on Outposts での Amazon EMR の開始方法
<a name="getting-started-outposts"></a>

以下のトピックでは、Amazon S3 on Outposts で Amazon EMR の使用を開始する方法について説明します。

**Topics**
+ [許可ポリシーを作成する](#create-permission-policy)
+ [クラスターを作成および設定する](#configure-cluster)
+ [設定の概要](#configurations-overview)
+ [考慮事項](#considerations)

### 許可ポリシーを作成する
<a name="create-permission-policy"></a>

Amazon S3 on Outposts を使用する EMR クラスターを作成する前に、クラスターの Amazon EC2 インスタンスプロファイルにアタッチする IAM ポリシーを作成する必要があります。ポリシーには、S3 on Outposts アクセスポイントの Amazon リソースネーム (ARN) にアクセスするためのアクセス許可が必要です。S3 on Outposts の IAM ポリシーの作成に関する詳細については、「[S3 on Outposts で IAM を設定する](S3OutpostsIAM.md)」を参照してください。

次のポリシー例は、必要なアクセス許可を付与する方法を示します。ポリシーを作成したら、[クラスターを作成および設定する](#configure-cluster) セクションで説明されているように、お使いの EMR クラスターの作成に使用するインスタンスプロファイルロールにポリシーをアタッチします。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

```
 1. {
 2. "Version":"2012-10-17",		 	 	  
 3.   "Statement": [
 4.         {
 5.   "Effect": "Allow",
 6.             "Resource": "arn:aws:s3-outposts:us-west-2:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/access-point-name,
 7.             "Action": [
 8.                 "s3-outposts:*"
 9.             ]
10.         }
11.     ]
12.     
13.  }
```

### クラスターを作成および設定する
<a name="configure-cluster"></a>

S3 on Outposts で Spark を実行するクラスターを作成するには、コンソールで次の手順を実行します。

**S3 on Outposts で Spark を実行するクラスターを作成するには**

1. Amazon EMR コンソール ([https://console.aws.amazon.com/elasticmapreduce/](https://console.aws.amazon.com/elasticmapreduce/)) を開きます。

1. 左のナビゲーションペインで **[クラスター]** を選択します。

1. **[クラスターを作成]** を選択します。

   

1. **[Amazon EMR リリース]** で、**emr-7.0.0** 以降を選択します。

1. アプリケーションバンドル で、**[Spark インタラクティブ]** を選択します。次に、クラスターに含める他のサポートされているアプリケーションを選択します。

1. Amazon S3 on Outposts を有効にするには、構成設定を入力します。

**構成設定の例**  
次の構成設定の例を使用するには、`user input placeholders` をユーザー自身の情報に置き換えます。

   ```
    1. [
    2.  {
    3.    "Classification": "core-site",
    4.    "Properties": {
    5.      "fs.s3a.bucket.DOC-EXAMPLE-BUCKET.accesspoint.arn": "arn:aws:s3-outposts:us-west-2:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/access-point-name"
    6.      "fs.s3a.committer.name": "magic", 
    7.      "fs.s3a.select.enabled": "false"
    8.     }
    9.   },
   10.   {
   11.     "Classification": "hadoop-env",
   12.     "Configurations": [
   13.       {
   14.         "Classification": "export",
   15.         "Properties": {
   16.           "JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64" 
   17.           }
   18.        }
   19.      ],
   20.      "Properties": {}
   21.    },
   22.    {
   23.      "Classification": "spark-env",
   24.      "Configurations": [
   25.        {
   26.          "Classification": "export",
   27.          "Properties": {
   28.            "JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64"
   29.          }
   30.        }
   31.       ],
   32.       "Properties": {}
   33.      },
   34.      {
   35.       "Classification": "spark-defaults",
   36.       "Properties": {
   37.         "spark.executorEnv.JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64",
   38.         "spark.sql.sources.fastS3PartitionDiscovery.enabled": "false"
   39.       }
   40.      }
   41.   ]
   ```

1. **[ネットワーク]** セクションで、AWS Outposts ラック上にある仮想プライベートクラウド (VPC) とサブネットを選択します。Amazon EMR on Outposts の詳細については、「Amazon EMR 管理ガイド」の「[AWS Outposts での EMR クラスター](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-outposts.html)」を参照してください。**

1. **[Amazon EMR の EC2 インスタンスプロファイル]** セクションで、[前に作成したアクセス許可ポリシー](#create-permission-policy)がアタッチされている IAM ロールを選択します。

1. 残りのクラスター設定を行い、**[クラスターの作成]** を選択します。

### 設定の概要
<a name="configurations-overview"></a>

次の表は、Amazon EMR で S3 on Outposts を使用するクラスターをセットアップするときに、S3A 設定とそのパラメータに指定する値を示しています。


| パラメータ | デフォルト値 | S3 on Outposts に必要な値 | 説明 | 
| --- | --- | --- | --- | 
|  `fs.s3a.aws.credentials.provider`  |  指定しない場合、S3A は Outposts のバケット名を持つリージョンバケットで S3 を検索します。  |  S3 on Outposts バケットのアクセスポイント ARN  |  Amazon S3 on Outposts は、Outposts バケットにアクセスする唯一の手段として、Virtual Private Cloud (VPC) のみのアクセスポイントをサポートします。  | 
|  `fs.s3a.committer.name`  | file |  `magic`  |  マジックコミッターは、S3 on Outposts でサポートされている唯一のコミッターです。  | 
|  `fs.s3a.select.enabled`  |  `TRUE`  |  `FALSE`  | S3 Select は Outposts ではサポートされていません。 | 
|  `JAVA_HOME`  |  `/usr/lib/jvm/java-8`  |  `/usr/lib/jvm/java-11-amazon-corretto.x86_64`  |  S3A 上の S3 on Outposts には、Java バージョン 11 が必要です。  | 

次の表は、Amazon EMR で S3 on Outposts を使用するクラスターをセットアップするときに、Spark 設定とそのパラメータに指定する値を示しています。


| パラメータ | デフォルト値 | S3 on Outposts に必要な値 | 説明 | 
| --- | --- | --- | --- | 
|  `spark.sql.sources.fastS3PartitionDiscovery.enabled`  |  `TRUE`  |  `FALSE`  |  S3 on Outposts は高速パーティションをサポートしていません。  | 
|  `spark.executorEnv.JAVA_HOME`  |  `/usr/lib/jvm/java-8`  |  `/usr/lib/jvm/java-11-amazon-corretto.x86_64`  |  S3A 上の S3 on Outposts には、Java バージョン 11 が必要です。  | 

### 考慮事項
<a name="considerations"></a>

Amazon EMR を S3 on Outposts バケットと統合するときは、次の点を考慮してください。
+ Amazon S3 on Outposts は、Amazon EMR バージョン 7.0.0 以降でサポートされています。
+ Amazon EMR で S3 on Outposts を使用するには、S3A コネクタが必要です。S3 on Outposts バケットを操作するために必要な機能を備えているのは S3A のみです。S3A コネクタのセットアップ情報については、「[前提条件](#s3a-outposts-prerequisites)」を参照してください。
+ Amazon S3 on Outposts は、Amazon EMR での Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) のみをサポートします。詳細については、「[S3 on Outposts のデータ暗号化](s3-outposts-data-encryption.md)」を参照してください。
+ Amazon S3 on Outposts は、S3A FileOutputCommitter を使用した書き込みをサポートしていません。S3 on Outposts バケットに S3A FileOutputCommitter を使用して書き込むと、次のエラーが発生します。InvalidStorageClass: The storage class you specified is not valid
+ Amazon S3 on Outposts は、Amazon EMR Serverless または Amazon EMR on EKS ではサポートされていません。
+ Amazon EMR ログは、選択したリージョンの Amazon S3 ロケーションに保存され、S3 on Outposts バケットにローカルに保存されることはありません。

# 認可と認証キャッシング
<a name="s3-outposts-auth-cache"></a>

S3 on Outposts は、Outposts ラック上のローカルで認証および認可データを安全にキャッシュします。キャッシュは、リクエストごとに親 AWS リージョン へのラウンドトリップを削除します。これにより、ネットワークラウンドトリップに伴う変動を排除できます。S3 on Outposts の認証キャッシュと認可キャッシュを使用すると、Outposts とAWS リージョン間の接続のレイテンシーとは無関係の一貫したレイテンシーが得られます。

S3 on Outposts API リクエストを行うと、認証および認可データは安全にキャッシュされます。その後、キャッシュされたデータは、後続の S3 オブジェクト API リクエストを認証するために使用されます。S3 on Outposts は、リクエストが Signature Version 4A (SigV4A) を使用して署名された場合にのみ、認証および認可データをキャッシュします。キャッシュは、S3 on Outposts サービス内の Outposts にローカルに保存されます。S3 API リクエストを行うと、非同期的に更新されます。キャッシュは暗号化され、プレーンテキストの暗号化キーは Outposts に保存されません。

キャッシュは、Outpost が AWS リージョン に接続されてから最大 10 分間有効です。S3 on Outposts API リクエストを行うと、最新のポリシーが使用されるように非同期的に更新されます。Outpost が AWS リージョン から切断されている場合、キャッシュは最大 12 時間有効です。

## 認可キャッシュと認証キャッシュの設定
<a name="config-auth-cache"></a>

S3 on Outposts は、SigV4A アルゴリズムで署名されたリクエストの認証および認可データを自動的にキャッシュします。詳細については、「*AWS Identity and Access Management ユーザーガイド*」の「[AWS API リクエストの署名](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)」を参照してください。SigV4A アルゴリズムは、最新バージョンの AWS SDK で使用できます。これは、[AWSCommon Runtime (CRT) ライブラリ](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html)への依存関係を通じて取得できます。

最新バージョンの AWS SDK を使用し、最新バージョンの CRT をインストールする必要があります。例えば、`pip install awscrt` を実行して Boto3 で CRT の最新バージョンを取得できます。

S3 on Outposts は、SigV4 アルゴリズムで署名されたリクエストの認証および認可データをキャッシュしません。

## SigV4A 署名の検証
<a name="validate-SigV4A"></a>

AWS CloudTrail を使用してリクエストが SigV4A で署名されたことを確認できます。S3 on Outposts の CloudTrail の設定についての詳細は、「[AWS CloudTrail ログで S3 on Outposts をモニタリングする](S3OutpostsCloudtrail.md)」を参照してください。

CloudTrail を設定したら、CloudTrail ログの `SignatureVersion` フィールドでリクエストがどのように署名されたかを確認できます。SigV4A で署名されたリクエストでは、`SignatureVersion` が `AWS4-ECDSA-P256-SHA256` に設定されます。SigV4 で署名されたリクエストでは、`SignatureVersion` が `AWS4-HMAC-SHA256` に設定されます。