Skip to main content
Check each candidate adapter at two scales: a small, understandable example and your application’s real workload. Use the same acceptance criteria when comparing the results. The service profile defines the adapter contract. Your tests establish that each deployment and application use that contract correctly. For a first experiment, use the S3-to-Google-Cloud-Storage steps below. For database atomicity or queue delivery, use the worked checks in DynamoDB and SQS.

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.
The adapter runs locally, but the target resources are real Google Cloud resources. Use a dedicated test bucket and budget. Stopping the process does not remove objects or stop all target-cloud charges.
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 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:
The assertions state the expected observation; they are not a captured test result. For details of client-specific routing, see Boto3’s 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.

Microsoft Azure

DynamoDB to provisioned Cosmos DB

Use the Azure DynamoDB comparison and provisioned Cosmos DB configuration example to prepare a disposable table. Record the capacity owner, provisioned request units, partition design and indexes before applying traffic. Verify your application’s conditional writes and reads first, then measure its key distribution and request-unit demand. A successful point write does not establish multi-item atomicity or adequate capacity for a hot partition.

SQS to Service Bus or PostgreSQL

Compare the candidates in SQS on Microsoft Azure. Apply the same send, receive, acknowledgement and redelivery assertions to each. Inspect delivery state using that backend’s native tooling; a Service Bus observation is not evidence about a PostgreSQL queue. For the complete database-and-queue workflow, use the Azure order-processing example.

Private Kubernetes

PostgreSQL-backed data and queues

Use the private Kubernetes example to compare separate database instances with shared physical capacity. Record operator, storage and backup ownership as well as application correctness. Test queue pressure alongside database traffic and restore both application data and delivery state before accepting the deployment. A ready database pod is not the recovery completion criterion; the application must resume work without losing committed results or repeating external effects.

Next steps

Finish with a release decision

The decision record should name the backend, accepted differences, operating owners, evidence reviewed, workload checks performed and conditions that require reconsideration. If a requirement is unmet, identify whether the cause is configuration, an application assumption, a defect or a different mapping contract before switching backends. Keep a migration and rollback plan with that record. Changing the endpoint does not transfer data, drain messages or reverse writes already accepted by the new target.