Environments: plug in your own dev
You changed one or two services and want to run them in a box, while everything else stays on the dev you already have: the same database, the same Redis, the internal services you did not touch. Environments do exactly that.
An environment is one of your dev (or staging) setups, made of three things:
- Connections: a connector you run inside your own network. It connects out to ParallelSandbox, so your firewall needs no inbound rule. Boxes reach only the
host:portyou list on the connection. An environment can have several connections, one per network (a VPC, an office); each has its own token and its own address list. - Service settings: each service's full set of environment variables in this environment, imported from AWS ECS or uploaded as a
.env. In the box they are/work/.sbx/env/<service>.envand.sh. - externalBaseUrl: where your unchanged HTTP services live (optional), same as the
sandbox_startparameter.
When the agent starts a box with environment, connecting to db.internal:5432 inside the box reaches your database through your connector, from containers too, and the services you changed start with their own settings, exactly as they run on dev.
How a box reaches an address
- At start, the box gets the environment's addresses from all its connections. Each host name gets an address of its own inside the box (from
198.18.0.0/15) that the box's DNS answers with; connections to thathost:port, or toIP:portfor an IP address, are routed to an entry boxd opens for the address. boxd does not listen on the address's own port, so an address on port 80, such as an internal load balancer, works like any other, and a program in the box can listen on the same port number without conflict: with your own Postgres on 5432 in the box,localhost:5432is yours anddb.internal:5432still goes to your network. - When a program in the box connects, ParallelSandbox sends the connection through the connection (the network) that lists that exact
host:port, and that connection's connector opens it inside your network. If two connections list the same address, the one whose name sorts first is used; list each address on the connection that can reach it. - DNS for your names is resolved by the connector, in your network, so private zones (Route 53 private hosted zones, Cloud Map, office DNS) work as they do for your services.
- Containers on the default bridge, on user-defined networks and in
docker composereach the addresses the same way as the box's own programs: the box's rules apply to both, and Docker's DNS in the box forwards to the box's resolver. - Traffic is plain TCP end to end: TLS to your service is not terminated anywhere in between, so certificates behave as they do on your dev.
- What the box sends through a connection counts as its outbound traffic (
box_egress, Credits); what your network sends back is not metered. - An address can be a public host too, such as
api.partner.example:443. The box then reaches it through the connector, so the traffic leaves from your own network, with its public IP address. That is the way to reach an outside service that accepts only known IP addresses: a box's own internet traffic leaves from the public IP of the host it runs on, which differs from host to host and changes as hosts come and go (Other facts).
A name you declare in the box's services that is also an environment address points at the box instead (see Use it from a box), and a link to another of your boxes with the same host:port wins over the address too (Links to other boxes). Nothing on your network can open a connection into a box: services that stay on your dev keep calling your dev's copies.
What is not listed stays out of reach, each case in its own way (observed on a box):
- A listed private IP address dialed on a port that is not listed gets no answer, like an unlisted one: the connection times out and nothing is written to
private-endpoints.log. - A listed host, or a name declared in the box, dialed on a port that is not listed or declared stays in the box: whatever listens on that port on
0.0.0.0in the box answers, and with nothing there the connection is refused at once. - A host name that is not listed (and not declared) is looked up by ParallelSandbox's resolver, which answers public DNS, not your private zones:
- a name that exists only in your private DNS (Cloud Map, a Route 53 private zone, office DNS, a private API Gateway's
<api-id>.execute-api.<region>.amazonaws.com) does not resolve:Could not resolve host,no such host,NXDOMAIN. List it on the connection that can reach it, with the port it is dialed on (443for API Gateway), and the connector resolves it in your network; - a name that public DNS resolves to a private IP, such as an RDS endpoint or an
internal-….elb.amazonaws.comload balancer, does resolve, and the connection then times out like any unlisted private IP; list it to reach it; - public names resolve as usual and go straight to the internet.
- a name that exists only in your private DNS (Cloud Map, a Route 53 private zone, office DNS, a private API Gateway's
- A listed IP address is caught inside the box: boxd's rules send that IP and port, from the box's programs and its containers alike, to its entry for the connection.
- A private IP address that is not listed gets no answer: the connection times out, and nothing is written to
private-endpoints.log. - Port 80 is different: an address listed on port 80 itself works like any other, but a listed host or declared name dialed on 80 without being listed or declared on 80 reaches boxd's scene entry, which answers 502
nothing listens on <name>:80 in this box: that name is declared on another port. Dial the port it is declared on, or declare it on port 80 with targetPort, the port your process listens on. A box started before 2026-09-24 20:30 UTC answers with its first declared service instead.
Set it up
The agent sets an environment up over REST (below) and reads the result with sandbox_environments; there is no screen for it. Only two things need someone on your network: running the connector, and creating the AWS role if you use AWS. In order:
- Create the environment:
POST /v1/environmentswith a name such asdev. Agents use this name when they start a box. - Add a connection, one per network:
POST /v1/environments/{env}/connections. The answer has arunCommand, adocker runline; its token is shown only once (and again when you rotate it). Run it on a machine in that network that can reach those databases and services (see Connector below). Within secondssandbox_environmentsshows the connection asonline. - Set the addresses of each connection:
PUT /v1/environments/{env}/connections/{id}/endpointswith the whole list, onehost:porteach, written the way your services' settings use them, such asmydb.xxxx.ap-northeast-1.rds.amazonaws.com:5432,cache.internal:6379or10.0.1.5:8080. Once you have service settings,GET /v1/environments/{env}/suggested-endpointsreturns the addresses found in them: everyhost:portin a value, every URL (without a port, its scheme's default: postgres 5432, mysql 3306, redis 6379, mongodb 27017, amqp 5672, http 80, https 443) and every*_HOSTvariable with a matching*_PORT, kept when the host is a private IPv4 address (10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) or ends in.internal,.local,.lan,.corp,.svc,.cluster.local,.rds.amazonaws.com,.cache.amazonaws.com,.es.amazonaws.com,.mq.amazonaws.com,.docdb.amazonaws.comor.redshift.amazonaws.com. Anything else, such as an internal load balancer'sinternal-*.elb.amazonaws.comor a private zone with your own domain, you add by hand. List the internal names of services you might change too: boxes that do not change them reach your dev's copy, and a box that declares the name atsandbox_starttakes it over. - Service settings: import from AWS (
POST .../services/import) or upload a.env(PUT .../services/{name}), both below.
Set it up over REST
Everything above is REST on https://api.parallelsandbox.com, called with Authorization: Bearer <token>. The token is a psbx_ API key of the account, or the OAuth access token of a connected client (it expires in an hour; REST says where keys come from). The MCP tool sandbox_environments only reads: it lists environments, their connections and reachability. Creating and changing them is REST. {env} is the environment's name and {id} a connection's id from GET /v1/environments/{env}. Setting values stay write-only: reads return variable names only.
| Request | Body | Returns |
|---|---|---|
GET /v1/environments |
{ "environments": [...] }, each as below |
|
POST /v1/environments |
{ "name": "dev" }, optionally externalBaseUrl; the name is 1 to 32 lowercase letters, digits and dashes |
the environment: name, externalBaseUrl, awsRoleArn, awsRegion, connections[] (id, name, online, sessions, lastSeenAt, connectorVersion, endpoints), services[] |
GET, PUT, DELETE /v1/environments/{env} |
PUT: any of externalBaseUrl, awsRoleArn, awsRegion (a role needs a region; "" clears) |
the environment; DELETE returns { "ok": true } |
POST /v1/environments/{env}/connections |
{ "name": "office" } |
connection, token and runCommand, the connector's docker run line; the token is shown only here and on rotation |
POST /v1/environments/{env}/connections/{id}/token |
a new token and runCommand; the old token stops working at once and its connector is disconnected |
|
DELETE /v1/environments/{env}/connections/{id} |
{ "ok": true } |
|
PUT /v1/environments/{env}/connections/{id}/endpoints |
{ "endpoints": [{ "host": "mydb.internal", "port": 5432 }] }, the whole list, at most 100 |
the connection |
GET /v1/environments/{env}/suggested-endpoints |
{ "endpoints": [...] }, addresses found in the service settings |
|
GET /v1/environments/{env}/services |
{ "services": [...] } with name, source (dotenv or aws-ecs), keys, notable (the connection, mode and permission settings to check first, as in sandbox_environments), sourceRef (for aws-ecs, with the image the ECS service ran), syncedAt |
|
PUT /v1/environments/{env}/services/{name} |
{ "dotenv": "KEY=value\n…" } |
the service |
POST /v1/environments/{env}/services/import |
{ "region", "cluster", "service" }, plus container when the task has several and name (default: service) |
the service |
POST /v1/environments/{env}/services/{name}/sync |
the service, imported again from ECS | |
DELETE /v1/environments/{env}/services/{name} |
{ "ok": true } |
|
GET, PUT, DELETE /v1/aws |
PUT: { "roleArn", "region" } |
the read-only role used for imports, with the externalId it must trust and a one-click CloudFormation quickCreateUrl |
GET /v1/aws/ecs/services?region=… |
the ECS services that role can see |
For example, an environment with one connection and one service's settings:
A=https://api.parallelsandbox.com/v1; H="Authorization: Bearer $PSBX_TOKEN" # an API key or an OAuth access token
curl -s -H "$H" -X POST $A/environments -d '{"name":"dev"}'
curl -s -H "$H" -X POST $A/environments/dev/connections -d '{"name":"aws"}' # token and runCommand, shown once
curl -s -H "$H" -X PUT $A/environments/dev/connections/<id>/endpoints -d '{"endpoints":[{"host":"mydb.internal","port":5432}]}'
jq -Rs '{dotenv: .}' api.env | curl -s -H "$H" -X PUT $A/environments/dev/services/api --data-binary @-
Connector
docker run -d --name parallelsandbox-connector --restart=always \
-e PSBX_CONNECTOR_TOKEN=psbx_conn_... \
public.ecr.aws/b2n6a1j1/connector:latest
| Variable | Meaning |
|---|---|
PSBX_CONNECTOR_TOKEN |
Required; the token you got when you added the connection |
PSBX_URL |
ParallelSandbox's API, default https://api.parallelsandbox.com |
PSBX_SESSIONS |
How many connections to keep open to ParallelSandbox, default 2, 1 to 8 |
PSBX_ALLOW |
Optional allowlist enforced on this connector, comma-separated: db.internal:5432,*.svc.local:*,10.0.0.0/8:* |
- Run it where the targets are reachable: the same VPC, Kubernetes cluster or host as your services. On AWS, an ECS service with one Fargate task in your services' subnets and security group works well (Team setup has the commands).
- It only connects out to
api.parallelsandbox.com:443(WebSocket over TLS). Behind an HTTP proxy, setHTTPS_PROXYas usual. - You can run several copies with the same token; boxes connect as long as one is online. When ParallelSandbox deploys a new version the connector moves to the new machines by itself: new connections use them, and connections already open keep using the old machine until it goes away, at most an hour later. Database pools reconnect on their own.
- What can be reached is decided by the addresses on the connection, enforced by ParallelSandbox first;
PSBX_ALLOWlets you enforce it again on your side. - The connector ships only as a container image (
public.ecr.aws/b2n6a1j1/connector, linux/amd64 and linux/arm64); there is no separate binary download. A host without Docker needs another OCI runtime, such as Podman with the same-evariables, or run it on ECS or Kubernetes. - If a token leaks or someone else takes over, call
POST /v1/environments/{env}/connections/{id}/token: the old token stops working immediately, the running connector is disconnected, and you restart it with the new token.
Sizing and redundancy
- One connector per network serves every box of the account, whoever started it. Each connection a box opens to one of your addresses is a stream inside one of the connector's sessions (its WebSocket connections to ParallelSandbox), not a connection of its own.
PSBX_SESSIONS(default 2, 1 to 8) is how many sessions one copy keeps open. With more than one, another session stays up while ParallelSandbox redeploys.- For redundancy, run a second copy with the same token on another host or in another availability zone. ParallelSandbox pools the sessions of every copy: a new box connection takes a session held by the ParallelSandbox machine that received it, then one held by another machine, and last a session that is being moved away during a deploy. Every copy must reach every address listed on the connection: when the chosen copy cannot reach the target, the box gets 502 at once, without trying another copy.
- The connector only copies bytes between those streams and your targets, so the network is what it needs most. On AWS, watch the Fargate task's CPU and network metrics in CloudWatch, and give it more CPU or run another copy when they run high.
- When a box freezes or stops, ParallelSandbox closes its connections within about a minute, so they stop holding streams on the connector.
- Environments and connectors cost nothing in ParallelSandbox; what a box sends through a connection counts as its outbound traffic (Credits). The connector's own compute and network (a Fargate task, a NAT gateway, an office host) are billed by your provider.
Import service settings from AWS
ParallelSandbox reads the current task definition of an ECS service with a read-only role you grant: environment is copied as is, and the SSM parameters and Secrets Manager values (including :json-key) referenced in secrets are resolved. environmentFiles stored in S3 cannot be read and are listed under Not imported. The settings are stored under the ECS service's name unless you give another; that name is the <service> in /work/.sbx/env/<service>.env.
To bring an S3 environmentFiles file along, upload it as a .env (PUT .../services/{name}) under a second name, such as api-files, and give the service both files, that one first so the task definition's own values win as they do on ECS: docker run --env-file /work/.sbx/env/api-files.env --env-file /work/.sbx/env/api.env ..., or . api-files.sh && . api.sh. Uploading under the imported service's name would replace its imported settings.
Connect your AWS account (once per account, over REST):
GET /v1/awsreturns theexternalIdthe role must trust and aquickCreateUrl: opened by whoever holds the AWS account, the console shows a stack with the parameters filled in; create it. To create the role yourself: trustarn:aws:iam::580360261327:rootwith the conditionsts:ExternalIdset to thatexternalId, and allowecs:ListClusters,ecs:ListServices,ecs:DescribeServices,ecs:DescribeTaskDefinition,ssm:GetParametersandsecretsmanager:GetSecretValue, pluskms:Decryptfor SecureString parameters and secrets encrypted with your own KMS key. Template:https://parallelsandbox-releases.s3.ap-northeast-1.amazonaws.com/releases/aws/readonly-role.yaml.PUT /v1/awswith{ "roleArn": "<RoleArn from the stack's Outputs>", "region": "<region of your services>" }. ParallelSandbox signs in once and the error says why if it fails.
Then GET /v1/aws/ecs/services?region=… lists the services the role can see, and POST /v1/environments/{env}/services/import with { "region", "cluster", "service" } imports one (what could not be read comes back in sourceRef.skipped). After you deploy a new task definition, POST /v1/environments/{env}/services/{name}/sync reads it again.
Setting values are stored encrypted and handed to a box only at the moment it is claimed; agents see variable names only.
Settings for services not on ECS
For a service that runs elsewhere (Kubernetes, a VM, docker compose on a server), upload them as KEY=value lines with PUT /v1/environments/{environment}/services/{service} and { "dotenv": "KEY=value\n…" }. Build the file from wherever the settings live, such as the Deployment's env and the ConfigMaps and Secrets it references, a systemd unit's EnvironmentFile, or compose's env_file. There is no sync for uploads: upload again when the settings change.
AWS permissions inside a box
A service's AWS permissions usually are not in its environment variables: AWS hands them to the machine it runs on (an ECS task role). Moving the service into a box leaves that behind, so anything using S3 or SQS fails.
An environment can name a role for its boxes, through OIDC, the same way GitHub Actions and Vercel reach AWS:
GET /v1/environments/{env}returns this environment's identity (awsSubject,tenant:<account>:env:<environment>) andawsBoxRoleQuickCreateUrl, a one-click CloudFormation link for the role.- Create the role in AWS with the permissions your boxes need, then
PUT /v1/environments/{env}with{ "awsRoleArn": "<role ARN>", "awsRegion": "<region>" }. - Boxes started after that have
AWS_CONTAINER_CREDENTIALS_FULL_URIset to the box's own credentials address, the one ECS uses, plusAWS_REGIONandAWS_DEFAULT_REGION. AWS SDKs and the CLI pick it up, fetch credentials and refresh them on their own, with no code change. Containers too, when started withdocker run --env-file /work/.sbx/env/<service>.env.aws sts get-caller-identityin the box showsassumed-role/<role>/psbx-<box id>.
ParallelSandbox signs a ten-minute identity for the box; the box exchanges it with AWS for credentials that expire in an hour. No long-lived key exists anywhere, and ParallelSandbox holds nothing that can act in your account. Deleting the role or changing its trust policy takes effect immediately, and the role trusts only the environment you named.
To pull images from your own ECR in a box (dev's current image of a service you did not change, say), the role needs ecr:GetAuthorizationToken, and ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer and ecr:BatchGetImage on the repositories (the AWS managed policy AmazonEC2ContainerRegistryReadOnly has all four). Then, in the box: aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account>.dkr.ecr.<region>.amazonaws.com, and docker run --env-file /work/.sbx/env/<service>.env … <image>. Without those permissions the login fails with AccessDeniedException … is not authorized to perform: ecr:GetAuthorizationToken.
Use it from a box
sandbox_environments {}
sandbox_start { "name": "refund flow rework", "goal": "Rework the api's refund flow against dev's databases and services; done when a refund made through the api is recorded in dev", "environment": "dev", "services": [{ "name": "api", "port": 8080 }] }
The sandbox_start result gains an environment: reachable lists the private addresses the box can reach, connectorOnline says whether a connector is up (with several connections, whether any of them is), connections[] gives each connection's name, online, sessions, lastSeenAt, connectorVersion and reachable (the addresses that go through it, minus names the box runs itself), and services gives each service's settings files. When some connections are offline, next names them with their addresses; when none is online, it says the connector is offline. sandbox_status returns the same environment, read again on every call, so it shows a connection going offline after the box started.
If the environment has an externalBaseUrl, the box inherits it, and every service you declared starts in external mode: name:port forwards HTTP to externalBaseUrl. Switch the ones you run in the box to box; boxd does not hold their port, so it does not matter whether their process is already running:
sandbox_wire { "id": "<id>", "service": "api", "mode": "box" }
Start the services you changed with their settings:
sandbox_exec { "id": "<id>", "cmd": "cd api && docker build -t api . && docker run -d --name api --env-file /work/.sbx/env/api.env -p 8080:8080 api", "note": "build and start the api with its dev settings" }
sandbox_exec { "id": "<id>", "cmd": "cd api && . /work/.sbx/env/api.sh && go run ./cmd/api", "background": true, "note": "run the api with its dev settings" }
.envis thedocker run --env-fileformat with values as is;.shisexport KEY='VALUE'for programs you run directly. Multi-line values are only in.sh. To change one value for the box, add-e KEY=valueafter--env-file; it wins.Which settings matter: a service's settings can run to a hundred names.
sandbox_startandsandbox_statuslist, per service,keysCountandnotableinstead of every name:connectionsettings point at the environment itself (this is how you find the database variable when it is notDATABASE_URL),modesettings (SERVER_MODE,STAGE,*_BYPASS) hold dev's value, which can turn authentication or checks off, so a test of that path may pass for the wrong reason, andpermissionsettings (admin lists, allowlists) hold dev's own list, not production's. Override a mode with-eorexportwhen the test depends on it.sandbox_environmentslists every name.A front end usually has its own switch for which backend it calls (
CUBELV_ENV=dev,VITE_API_URL,STAGE), and that is in no service's settings unless someone stored the front end as a service of the environment. Read the project's README for how it runs against dev and set those when you start its dev server or build it, or the page you test talks to production.For a program you run directly, source the
.shand then override what the box needs, either for that one command or withexport:. /work/.sbx/env/api.sh && DATABASE_URL="$(psbx-testdb url)" ./bin/backfillDo not source the
.env(set -a; . api.env): its values are not quoted, so one with a space or a quote stops the shell with an error, and one with a$changes without a word.A published version declared with
versiongets the settings file of the service it was published for,/work/.sbx/env/<service>.env, without any flag of yours (Run a published version).docker composeexpands$insideenv_filevalues; if a value contains$, usedocker run --env-file, or source.shand pass variables withenvironment:.Programs and containers in the box keep using the usual host names, no config changes: the names resolve to their addresses inside the box, and boxd carries each connection through ParallelSandbox and your connector.
When other services call the one you changed by its internal host name (a router forwarding to
api.svc.local:8080, say), declare it inservicesunder that name atsandbox_start:[{ "name": "api.svc.local", "port": 8080 }].portis what callers dial; if your process listens on another port, add it astargetPort, which is required when callers dial port 80, as with an internal load balancer:[{ "name": "internal-lb.svc.local", "port": 80, "targetPort": 8080 }]. Inside the box that name then points at the box instead of your connector, andreachableleaves it out; everything you did not change still goes to your dev. Callers that run on your dev keep reaching your dev's copy; run a caller in the box too if the test needs it. Declared later withsandbox_wire(portfor your own process,versionfor a published version), the name is taken over in place on boxes whosesandbox_status→health.featuresincludestake-over(every box started from 2026-09-25 12:40 UTC): it keeps its address, connections open through the connector are closed, and programs reconnect to the box's copy. On older boxes such a name keeps going to the connector, so declare it atsandbox_startthere (Taking over a link or an environment address).A changed service started with its settings talks to your real dev database: its migrations and writes land there. For tests,
psbx-testdb up <name>starts a clean Postgres 16 in the box and writes its connection to/work/.sbx/testdb/<name>.env(DATABASE_URL,TEST_DATABASE_URLand more, asexportlines;--as NAMEadds another variable); it listens on127.0.0.1, so a container needs--network hostto reach it. Team setup lists its options. To run a service against a database of its own, start one in a container and override the setting after--env-file(-e DATABASE_URL=…). Team setup has the commands. To read dev's data without risking a write,psbx-ro-psql <service>connects with that service's Postgres setting (the onlypostgres://one, or the variable you name), withdefault_transaction_read_onlyand a 60-secondstatement_timeout, and masks the connection string and password in its output:psbx-ro-psql market-data -c 'select count(*) from quotes'. It guards against slips, not against someone who wants to write (SETcan undo it).psbx-testdb up --redisstarts a Redis for tests the same way (REDIS_URL), andpsbx-testdb up --s3an S3-compatible server (AWS_ENDPOINT_URL, the keys,AWS_REGIONandS3_BUCKET).When the caller does not use a host name but dials addresses it got from its own registry (a gateway taking worker IPs from Redis, say), declare an address range in
services:[{ "name": "172.16.0.0/16", "port": 9090 }]. Connections from the box, containers included, to that range on that port reach your service in the box on itstargetPort; other ports are untouched. Private addresses only:10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10, declared atsandbox_start. Environment addresses inside the range on the same port stop going through the connector.
Team setup walks through a full example: two networks, several changed services, Sentry, and a changed service used from another box.
Troubleshooting
sandbox_environments: per environmentreachable,connectorOnline(true when any connection is up) andconnections[], which shows each connection'sonline,sessions,lastSeenAtandconnectorVersionand the addresses it carries. Readconnections[]first: an offlineofficeshows there even whileconnectorOnlineistrue.sandbox_status→environment.connections[]shows the same for the box's environment. The final check for one network is still to use one of its addresses from a box with a real client (curl,pg_isready,psqlandredis-cliare installed in the box; a bare TCP connect succeeds either way, because boxd accepts it first), then read that address inhealth.privateEndpoints.health.privateEndpointsinsandbox_status: for each address, the entry boxd opens for it inside the box (localIp,localPort), open connections, connections opened, failures, and the reason for the last failure./work/.sbx/logs/private-endpoints.log: one line per failed connection.sandbox_execresults carryprivateEndpointErrorsandprivateEndpointHintwhen a connection the command made to an environment address failed: the same reasons ashealth.privateEndpointsand the log, for that command only, since the program itself only sees its connection reset.- Slow through the connector: every connection a box makes through it pays at least the round trip in
connections[].rttMs(ParallelSandbox to the connector, measured every heartbeat), on top of the path inside your network. Timings measured through it compare with each other as ratios, not with timings taken inside your network. 403: the address is no longer listed on any connection of the environment; add it back withPUT /v1/environments/{env}/connections/{id}/endpoints. An address added after the box started is not known to that box at all (the box has no address for its name); start a new box.Could not resolve host(no such host,NXDOMAIN) for one of your internal names, such as a private API Gateway<api-id>.execute-api.<region>.amazonaws.com: the name is not listed, and public DNS does not know it. Add it with its port to the connection that can reach it.PUT .../endpointsreplaces the whole list, so take the current one fromGET /v1/environments/{env}and send it back with the new address; then start a new box.503: the connector of the connection that lists the address is offline, and the message names that connection (the connector "office" of this environment is offline; …); check its log (docker logs parallelsandbox-connector, or the ECS task's log). The client in the box sees its connection accepted and then reset.502: the connector could not reach the target; check DNS, routes and security groups between the connector's machine and that address.- Errors right after a box thaws: boxd closes connections to your addresses that were open before the freeze, within about 15 seconds of the thaw, so programs see an error instead of a connection that never answers. Database pools usually reconnect on their own; long-lived clients have to retry.
Limits
- TCP only. Addresses are exact host names or IPv4 addresses with a port; wildcards and ranges are not supported.
- At most 100 addresses per connection, and 200 per box across all connections.
- A box gets the environment's addresses, settings,
externalBaseUrland AWS role when it is claimed: addresses added or settings changed later reach new boxes only. Removing an address, a connection or the environment takes effect immediately, for running boxes too.