AWS S3 - Producer Operations

Common Pattern

Most producer operations follow the same pattern: set the operation parameter on the endpoint URI, optionally set a key via the CamelAwsS3Key header, and send the exchange.

  • Java

  • XML

  • YAML

from("direct:start")
    .setHeader("CamelAwsS3Key", constant("camelKey"))
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObject")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getObject"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAwsS3Key
            constant: "camelKey"
        - to:
            uri: aws2-s3://mycamelbucket
            parameters:
              amazonS3Client: "#amazonS3Client"
              operation: getObject
        - to:
            uri: mock:result

Bucket-level operations ( listBuckets , deleteBucket , listObjects , createBucket , etc.) don’t require a key header — just set the operation parameter.

Operations Reference

Operation Description Notes

listBuckets

List all buckets for this account in this region.

createBucket

Create a new bucket.

deleteBucket

Delete a bucket.

headBucket

Check if a bucket exists and you have permission to access it.

listObjects

List objects in a bucket.

getObject

Get a single object. Returns an S3Object instance.

getObjectRange

Get a byte range from an object.

See getObjectRange

deleteObject

Delete an object.

deleteObjects

Delete multiple objects in a single request.

See deleteObjects

copyObject

Copy an object from one bucket to another.

See copyObject

headObject

Retrieve metadata from an object without returning the object itself.

uploadObject (default)

Upload a file to S3 based on the body content.

See Upload (Single Upload)

multipartUpload

Upload a large file using multipart upload.

See Multipart Upload

createDownloadLink

Generate a presigned download URL.

See createDownloadLink

createUploadLink

Generate a presigned upload URL.

Requires accessKey , secretKey , region

restoreObject

Restore an archived object from Glacier storage.

See restoreObject

getObjectTagging

Get the tags of an object.

putObjectTagging

Set tags on an object.

Requires Map<String, String> via CamelAwsS3ObjectTags header

deleteObjectTagging

Delete all tags from an object.

getObjectAcl

Get the ACL of an object.

putObjectAcl

Set the ACL on an object.

Use CamelAwsS3CannedAcl header (e.g., PublicRead )

getBucketTagging

Get the tags of a bucket.

putBucketTagging

Set tags on a bucket.

Requires Map<String, String> via CamelAwsS3BucketTags header

deleteBucketTagging

Delete all tags from a bucket.

getBucketVersioning

Get the versioning configuration of a bucket.

putBucketVersioning

Set the versioning configuration of a bucket.

Use CamelAwsS3VersioningStatus header ( Enabled or Suspended )

getBucketPolicy

Get the bucket policy as a JSON string.

putBucketPolicy

Set a bucket policy.

See putBucketPolicy

deleteBucketPolicy

Delete the bucket policy.

Operation Details

This section covers operations that require special configuration beyond the common pattern.

Upload (Single Upload)

Upload a file to S3 based on the body content:

  • Java

  • XML

  • YAML

from("direct:start")
    .setHeader("CamelAwsS3Key", constant("camel.txt"))
    .setBody(constant("Camel rocks!"))
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAwsS3Key"><constant>camel.txt</constant></setHeader>
  <setBody><constant>Camel rocks!</constant></setBody>
  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAwsS3Key
            constant: "camel.txt"
        - setBody:
            constant: "Camel rocks!"
        - to:
            uri: aws2-s3://mycamelbucket
            parameters:
              amazonS3Client: "#amazonS3Client"
        - to:
            uri: mock:result

Multipart Upload

For large files, use multipart upload with configurable part size:

from("direct:start")
    .setHeader("CamelAwsS3Key", constant("large-file.txt"))
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&multiPartUpload=true&autoCreateBucket=true&partSize=1048576")
    .to("mock:result");

copyObject

Copy an object between buckets using destination headers:

  • Java

  • XML

  • YAML

from("direct:start")
    .setHeader("CamelAwsS3BucketDestinationName", constant("camelDestinationBucket"))
    .setHeader("CamelAwsS3Key", constant("camelKey"))
    .setHeader("CamelAwsS3DestinationKey", constant("camelDestinationKey"))
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=copyObject")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAwsS3BucketDestinationName"><constant>camelDestinationBucket</constant></setHeader>
  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
  <setHeader name="CamelAwsS3DestinationKey"><constant>camelDestinationKey</constant></setHeader>
  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=copyObject"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAwsS3BucketDestinationName
            constant: "camelDestinationBucket"
        - setHeader:
            name: CamelAwsS3Key
            constant: "camelKey"
        - setHeader:
            name: CamelAwsS3DestinationKey
            constant: "camelDestinationKey"
        - to:
            uri: aws2-s3://mycamelbucket
            parameters:
              amazonS3Client: "#amazonS3Client"
              operation: copyObject
        - to:
            uri: mock:result

This copies the object camelKey from mycamelbucket to camelDestinationBucket with the key camelDestinationKey .

getObjectRange

Download a specific byte range from an object using the CamelAwsS3RangeStart and CamelAwsS3RangeEnd headers:

from("direct:start")
    .setHeader("CamelAwsS3Key", constant("camelKey"))
    .setHeader("CamelAwsS3RangeStart", constant("0"))
    .setHeader("CamelAwsS3RangeEnd", constant("9"))
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectRange")
    .to("mock:result");

This returns the first 10 bytes (0 to 9) of the object.

Generate a presigned download URL. Parameters accessKey , secretKey , and region are mandatory for this operation if the S3 client is autowired from the registry:

from("direct:start")
    .setHeader("CamelAwsS3Key", constant("camelKey"))
    .to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy&region=region&operation=createDownloadLink")
    .to("mock:result");
If checksum validations are enabled, the URL will no longer be browser compatible because it adds a signed header that must be included in the HTTP request.

The same pattern applies to createUploadLink .

deleteObjects

Delete multiple objects in a single request. Requires a List<String> of keys via the CamelAwsS3KeysToDelete header:

from("direct:start")
    .process(exchange -> {
        List<String> keys = List.of("key1", "key2", "key3");
        exchange.getIn().setHeader("CamelAwsS3KeysToDelete", keys);
    })
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObjects")
    .to("mock:result");

restoreObject

Restore an archived object from Glacier storage:

from("direct:start")
    .setHeader("CamelAwsS3Key", constant("camelKey"))
    .setHeader("CamelAwsS3RestoreDays", constant(1))
    .setHeader("CamelAwsS3RestoreTier", constant("Expedited"))
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=restoreObject")
    .to("mock:result");

putBucketPolicy

Set a bucket policy using a JSON policy string via the CamelAwsS3BucketPolicy header:

from("direct:start")
    .process(exchange -> {
        String policy = """
            {"Version": "2012-10-17", "Statement": [{"Effect": "Allow", \
            "Principal": "*", "Action": "s3:GetObject", \
            "Resource": "arn:aws:s3:::mycamelbucket/*"}]}""";
        exchange.getIn().setHeader("CamelAwsS3BucketPolicy", policy);
    })
    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketPolicy")
    .to("mock:result");

Minimum IAM Permissions

Producer

For making the producer work, you’ll need at least PutObject and ListBuckets permissions:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::*/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

If using bucket auto-creation, add the CreateBucket permission:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::*/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:CreateBucket",
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

Consumer

For making the consumer work, you’ll need at least GetObject, ListBucket, and DeleteObject permissions:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::*/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::*/*"
        }
    ]
}

By default, the consumer uses the deleteAfterRead option, meaning the object will be deleted once consumed, which is why the DeleteObject permission is required.