General trade-offs
Compare adapters within the same permitted target environment. Record that environment before choosing the candidate backends: an Azure result does not qualify a Google Cloud deployment, even when the two mappings expose the same origin API. Each service’s trade-off article lists its backends under environment headings and explains their workload fit.Separate the contract from qualification
Customers do not need to rediscover the adapter’s contract by trial and error. Start from the profile and use an unexpected result as a focused debugging case. Workload qualification adds facts that a general profile cannot know, such as your key distribution, network placement and latency budget.
Qualify the workload separately
Write an acceptance sheet for the actual application before testing. Choose numbers from its requirements and measured baseline, not from a generic example. Use the same sheet for each candidate in the selected environment.
After a small check succeeds, add failure cases relevant to the chosen contract: an adapter restart, a lease expiry, an ambiguous commit, a backend failover or an isolated restore. There is no requirement to perform every possible fault on every service. Choose the cases that could violate your application’s requirements.
Record the adapter version, exact backend, region, redacted configuration and workload with each result. A latency result from a local endpoint is not automatically a result for a deployed network path. A restore test without adapter-maintained metadata may omit part of the application state.
Google Cloud
S3 to Cloud Storage: first object check
This check writes a small object through the S3 API, reads it through both APIs and removes it. It verifies one object path; it does not establish version-history, retention, notification or workload-performance behavior. You need AWS CLI v2, Python with Boto3,gcloud, an origin-side test credential profile authorized by the adapter, and a Google identity configured for the runtime. Prepare a disposable bucket mapping using Configuration Examples. The native bucket and origin-facing bucket name may differ. The adapter’s identity and your native verification identity are separate.
1
Install the CLI and inspect the pair
Install the CLI if needed:Inspect the directed profile without creating target resources:Read the relevant S3 operations and behavior. Profile inspection describes the mapping; it does not authenticate the runtime or prove that a write occurred.
2
Start one local adapter
Configure the Google runtime identity and target coordinates from the configuration example, then leave this command running in its own terminal:Copy the listening endpoint into a second terminal. Keep this test local unless you deliberately configure remote access and endpoint authentication.
3
Choose process-wide or client-specific routing
Set the printed endpoint and your dedicated origin credential profile:
AWS_ENDPOINT_URL_S3 routes S3 clients that support the standard setting in this process and child processes. It does not reroute unrelated AWS services. See the AWS service-specific endpoint reference for SDK support and precedence.Alternatively, pass the endpoint to one client, as the next script does. This makes the destination explicit even if process-wide endpoint configuration is absent. Both methods still use normal request signing; target-cloud credentials belong to the adapter, not the S3 client.4
Write and read one disposable object
This example uses the origin bucket The assertions state the expected observation; they are not a captured test result. For details of client-specific routing, see Boto3’s
tradeoffs-media, mapped to the Google Cloud Storage bucket tradeoffs-media-gcs, and the object key tradeoffs/check.txt. Substitute your dedicated test bucket names throughout; native bucket names must be globally unique. Confirm that the object key is unused so the test cannot overwrite existing data.Save this script as check-object.py, replace the endpoint with the value printed by Tensor9, then run python3 check-object.py:endpoint_url parameter.5
Verify the target independently
Read the native object using your verification identity:Expect the body
backend-choice-check followed by a newline, in the configured project and bucket. Compare the full native resource identity with the mapping; the object name alone does not identify its project and bucket. Do not require the provider’s native ETag to equal the S3-facing ETag; compare the property whose fidelity the application actually requires.6
Remove the test object and stop the process
For a disposable, non-versioned bucket without retention or legal hold:Expect the final operation to report not found. Confirm the native current object is absent too. If the bucket uses versioning, deletion may leave prior versions or a delete marker; follow its ownership and cleanup policy instead of treating this as permanent removal of every version.Press Control-C in the adapter terminal after cleanup. Remove only test resources you created. Preserve redacted evidence first if an assertion or cleanup step fails.
If the object check fails
Use Debugging Your Adapters and Explaining SDK Requests.
x-t9-explain: true executes the request and records an explanation; it is not a dry run. Add request controls before signing, and treat reports as potentially sensitive diagnostic data. A report receipt identifies evidence to retrieve, not proof that all asynchronous work completed.