Skip to content

[BUG] repository-s3: S3 Outposts PutObject fails with 501 after #20345 routing fix due to CRC64NVME checksum header #21190

@DeleOladokunTR

Description

@DeleOladokunTR

Describe the bug

PR #20345 fixed S3 Outposts endpoint routing so the repository-s3 plugin can now correctly reach the Outposts S3 data plane. However, actual snapshot writes still fail with HTTP 501 "A header you provided implies functionality that is not implemented."

Root cause: AWS SDK Java v2 bundled in repository-s3 3.5.0 defaults requestChecksumCalculation to supported, which automatically appends a x-amz-checksum-crc64nvme header to all PutObject requests. S3 Outposts firmware does not implement CRC64NVME and rejects these requests with 501.

Workarounds attempted:

  • Setting AWS_REQUEST_CHECKSUM_CALCULATION=when_required (env var) — no effect
  • Setting -Daws.requestChecksumCalculation=when_required (JVM property) — blocked by OpenSearch security manager

Result: S3 Outposts is still not usable as a snapshot repository in OpenSearch 3.5.0 despite PR #20345 being merged.

Related component

No response

To Reproduce

  1. Deploy OpenSearch 3.5.0 with repository-s3 plugin on a Kubernetes cluster running on an AWS Outpost rack.

  2. Register a snapshot repository using an S3 Outposts access point ARN:

PUT /_snapshot/outposts-repo?verify=false
{
"type": "s3",
"settings": {
"bucket": "arn:aws:s3-outposts:us-east-1::outpost//accesspoint/",
"region": "us-east-1",
"base_path": "snapshots"
}
}

→ Returns {"acknowledged":true} (routing fix from #20345 works)

  1. Trigger any snapshot:

PUT /_snapshot/outposts-repo/test-snap?wait_for_completion=true
{
"ignore_unavailable": true,
"include_global_state": false
}

→ Fails with 501 (see error message in Additional Details below)

Expected behavior

Snapshot writes to S3 Outposts access point ARNs should succeed. The SDK should either default to a checksum algorithm supported by S3 Outposts (e.g. CRC32), or the repository-s3 plugin should expose a setting such as request_checksum_calculation to let operators override the SDK default — for example:

s3.client.default.request_checksum_calculation: when_required

Additional Details

Plugin version: repository-s3 3.5.0 (bundles AWS SDK Java v2.32.29)

Exact error message:
Unable to upload object [snapshots/meta-.dat] using a single upload
A header you provided implies functionality that is not implemented
(Service: S3, Status Code: 501, Request ID: ...)

Environment:

  • OS: Bottlerocket OS 1.55.0 (aws-k8s-1.31)
  • OpenSearch version: 3.5.0
  • Deployment: Kubernetes (EKS on AWS Outpost rack)
  • Node instances: r5.xlarge / c5.xlarge (Nitro-based)
  • S3 target: S3 Outposts access point ARN

Related issues: #19897, #19900
Related PR: #20345 (introduced routing fix, but write path remains broken)

Suggested fix: Expose request_checksum_calculation as a repository-s3 client setting, defaulting to when_required for Outposts-style endpoints, or document a supported workaround.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    🆕 New

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions