> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart: AWS to Scaleway

> Send AWS S3 requests through Cloud Adapter to Scaleway Object Storage.

Scaleway Object Storage speaks an S3-compatible wire protocol, but Cloud Adapter still provides the configured endpoint, identity boundary, name mapping, diagnostics, and documented behavior for the route.

<Frame>
  <img className="block dark:hidden" src="https://mintcdn.com/tensor9/3qwgIru3kCfHriJC/images/diagrams/cloud-adapter-quickstart-aws-to-scaleway-dark.svg?fit=max&auto=format&n=3qwgIru3kCfHriJC&q=85&s=b62959063f793d11564f9fc6068737b5" alt="AWS API requests pass through Tensor9 Cloud Adapter to Scaleway services." width="1100" height="360" data-path="images/diagrams/cloud-adapter-quickstart-aws-to-scaleway-dark.svg" />

  <img className="hidden dark:block" src="https://mintcdn.com/tensor9/3qwgIru3kCfHriJC/images/diagrams/cloud-adapter-quickstart-aws-to-scaleway-light.svg?fit=max&auto=format&n=3qwgIru3kCfHriJC&q=85&s=8ceb7248970cfae89fc4292d685eee90" alt="AWS API requests pass through Tensor9 Cloud Adapter to Scaleway services." width="1100" height="360" data-path="images/diagrams/cloud-adapter-quickstart-aws-to-scaleway-light.svg" />
</Frame>

## What you will prove

You will write, read, and delete one object through the adapter's AWS S3 endpoint, then verify the same object through Scaleway's native S3 endpoint with a separate verification profile.

The [S3 on Scaleway profile](/cloud-adapter/service-catalog/aws/databases-storage/s3#on-scaleway) covers common CRUD, ranges, conditional requests, copy, batch operations, pagination, metadata, multipart upload, and versioning. SSE-KMS, bucket policy, notifications, ACL, and object lock are outside the route profile. Cloud Adapter also preserves S3 rejection of an invalid `Content-MD5` rather than accepting a weaker backend result.

## Prerequisites

* an installed AWS-origin Cloud Adapter endpoint;
* an S3 to Scaleway Object Storage service adapter;
* origin-side AWS credentials for the adapter;
* a separate Scaleway verification profile with read access to the test bucket;
* a selected Scaleway region and native object-storage endpoint;
* AWS CLI v2.

## Set values

```bash theme={null}
export T9_CLOUD_ADAPTER_ENDPOINT="https://adapter.example.test"
export AWS_PROFILE="adapter-test"
export AWS_REGION="us-east-1"
export AWS_REQUEST_CHECKSUM_CALCULATION="WHEN_REQUIRED"
export ORIGIN_BUCKET="adapter-smoke-test"
export SCALEWAY_PROFILE="scaleway-verify"
export SCALEWAY_ENDPOINT="https://s3.fr-par.scw.cloud"
export TARGET_BUCKET="adapter-smoke-test-scaleway"
export TEST_KEY="quickstart/aws-scaleway-$(date +%s).txt"
printf 'hello from S3 to Scaleway\n' > /tmp/cloud-adapter-smoke.txt
```

Use the actual Scaleway regional endpoint selected by your service adapter.

`AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED` keeps this smoke test on the required S3 checksum path. Validate optional flexible-checksum behavior separately if your application enables it.

The commands below use an explicit `--endpoint-url`. To route every S3 client in the process instead, set `AWS_ENDPOINT_URL_S3="$T9_CLOUD_ADAPTER_ENDPOINT"` and omit the command-level override.

## Write through Cloud Adapter

```bash theme={null}
aws s3api put-object \
  --bucket "$ORIGIN_BUCKET" --key "$TEST_KEY" \
  --body /tmp/cloud-adapter-smoke.txt \
  --content-type text/plain \
  --metadata quickstart=aws-to-scaleway \
  --endpoint-url "$T9_CLOUD_ADAPTER_ENDPOINT" \
  --profile "$AWS_PROFILE" --region "$AWS_REGION"

aws s3api head-object \
  --bucket "$ORIGIN_BUCKET" --key "$TEST_KEY" \
  --endpoint-url "$T9_CLOUD_ADAPTER_ENDPOINT" --profile "$AWS_PROFILE" --region "$AWS_REGION"

aws s3api get-object \
  --bucket "$ORIGIN_BUCKET" --key "$TEST_KEY" \
  --endpoint-url "$T9_CLOUD_ADAPTER_ENDPOINT" --profile "$AWS_PROFILE" --region "$AWS_REGION" \
  /tmp/cloud-adapter-origin.txt
```

## Verify natively in Scaleway

```bash theme={null}
aws s3api head-object \
  --bucket "$TARGET_BUCKET" --key "$TEST_KEY" \
  --endpoint-url "$SCALEWAY_ENDPOINT" --profile "$SCALEWAY_PROFILE" --region fr-par

aws s3api get-object \
  --bucket "$TARGET_BUCKET" --key "$TEST_KEY" \
  --endpoint-url "$SCALEWAY_ENDPOINT" --profile "$SCALEWAY_PROFILE" --region fr-par \
  /tmp/cloud-adapter-target.txt

cmp /tmp/cloud-adapter-smoke.txt /tmp/cloud-adapter-origin.txt
cmp /tmp/cloud-adapter-smoke.txt /tmp/cloud-adapter-target.txt
```

The verification profile is intentionally distinct from the origin profile. A successful native read proves target placement and bytes, not origin authentication.

## Exercise integrity and error behavior

Request a missing key with `get-object` and confirm an AWS-shaped not-found response. S3 can return permission denied instead when the caller lacks permission to establish that the object is missing. If your workload supplies `Content-MD5`, add a test with a correct digest and a deliberate bad digest. The bad digest should be rejected before you rely on that integrity behavior.

Do not begin with SSE-KMS or bucket-policy tests; they are outside this route profile.

## Clean up

```bash theme={null}
aws s3api delete-object \
  --bucket "$ORIGIN_BUCKET" --key "$TEST_KEY" \
  --endpoint-url "$T9_CLOUD_ADAPTER_ENDPOINT" --profile "$AWS_PROFILE" --region "$AWS_REGION"

aws s3api head-object \
  --bucket "$TARGET_BUCKET" --key "$TEST_KEY" \
  --endpoint-url "$SCALEWAY_ENDPOINT" --profile "$SCALEWAY_PROFILE" --region fr-par
```

The current object should no longer be readable. Versioned or soft-delete-enabled targets can retain prior versions or recovery state; use an unversioned disposable target for this quickstart or remove the created version explicitly. Keep bucket deletion separate. A newly configured target bucket is empty; Cloud Adapter does not silently copy pre-existing objects or versions.

## Before production

Test the exact Scaleway region, multipart sizes, ranges, conditionals, copy behavior, pagination, versioning, retry behavior, and quotas your application uses. Establish data migration and rollback plans separately from endpoint cutover. Preserve the origin and target request identifiers exposed by your application SDK in structured, redacted logs.
