public static async Task Main()
// Specify the AWS Region where your buckets are located if it is
// different from the AWS Region of the default user.
IAmazonS3 s3Client = new AmazonS3Client();
// Remember to change these values to refer to your Amazon S3 objects.
string sourceBucketName = "doc-example-bucket1";
string destinationBucketName = "doc-example-bucket2";
string sourceObjectKey = "testfile.txt";
string destinationObjectKey = "testfilecopy.txt";
Console.WriteLine($"Copying
{
sourceObjectKey} from
{
sourceBucketName} to ");
Console.WriteLine($"
{
destinationBucketName} as
{
destinationObjectKey}");
var response = await CopyingObjectAsync(
s3Client,
sourceObjectKey,
destinationObjectKey,
sourceBucketName,
destinationBucketName);
if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
Console.WriteLine("\nCopy complete.");
/// <summary>
/// This method calls the AWS SDK for .NET to copy an
/// object from one Amazon S3 bucket to another.
/// </summary>
/// <param name="client">The Amazon S3 client object.</param>
/// <param name="sourceKey">The name of the object to be copied.</param>
/// <param name="destinationKey">The name under which to save the copy.</param>
/// <param name="sourceBucketName">The name of the Amazon S3 bucket
/// where the file is located now.</param>
/// <param name="destinationBucketName">The name of the Amazon S3
/// bucket where the copy should be saved.</param>
/// <returns>Returns a CopyObjectResponse object with the results from
/// the async call.</returns>
public static async Task<CopyObjectResponse> CopyingObjectAsync(
IAmazonS3 client,
string sourceKey,
string destinationKey,
string sourceBucketName,
string destinationBucketName)
var response = new CopyObjectResponse();
var request = new CopyObjectRequest
SourceBucket = sourceBucketName,
SourceKey = sourceKey,
DestinationBucket = destinationBucketName,
DestinationKey = destinationKey,
response = await client.CopyObjectAsync(request);
catch (AmazonS3Exception ex)
Console.WriteLine($"Error copying object: '
{
ex.Message}'");
return response;
###############################################################################
# function errecho
# This function outputs everything sent to it to STDERR (standard error output).
###############################################################################
function errecho() {
printf "%s\n" "$*" 1>&2
###############################################################################
# function copy_item_in_bucket
# This function creates a copy of the specified file in the same bucket.
# Parameters:
# $1 - The name of the bucket to copy the file from and to.
# $2 - The key of the source file to copy.
# $3 - The key of the destination file.
# Returns:
# 0 - If successful.
# 1 - If it fails.
###############################################################################
function copy_item_in_bucket() {
local bucket_name=$1
local source_key=$2
local destination_key=$3
local response
response=$(aws s3api copy-object \
--bucket "$bucket_name" \
--copy-source "$bucket_name/$source_key" \
--key "$destination_key")
# shellcheck disable=SC2181
if [[ $? -ne 0 ]]; then
errecho "ERROR: AWS reports s3api copy-object operation failed.\n$response"
return 1
bool AwsDoc::S3::CopyObject(const Aws::String &objectKey, const Aws::String &fromBucket, const Aws::String &toBucket,
const Aws::Client::ClientConfiguration &clientConfig) {
Aws::S3::S3Client client(clientConfig);
Aws::S3::Model::CopyObjectRequest request;
request.WithCopySource(fromBucket + "/" + objectKey)
.WithKey(objectKey)
.WithBucket(toBucket);
Aws::S3::Model::CopyObjectOutcome outcome = client.CopyObject(request);
if (!outcome.IsSuccess()) {
const Aws::S3::S3Error &err = outcome.GetError();
std::cerr << "Error: CopyObject: " <<
err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
else {
std::cout << "Successfully copied " << objectKey << " from " << fromBucket <<
" to " << toBucket << "." << std::endl;
return outcome.IsSuccess();
"CopyObjectResult": {
"LastModified": "2015-11-10T01:07:25.000Z",
"ETag": "\"589c8b79c230a6ecd5a7e1d040a9a030\""
"VersionId": "YdnYvTCVDqRRFA.NFJjy36p0hxifMlkA"
// BucketBasics encapsulates the Amazon Simple Storage Service (Amazon S3) actions
// used in the examples.
// It contains S3Client, an Amazon S3 service client that is used to perform bucket
// and object actions.
type BucketBasics struct {
S3Client *s3.Client
// CopyToBucket copies an object in a bucket to another bucket.
func (basics BucketBasics) CopyToBucket(sourceBucket string, destinationBucket string, objectKey string) error {
_, err := basics.S3Client.CopyObject(context.TODO(), &s3.CopyObjectInput{
Bucket: aws.String(destinationBucket),
CopySource: aws.String(fmt.Sprintf("%v/%v", sourceBucket, objectKey)),
Key: aws.String(objectKey),
if err != nil {
log.Printf("Couldn't copy object from %v:%v to %v:%v. Here's why: %v\n",
sourceBucket, objectKey, destinationBucket, objectKey, err)
return err
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.CopyObjectRequest;
import software.amazon.awssdk.services.s3.model.CopyObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
* Before running this Java V2 code example, set up your development
* environment, including your credentials.
* For more information, see the following documentation topic:
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
public class CopyObject {
public static void main(String[] args) {
final String usage = """
Usage:
<objectKey> <fromBucket> <toBucket>
Where:
objectKey - The name of the object (for example, book.pdf).
fromBucket - The S3 bucket name that contains the object (for example, bucket1).
toBucket - The S3 bucket to copy the object to (for example, bucket2).
if (args.length != 3) {
System.out.println(usage);
System.exit(1);
String objectKey = args[0];
String fromBucket = args[1];
String toBucket = args[2];
System.out.format("Copying object %s from bucket %s to %s\n", objectKey, fromBucket, toBucket);
Region region = Region.US_EAST_1;
S3Client s3 = S3Client.builder()
.region(region)
.build();
copyBucketObject(s3, fromBucket, objectKey, toBucket);
s3.close();
public static String copyBucketObject(S3Client s3, String fromBucket, String objectKey, String toBucket) {
CopyObjectRequest copyReq = CopyObjectRequest.builder()
.sourceBucket(fromBucket)
.sourceKey(objectKey)
.destinationBucket(toBucket)
.destinationKey(objectKey)
.build();
try {
CopyObjectResponse copyRes = s3.copyObject(copyReq);
return copyRes.copyObjectResult().toString();
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
return "";
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.model.CopyObjectRequest;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.CompletedCopy;
import software.amazon.awssdk.transfer.s3.model.Copy;
import software.amazon.awssdk.transfer.s3.model.CopyRequest;
import java.util.UUID;
public String copyObject(S3TransferManager transferManager, String bucketName,
String key, String destinationBucket, String destinationKey) {
CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder()
.sourceBucket(bucketName)
.sourceKey(key)
.destinationBucket(destinationBucket)
.destinationKey(destinationKey)
.build();
CopyRequest copyRequest = CopyRequest.builder()
.copyObjectRequest(copyObjectRequest)
.build();
Copy copy = transferManager.copy(copyRequest);
CompletedCopy completedCopy = copy.completionFuture().join();
return completedCopy.response().copyObjectResult().eTag();
import { S3Client, CopyObjectCommand } from "@aws-sdk/client-s3";
const client = new S3Client({});
export const main = async () => {
const command = new CopyObjectCommand({
CopySource: "SOURCE_BUCKET/SOURCE_OBJECT_KEY",
Bucket: "DESTINATION_BUCKET",
Key: "NEW_OBJECT_KEY",
try {
const response = await client.send(command);
console.log(response);
} catch (err) {
console.error(err);
var encodedUrl = ""
try {
encodedUrl = URLEncoder.encode("$fromBucket/$objectKey", StandardCharsets.UTF_8.toString())
} catch (e: UnsupportedEncodingException) {
println("URL could not be encoded: " + e.message)
val request = CopyObjectRequest {
copySource = encodedUrl
bucket = toBucket
key = objectKey
S3Client { region = "us-east-1" }.use { s3 ->
s3.copyObject(request)
$this->s3client->copyObject([
'Bucket' => $this->bucketName,
'CopySource' => "$this->bucketName/$fileName",
'Key' => "$folder/$fileName-copy",
echo "Copied $fileName to $folder/$fileName-copy.\n";
} catch (Exception $exception) {
echo "Failed to copy $fileName with error: " . $exception->getMessage();
exit("Please fix error with object copying before continuing.");
def __init__(self, s3_object):
:param s3_object: A Boto3 Object resource. This is a high-level resource in Boto3
that wraps object actions in a class-like structure.
self.object = s3_object
self.key = self.object.key
def copy(self, dest_object):
Copies the object to another bucket.
:param dest_object: The destination object initialized with a bucket and key.
This is a Boto3 Object resource.
dest_object.copy_from(
CopySource={"Bucket": self.object.bucket_name, "Key": self.object.key}
dest_object.wait_until_exists()
logger.info(
"Copied object from %s:%s to %s:%s.",
self.object.bucket_name,
self.object.key,
dest_object.bucket_name,
dest_object.key,
except ClientError:
logger.exception(
"Couldn't copy object from %s/%s to %s/%s.",
self.object.bucket_name,
self.object.key,
dest_object.bucket_name,
dest_object.key,
raise
attr_reader :source_object
# @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for
# copy actions.
def initialize(source_object)
@source_object = source_object
# Copy the source object to the specified target bucket and rename it with the target key.
# @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied.
# @param target_object_key [String] The key to give the copy of the object.
# @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil.
def copy_object(target_bucket, target_object_key)
@source_object.copy_to(bucket: target_bucket.name, key: target_object_key)
target_bucket.object(target_object_key)
rescue Aws::Errors::ServiceError => e
puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}"
# Example usage:
def run_demo
source_bucket_name = "doc-example-bucket1"
source_key = "my-source-file.txt"
target_bucket_name = "doc-example-bucket2"
target_key = "my-target-file.txt"
source_bucket = Aws::S3::Bucket.new(source_bucket_name)
wrapper = ObjectCopyWrapper.new(source_bucket.object(source_key))
target_bucket = Aws::S3::Bucket.new(target_bucket_name)
target_object = wrapper.copy_object(target_bucket, target_key)
return unless target_object
puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key}."
run_demo if $PROGRAM_NAME == __FILE__
# Wraps Amazon S3 object actions.
class ObjectCopyEncryptWrapper
attr_reader :source_object
# @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for
# copy actions.
def initialize(source_object)
@source_object = source_object
# Copy the source object to the specified target bucket, rename it with the target key, and encrypt it.
# @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied.
# @param target_object_key [String] The key to give the copy of the object.
# @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil.
def copy_object(target_bucket, target_object_key, encryption)
@source_object.copy_to(bucket: target_bucket.name, key: target_object_key, server_side_encryption: encryption)
target_bucket.object(target_object_key)
rescue Aws::Errors::ServiceError => e
puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}"
# Example usage:
def run_demo
source_bucket_name = "doc-example-bucket1"
source_key = "my-source-file.txt"
target_bucket_name = "doc-example-bucket2"
target_key = "my-target-file.txt"
target_encryption = "AES256"
source_bucket = Aws::S3::Bucket.new(source_bucket_name)
wrapper = ObjectCopyEncryptWrapper.new(source_bucket.object(source_key))
target_bucket = Aws::S3::Bucket.new(target_bucket_name)
target_object = wrapper.copy_object(target_bucket, target_key, target_encryption)
return unless target_object
puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key} and "\
"encrypted the target with #{target_object.server_side_encryption} encryption."
run_demo if $PROGRAM_NAME == __FILE__
target_key: &str,
) -> Result<CopyObjectOutput, SdkError<CopyObjectError>> {
let mut source_bucket_and_object: String = "".to_owned();
source_bucket_and_object.push_str(bucket_name);
source_bucket_and_object.push('/');
source_bucket_and_object.push_str(object_key);
client
.copy_object()
.copy_source(source_bucket_and_object)
.bucket(bucket_name)
.key(target_key)
.send()
.await
iv_bucket = iv_dest_bucket
iv_key = iv_dest_object
iv_copysource = |{ iv_src_bucket }/{ iv_src_object }|
MESSAGE 'Object copied to another bucket.' TYPE 'I'.
CATCH /aws1/cx_s3_nosuchbucket.
MESSAGE 'Bucket does not exist.' TYPE 'E'.
CATCH /aws1/cx_s3_nosuchkey.
MESSAGE 'Object key does not exist.' TYPE 'E'.
ENDTRY.
public func copyFile(from sourceBucket: String, name: String, to destBucket: String) async throws {
let srcUrl = ("\(sourceBucket)/\(name)").addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)
let input = CopyObjectInput(
bucket: destBucket,
copySource: srcUrl,
key: name
_ = try await client.copyObject(input: input)