

Overview
When you deploy an application to Google Cloud customer environments using Tensor9 BYOC:- Customer appliances run entirely within the customer’s Google Cloud project
- Your control plane orchestrates deployments from your dedicated Tensor9 BYOC AWS account
- Service account impersonation enables your control plane to manage customer appliances with customer-approved permissions
- Service equivalents compile your origin stack into Google Cloud-native resources
Prerequisites
Before deploying appliances to Google Cloud customer environments, ensure:Your control plane
- Dedicated AWS account for your Tensor9 BYOC control plane
- Control plane installed - See Installing Tensor9 BYOC
- Origin stack published - Your application infrastructure defined and uploaded
Customer Google Cloud project
Your customers must provide:- Google Cloud project where the appliance will be deployed
- Service accounts configured for the four-phase permissions model (Install, Steady-state, Deploy, Operate)
- VPC and networking configured according to their requirements
- Sufficient API quotas for your application’s resource needs
- Google Cloud region where they want the appliance deployed
Your development environment
- gcloud CLI installed and configured
- Terraform or OpenTofu (if using Terraform origin stacks)
- Docker (if deploying container-based applications)
How Google Cloud appliances work
Google Cloud appliances are deployed using Google Cloud-native services orchestrated by your Tensor9 BYOC control plane.Customer provisions service accounts
You create a release for the customer appliance
Customer grants deploy access
You deploy the release
- VPCs, subnets, firewall rules
- Compute Engine instances, GKE clusters, Cloud Functions
- Cloud SQL databases, Cloud Storage buckets, Memorystore clusters
- Cloud Logging log sinks, service accounts, Cloud DNS records
- Any other Google Cloud resources defined in your origin stack
Steady-state observability begins
Service adapters
When you deploy an origin stack to Google Cloud customer environments, Tensor9 BYOC automatically compiles resources from other cloud providers to their Google Cloud equivalents. This allows you to maintain a single origin stack and deploy it across different customer environments.How service equivalents work
When compiling a deployment stack for Google Cloud:- AWS resources are compiled - AWS resources are converted to their Google Cloud equivalents
- Generic resources are adapted - Cloud-agnostic resources (like Kubernetes manifests) are adapted for Google Cloud
- Configuration is adjusted - Resource configurations are modified to match Google Cloud conventions and best practices
Common service equivalents
Which AWS services reach Google Cloud, what each becomes, and the tier it lands at are maintained in one place rather than repeated per form factor: see service adapters and the generated Service Catalog.Example: Compiling an AWS origin stack
If your origin stack defines a Lambda function:Permissions model
Google Cloud appliances use a four-phase service account permissions model that balances operational capability with customer control.The four permission phases
Service account structure
Each service account is created in the customer’s Google Cloud project with IAM policies that allow your control plane to impersonate it. Example: Deploy service account with conditional access- The
deploy_accesslabel is set to “enabled” - The current time is within the allowed window
- Can read observability data from the appliance’s project, which holds only that appliance’s resources
- Cannot modify, delete, or terminate any resources
- Cannot change IAM policies
Deployment workflow with service accounts
Customer grants deploy access
deploy_access label to “enabled” and defining a time window. This can be done manually or through automated approval workflows.You execute deployment locally
Controller impersonates Deploy service account and creates resources
Deploy access expires
Networking
Google Cloud appliances use an isolated networking architecture with a Tensor9 BYOC controller that manages communication with your control plane.Tensor9 BYOC controller VPC
When an appliance is deployed, Tensor9 BYOC creates an isolated VPC containing the Tensor9 BYOC controller. This VPC is configured with:- Cloud NAT: Provides outbound internet connectivity
- Route to control plane: Establishes a secure channel to your Tensor9 BYOC control plane
- No ingress firewall rules: The controller VPC does not accept inbound connections - all communication is outbound-only
- Receive deployments: Deployment stacks are pushed from your control plane to the appliance
- Configure observability pipeline: Set up log, metric, and trace forwarding to your observability sink
- Receive operational commands: Execute remote operations initiated from your control plane
Outbound-only security model
The Tensor9 BYOC controller in your customer’s appliance is designed to only make outbound connections and not require ingress ports to be opened in your customer’s network perimeter:Application VPC topology
Your application resources run in their own VPC(s), completely separate from the Tensor9 BYOC controller VPC. The application VPC topology is defined entirely by your origin stack - whatever VPC resources you define in your origin stack will be deployed into the appliance. Example: Application VPC with internet-facing load balancer If your origin stack defines an AWS VPC with public subnets and a load balancer, that topology will compile to Google Cloud VPC resources in the customer’s appliance:Resource naming and labeling
All Google Cloud resources should incorporate the@namespace annotated variable to ensure uniqueness across multiple customer appliances.
Parameterization pattern
This page usesmax_size=16 because service account IDs cap at 30 characters, which a longer namespace would exhaust.
Labeling resources
Label resources with whatever your own tooling needs. Tensor9 BYOC does not require any particular label: each appliance gets its own Google Cloud project, so telemetry and permissions are already scoped to it.- Scopes IAM role bindings to a single appliance
- Isolates Cloud Logging and Cloud Monitoring telemetry by appliance
- Helps customers track costs per appliance
- Lets Tensor9 BYOC controllers discover the appliance’s resources
Observability
Google Cloud appliances provide observability through Cloud Logging, Cloud Monitoring, and Cloud Trace.Cloud Logging
Application and infrastructure logs flow to Cloud Logging:Cloud Monitoring
Infrastructure metrics are automatically collected:- Compute Engine: CPU utilization, network I/O, disk I/O
- Cloud SQL: Database connections, query latency, storage usage
- Cloud Functions: Invocations, execution time, errors
- GKE: Node CPU/memory, pod counts, API server metrics
- Cloud Load Balancing: Request counts, latency, HTTP status codes
Cloud Trace
Enable distributed tracing for Cloud Functions and containerized applications:Cloud Audit Logs
All API calls within the customer’s Google Cloud project are logged to Cloud Audit Logs, providing a complete audit trail of what your control plane does:- Service account impersonations
- Resource creation, modification, deletion
- Permission denials
- Configuration changes
Artifacts
Google Cloud appliances automatically provision private artifact repositories to store container images and application files deployed by your deployment stacks.Container images (Artifact Registry)
When you deploy an appliance, Tensor9 BYOC automatically provisions a private Artifact Registry repository in the customer’s Google Cloud project to store your container images. Example: Origin stack with container service Your AWS origin stack references container images from your vendor’s Amazon ECR:- Detects the container image reference in your ECS task definition
- Provisions a private Artifact Registry repository in the appliance (e.g.,
us-docker.pkg.dev/customer-project/myapp-000000007e/api) - Copies the container image from your vendor ECR registry to the appliance’s private Artifact Registry
- Rewrites the deployment stack to reference the appliance-local registry
- Deploy (tofu apply): Tensor9 BYOC copies the container image from your vendor registry to the appliance’s private registry
- Destroy (tofu destroy): Deleting the deployment stack also deletes the copied container artifact from the appliance’s private registry
Function source code
For Lambda functions in your AWS origin stack, Tensor9 BYOC automatically handles copying function source code to the customer’s Google Cloud environment:- Provisions a private Cloud Storage bucket in the appliance for function sources
- Copies the Lambda source archive from your vendor S3 bucket to the appliance’s Cloud Storage bucket
- Compiles the Lambda function to a Cloud Run service with the appliance-local source reference
Secrets management
Store secrets in AWS Secrets Manager or AWS Systems Manager Parameter Store in your AWS origin stack, then pass them to your application as environment variables.Secret naming and injection
Always use parameterized secret names and inject them as environment variables:Operations
Perform remote operations on Google Cloud appliances using the Operate service account.kubectl on GKE
Execute kubectl commands against GKE clusters:gcloud CLI operations
Execute gcloud commands:Database queries
Execute SQL queries against Cloud SQL databases:Operations endpoints
Create temporary operations endpoints for interactive access:Example: Complete Google Cloud appliance
Here’s a complete example of a deployment stack for a Google Cloud appliance, compiled from an AWS origin stack:main.tf
variables.tf
outputs.tf
Best practices
Prefix all resource names with the namespace
Prefix all resource names with the namespace
${var.namespace} to prevent conflicts across customer appliances. Don’t skip project-scoped names: nothing stops two installs sharing one project:Rely on the appliance's own project for scoping
Rely on the appliance's own project for scoping
- IAM role bindings scoped to one appliance
- Cloud Logging and Monitoring isolation
- Cost tracking
- Resource discovery
Enable Cloud Logging for all services
Enable Cloud Logging for all services
Use AWS Secrets Manager for sensitive data
Use AWS Secrets Manager for sensitive data
Troubleshooting
Deployment fails with permission errors
Deployment fails with permission errors
- Verify your control plane has successfully impersonated the Deploy service account
- Check the Deploy service account’s IAM roles include necessary permissions for the resources being created
- Ensure the impersonation policy allows your control plane’s service account
- Verify the
deploy_accesslabel is set and the time window hasn’t expired - Review Cloud Audit Logs in the customer project to see which specific API call was denied
Resources fail to create due to naming conflicts
Resources fail to create due to naming conflicts
- Ensure all resource names are prefixed with
${var.namespace} - Verify the
@namespaceannotated variable is being passed correctly - Check that no hardcoded resource names exist in your origin stack
- For Cloud Storage buckets, remember they must be globally unique - prefix them with
${var.namespace}
Observability data not flowing to control plane
Observability data not flowing to control plane
- Verify the Steady-state service account has permissions to read logs and metrics
- Check that the Steady-state service account is bound in the appliance’s project
- Ensure log sinks are configured correctly
- Verify resource names are parameterized and follow the expected pattern
- Check that the control plane is successfully impersonating the Steady-state service account
API quota limits exceeded
API quota limits exceeded
- Ask the customer to request quota increases from Google Cloud Console
- Consider deploying appliances in separate Google Cloud regions
- Ask the customer to review their current quota usage
- Ask the customer to clean up unused resources in their project
Private service connection failures for Cloud SQL
Private service connection failures for Cloud SQL
- Ensure VPC has a private service connection allocated
- Verify the IP address range doesn’t conflict with existing ranges
- Check that
servicenetworking.googleapis.comAPI is enabled - Ensure the Deploy service account has
compute.networks.updatePolicypermission
Need help?
Need help?
- Slack: Join our community Slack workspace for real-time support
- Email: Contact us at [email protected]
Next steps
Now that you understand deploying to Google Cloud customer environments, explore these related topics:- Permissions Model: Understand the four-phase permissions model in detail
- Deployments: Learn how to create releases and deploy to customer appliances
- Operations: Execute remote operations on Google Cloud appliances
- Observability: Set up monitoring and logging
- Terraform Origin Stacks: Write Terraform origin stacks optimized for Google Cloud