

# ディレクトリバケット内のオブジェクトの名前の変更
<a name="directory-buckets-objects-rename"></a>

`RenameObject` オペレーションを使用すると、データを移動することなく、S3 Express One Zone ストレージクラスを使用するディレクトリバケット内の既存のオブジェクトの名前をアトミックに変更できます。オブジェクトの名前を変更するには、既存のオブジェクトの名前をソースとして指定し、オブジェクトの新しい名前を同じディレクトリバケット内の送信先として指定します。`RenameObject` API オペレーションは、スラッシュ (`/`) 区切り文字で終わるオブジェクトでは成功しません。詳細については、「[Amazon S3 オブジェクトに命名する](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html)」を参照してください。

`RenameObject` オペレーションは通常、オブジェクトのサイズに関係なくミリ秒単位で完了します。この機能により、ログファイル管理、メディア処理、データ分析などのアプリケーションが高速化されます。さらに、`RenameObject` は、ストレージクラス、暗号化タイプ、作成日、最終更新日、チェックサムプロパティなど、すべてのオブジェクトメタデータプロパティを保持します。

**注記**  
`RenameObject` は、S3 Express One Zone ストレージクラスに保存されているオブジェクトでのみサポートされています。

 `RenameObject` オペレーションへのアクセスを許可するには、セッションベースの認可に `CreateSession` オペレーションを使用することをお勧めします。具体的には、バケットポリシーまたはアイデンティティベースのポリシーのディレクトリバケットに `s3express:CreateSession` アクセス許可を付与します。次に、ディレクトリバケットで `CreateSession` API コールを行い、セッショントークンを取得します。リクエストヘッダーのセッショントークンを使用すると、このオペレーションに対して API リクエストを行うことができます。セッショントークンの有効期限が切れたら、別の `CreateSession` API コールを実行して、新しいセッショントークンを生成して使用します。AWS CLI と AWS SDK は、セッションの有効期限が切れたときのサービス中断を避けるために、セッショントークンを自動的に更新するなど、セッションを作成および管理します。認可の詳細については、「*Amazon S3 API リファレンス*」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html)」を参照してください。ゾーンエンドポイント API オペレーションの詳細については、「[`CreateSession` を使用したゾーンエンドポイント API オペレーションの承認](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-create-session.html)」を参照してください。

 既存のオブジェクトを上書きしない場合は、`RenameObject` リクエストに `‘*’` 値を含む `If-None-Match` 条件付きヘッダーを追加できます。オブジェクト名が既に存在する場合、Amazon S3 は `412 Precondition Failed` エラーを返します。詳細については、「**Amazon S3 API リファレンス」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/API_RenameObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_RenameObject.html)」を参照してください。

 `RenameObject` は、AWS CloudTrail にログ記録されるゾーンエンドポイント API オペレーション (オブジェクトレベルまたはデータプレーンオペレーション) です。CloudTrail を使用して、ディレクトリバケット内のオブジェクトで実行された `RenameObject` オペレーションに関する情報を収集できます。詳細については、「[ディレクトリバケットの AWS CloudTrail を使用したログ記録](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone-logging.html)」と「[ディレクトリバケットの CloudTrail ログファイルの例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-log-files.html)」を参照してください。

S3 Express One Zone は `RenameObject` をサポートする唯一のストレージクラスで、S3 Express One Zone の `PUT`、`COPY`、`POST`、および `LIST` リクエスト (1,000 リクエストあたり) と同じ料金です。詳細については、「[Amazon S3 の料金](https://aws.amazon.com/s3/pricing/)」を参照してください。

## オブジェクトの名前の変更
<a name="directory-bucket-rename"></a>

ディレクトリバケット内のオブジェクトの名前を変更するには、Amazon S3 コンソール、AWS CLI、AWS SDK、REST API、または Mountpoint for Amazon S3 (バージョン 1.19.0 以降) を使用できます。

### S3 コンソールの使用
<a name="set-rename--console"></a>

**ディレクトリバケット内のオブジェクトの名前を変更するには**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) を開きます。

1. ナビゲーションペインで **[バケット]** を選択してから、**[ディレクトリバケット]** タブを選択します。名前を変更するオブジェクトが含まれる Amazon S3 ディレクトリバケットに移動します。

1. 名前を変更するオブジェクトのチェックボックスをオンにします。

1. **[アクション]** メニューで **[オブジェクトの名前変更]** を選択します。

1. **[新しいオブジェクト名]** ボックスに、オブジェクトの新しい名前を入力します。
**注記**  
既存のオブジェクトと同じオブジェクト名を指定すると、オペレーションは失敗し、Amazon S3 は `412 Precondition Failed` エラーを返します。オブジェクトキー名の長さは 1,024 バイトを超えることはできません。オブジェクト名に含まれるプレフィックスは、長さの合計にカウントされます。

1. **[オブジェクトの名前変更]** を選択します。Amazon S3 によりオブジェクトの名前が変更されます。

### AWS CLI の使用
<a name="set-rename--cli"></a>

この `rename-object` の例では、AWS CLI を使用してオブジェクトの名前を変更する方法を示します。これらのコマンドを実行するには、{{ユーザー入力プレースホルダー}}を独自の情報に置き換えます

次の例は、ソースオブジェクトの ETag の条件付きチェックを使用してオブジェクトの名前を変更する方法を示しています。

```
aws s3api rename-object \                                    
    --bucket {{amzn-s3-demo-bucket--usw2-az1--x-s3}} \
    --key {{new-file.txt}} \
    --rename-source {{original-file.txt}} \
    --source-if-match "\"{{a1b7c3d2e5f6}}\""
```

このコマンドは次のことを行います。
+ {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケットのオブジェクトの名前を {{original-file.txt}} から {{new-file.txt}} に変更します。
+ ソースオブジェクトの ETag が「{{a1b7c3d4e5f6}}」と一致する場合にのみ、名前変更を実行します。

ETag が一致しない場合、オペレーションは `412 Precondition Failed` エラーで失敗します。

次の例は、新しい指定されたオブジェクト名の条件付きチェックを使用してオブジェクトの名前を変更する方法を示しています。

```
aws s3api rename-object \
    --bucket {{amzn-s3-demo-bucket--usw2-az1--x-s3}} \
    --key {{new-file.txt}} \
    --rename-source {{amzn-s3-demo-bucket--usw2-az1--x-s3}}/{{original-file.txt}} \
    --destination-if-none-match "\"{{e5f3g7h8i9j0}}\""
```

このコマンドは次のことを行います。
+ {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケットのオブジェクトの名前を {{original-file.txt}} から {{new-file.txt}} に変更します。
+ オブジェクトが存在し、オブジェクトの ETag が 「{{e5f3g7h8i9j0}}」と一致しない場合のみ、名前変更オペレーションを実行します。

新しい指定された名前と一致する ETag を持つオブジェクトが既に存在する場合、オペレーションは `412 Precondition Failed` エラーで失敗します。

### AWS SDK の使用
<a name="directory-bucket-rename-sdks"></a>

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

AWS SDK for Java を使用してオブジェクトの名前を変更できます。これらの例を使用するには、{{ユーザー入力プレースホルダー}}を独自の情報に置き換えます

次の例では、AWS SDK for Java を使用して `RenameObjectRequest` を作成する方法を示します

```
String key = "{{key}}";
String newKey = "{{new-key}}";
String expectedETag = "{{e5f3g7h8i9j0}}";
RenameObjectRequest renameRequest = RenameObjectRequest.builder()
    .bucket({{amzn-s3-demo-bucket--usw2-az1--x-s3}})
    .key({{newKey}})
    .renameSource({{key}})
    .destinationIfMatch({{e5f3g7h8i9j0}})
    .build();
```

このコードは以下の処理を実行します。
+ 「{{key}}」から「{{new-key}}」にオブジェクトの名前を変更するリクエストを {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケットで作成します。
+ オブジェクトの ETag が 「{{e5f3g7h8i9j0}}」と一致する場合にのみ名前が変更される条件が含まれます。
+ ETag が一致しないか、オブジェクトが存在しない場合、オペレーションは失敗します。

次の例は、AWS SDK for Java を使用して none-match 条件で `RenameObjectRequest` を作成する方法を示しています。

```
String key = "{{key}}";
String newKey = "{{new-key}}";
String noneMatchETag = "{{e5f3g7h8i9j0}}";
RenameObjectRequest renameRequest = RenameObjectRequest.builder()
    .bucket({{amzn-s3-demo-bucket--usw2-az1--x-s3}})
    .key({{newKey}})
    .renameSource({{key}})
    .destinationIfNoneMatch(noneMatchETag)
    .build();
```

このコードは以下の処理を実行します。
+ 「{{key}}」から「{{new-key}}」にオブジェクトの名前を変更するリクエストを {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケットで作成します。
+ 送信先オブジェクトの ETag が「{{e5f3g7h8i9j0}}」と一致しない場合のみ名前が変更されるように、`.destinationIfNoneMatch(noneMatchETag)` を使用する条件が含まれています。

新しい指定された名前のオブジェクトが存在し、指定された ETag がある場合、オペレーションは `412 Precondition Failed` エラーで失敗します。

------
#### [ SDK for Python ]

SDK for Python を使用してオブジェクトの名前を変更できます。これらの例を使用するには、{{ユーザー入力プレースホルダー}}を独自の情報に置き換えます。

次の例は、AWS SDK for Python (Boto3) を使用してオブジェクトの名前を変更する方法を示しています。

```
def basic_rename(bucket, source_key, destination_key):
    try:
        s3.rename_object(
            Bucket={{amzn-s3-demo-bucket--usw2-az1--x-s3}},
            Key={{destination_key}},
            RenameSource=f"{{{source_key}}}"
        )
        print(f"Successfully renamed {{{source_key}}} to {{{destination_key}}}")
    except ClientError as e:
        print(f"Error renaming object: {e}")
```

このコードは以下の処理を実行します。
+ {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケット内のオブジェクトの名前を「{{source\_key}}」から「{{destination\_key}}」に変更します。
+ オブジェクトの名前変更が成功した場合は成功メッセージを出力し、失敗した場合はエラーメッセージを出力します。

次の例は、AWS SDK for Python (Boto3) を使用して `SourceIfMatch` および `DestinationIfNoneMatch` 条件でオブジェクトの名前を変更する方法を示しています。

```
def rename_with_conditions(bucket, source_key, destination_key, source_etag, dest_etag):
    try:
        s3.rename_object(
            Bucket={{amzn-s3-demo-bucket--usw2-az1--x-s3}},
            Key={{destination_key}},
            RenameSource=f"{{{amzn-s3-demo-bucket--usw2-az1--x-s3}}}/{{{source_key}}}",
            SourceIfMatch={{source_ETag}},
            DestinationIfNoneMatch={{dest_ETag}}
        )
        print(f"Successfully renamed {{{source_key}}} to {{{destination_key}}} with conditions")
    except ClientError as e:
        print(f"Error renaming object: {e}")
```

このコードは以下の処理を実行します。
+ 条件付き名前変更オペレーションを実行し、`SourceIfMatch` および `DestinationIfNoneMatch` の 2 つの条件を適用します。これらの条件の組み合わせにより、オブジェクトが変更されていないこと、およびオブジェクトがまだ新しい指定された名前で存在しないことが保証されます。
+ {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケット内のオブジェクトの名前を「{{source\_key}}」から「{{destination\_key}}」に変更します。
+ オブジェクトの名前変更が成功した場合は成功メッセージを出力し、失敗した場合や条件が満たされない場合はエラーメッセージを出力します。

------
#### [ SDK for Rust ]

SDK for Rust を使用してオブジェクトの名前を変更できます。これらの例を使用するには、{{ユーザー入力プレースホルダー}}を独自の情報に置き換えます。

次の例は、SDK for Rust を使用して {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケット内のオブジェクトの名前を変更する方法を示しています。

```
async fn basic_rename_example(client: &Client) -> Result<(), Box<dyn Error>> {
    let response = client
        .rename_object()
        .bucket(" {{amzn-s3-demo-bucket--usw2-az1--x-s3}}")
        .key("{{new-name.txt}}")  // New name/path for the object
        .rename_source("{{old-name.txt}}")  // Original object name/path
        .send()
        .await?;
    Ok(())
}
```

このコードは以下の処理を実行します。
+ {{amzn-s3-demo-bucket--usw2-az1--x-s3}} ディレクトリバケットでオブジェクトの名前を「{{old-name.txt}}」から「{{new-name.txt}}」に変更するリクエストを作成します。
+ 潜在的なエラーを処理するための `Result` タイプを返します。

------

### REST API の使用
<a name="directory-bucket-rename-api"></a>

 REST リクエストを送信してオブジェクトの名前を変更できます。詳細については、「**Amazon S3 API リファレンス」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/API_RenameObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_RenameObject.html)」を参照してください。

### Mountpoint for Amazon S3 の使用
<a name="directory-bucket-rename-api"></a>

 1.19.0 以降のバージョンでは、Mountpoint for Amazon S3 は S3 Express One Zone でオブジェクトの名前変更をサポートしています。Mountpoint の詳細については、「[Mountpoint for Amazon S3 の使用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mountpoint.html)」を参照してください。