Skip to main content

Troubleshooting

Every refusal carries a code, shown in square brackets by the CLI and in the workbench.

Connections​

SymptomFix
Validation lists missing permissionsGrant what it names, all at once, then validate again. Role changes take a minute or more to apply.
"has not been used in project ... or it is disabled" (Google)Enable that API. It can take a minute or two to switch on.
"caller does not have permission to act as service account" (Google)Grant roles/iam.serviceAccountUser to the Ductape service account.
A role you granted is reported missing againSome screens replace the roles on an account instead of adding to them. Check it holds all seven together.
"The role defined for the function cannot be assumed by Lambda" (AWS)DuctapeFunctionRuntime must trust lambda.amazonaws.com. A new role can take a minute to be usable.
MissingSubscriptionRegistration (Azure)A subscription owner registers the provider: az provider register --namespace Microsoft.App --wait.
"ACR tasks are not permitted" (Azure)Registry builds are refused on free-credit and some trial subscriptions. Use pay-as-you-go.
"not created for deploys"Create the connection with the deploy scope.

AWS Fargate​

SymptomFix
"is not set up for Fargate: ... missing"Run the second stack and complete the connection with its outputs: ductape cloud connections complete <tag> --fargate-outputs-file outputs.json
Validation says the listener is HTTP, not HTTPSUse the stack's ListenerArn output. Ductape will not send signed requests over plain HTTP.
A new release never becomes healthyRead the service events and the /ecs/ductape log group. Usual causes: the container does not listen on the declared port (a function listens on 8080), tasks cannot pull the image because the subnets have no route to the internet, or a security group blocks the load balancer.
The address does not resolve, or the certificate is rejectedThe wildcard DNS record must point at the load balancer and the certificate must cover *.<your domain>. It does not cover the domain itself.
"do not apply to Fargate: timeoutSeconds ..."Fargate has no per-call timeout setting. Remove it from the runtime block; the limit is the load balancer's idle timeout.
"is not authorized to perform: iam:PassRole"DuctapeAccess may hand only DuctapeFargateTask and DuctapeFargateExecution to ECS. Complete the connection with exactly those role ARNs.
Releases fail their check as unreachable after limiting the load balancer by prefix listThe list must include the addresses Ductape calls from (deploy_setup.fargate.controlPlaneAddresses in the connection response, or ask your Ductape operator). Add them to the prefix list; no redeploy is needed.
"The relay refused the request: the relay only calls hosts under the connection's base domain"The relay function was made for another domain. Update the ductape-fargate stack with BaseDomain set to the connection's base domain; validating the connection says which domain the relay has.
An internal load balancer's releases fail with "could not reach it"The check runs inside your VPC, so your domain has to resolve to the internal load balancer from there (a private hosted zone for the base domain), and the relay's security group must be allowed to reach the load balancer on 443 (the stack adds that rule).
A rollback to an older release takes a minute or twoThat release was scaled to zero by the opt-in scale-down. It is brought back at its old size and waited for before it takes traffic. Turn scale-down off (--fargate-scale-down-idle off) to keep every release warm.
"kept refusing a rule priority"Another deploy to the same load balancer was making rules at the same moment. Ductape retries with a different number a few times; try again.
"refers to the secret ... which does not exist"A secret reference under ductape/ names a secret that is not in this account and region. Create it in Secrets Manager first.
A task never starts and ECS says it cannot retrieve a secretThe execution role cannot read the secret. The setup stack allows ductape/*; for another name, add secretsmanager:GetSecretValue for it to DuctapeFargateExecution.
"do not apply to Fargate: ..." names startupProbeIt no longer does. A tcp probe is refused; use startupProbe.path. See the health check notes in Connect a cloud.
A rule exists for the host but "was not created by Ductape"Another rule already uses that host name. Ductape does not change what it did not make: pick another deployment name or remove the rule yourself.

ECS Express Mode​

SymptomFix
TRAFFIC_SPLIT_UNSUPPORTEDExpress cannot split traffic. Plan with trafficPercent 100, or use aws_fargate for a split.
"Express Mode checks health with an HTTP path"Set runtime.startupProbe.path to a path that answers 200, or give the service a verification check that expects 200.
The orphan report says it needs tag:GetResourcesUpdate the ductape-deploy stack from the latest template. Deploys work without it.
"AWS rolled the release back: ..."Express's canary tripped its health check or error alarm. The message carries AWS's reason, and the service stays on the last good release.
The first release is failed after traffic movedThere was no earlier release to return to. Fix the release and deploy again.
"is not set up for ECS Express Mode: ... missing"Complete the connection with the Fargate details (cluster, subnets, roles, log group) and the Express role: --fargate-outputs-file and --express-outputs-file.
Validation says the infrastructure role does not trust ECSCreate it from the ductape-ecs-express stack. It must trust ecs.amazonaws.com and carry AmazonECSInfrastructureRoleforExpressGatewayServices.
"exists in ductape and was not created by Ductape"A service with that name is already in the cluster. Ductape does not change what it did not make.

Secrets copied into AWS Lambda​

What you seeWhat to do
"The workspace has no secret named ..."A release refers to { "secret": "NAME" } and the workspace has none. Create it with ductape secrets create, or read it from a .env file with ductape secrets-scan-env --apply.
"... is revoked" or "... has expired"The workspace secret cannot be copied. Replace or renew it, then plan again.
"... is limited to the environments ... and is not allowed in ..."The secret's environments do not include the one you are deploying to. Add the environment to the secret.
"... has no value"The secret exists but is empty. Set a value.
The plan cannot be applied by a script or an assistantA plan that copies a secret needs a person to approve that exact plan in every environment. See Plans and approval.
A deployed function still has the old secret valueA secret is copied when a release is deployed. After changing it in the workspace, redeploy (deployments redeploy <id>).

Azure Key Vault references​

SymptomFix
"holds no Key Vault"A reference by bare name needs the connection's vault: --key-vault-uri https://my-vault.vault.azure.net. Or give the full address in the reference.
"not a Key Vault secret address"Use https://<vault>.vault.azure.net/secrets/<name>, optionally with a version.
The app starts but cannot read the secretGive the app's runtime identity the Key Vault Secrets User role on the vault. Role changes can take a few minutes.

Cloudflare Workers​

SymptomFix
"this connection names no Secrets Store"Complete the connection with --secrets-store-id <32-character id> and put the secret in that store.
Validation says the token cannot read the Secrets StoreAdd the Secrets Store permission to the token, or clear the id with --secrets-store-id "".
Validation says the token lacks permissionsAdd Account / Workers Scripts / Edit and Account / Workers KV Storage / Edit to the token, limited to the account
"has no workers.dev subdomain"Set one under Workers & Pages
"is not in this Cloudflare account (namespace ductape-releases)"Publish the bundle again. Publish and deploy through the same connection.
ARTIFACT_MISMATCHA bundle only runs on cloudflare_workers targets and an image only on the others
TARGET_KIND_MISMATCHWorkers cannot run a service
A plan is blocked on TIMEOUT_EXCEEDS_LIMITA Worker is stopped after 30 seconds of CPU time. Lower the contract's timeout_ms or use another cloud.
"has no cpu, memory setting"Cloudflare manages size and scaling. Remove the runtime block.
Rollback fails with a missing versionCloudflare keeps the last 100 versions. Publish and deploy the release again.

Builds​

SymptomFix
Changes to the cloud are "switched off" [MUTATIONS_DISABLED]The control plane has not enabled changes. Ask whoever runs it.
A build fails with a permission errorBuilds run as your cloud's build identity. The guide lists what it needs.
"Cannot have more than 1 builds in queue" (AWS)New accounts run one build at a time. Wait, or raise the quota.
Source upload expiredYou have an hour between creating a build and starting it. Create it again.

Plans and approval​

CodeMeaning
APPROVAL_REQUIREDThe environment needs a person to approve this plan first
APPROVAL_NOT_HUMANApproving needs a person's own session, not a script or an agent
PLAN_EXPIREDPlans last an hour. Make a new one.
PLAN_NOT_APPLICABLEThe plan has a conflict or a placement violation
STEP_UP_REQUIREDThis server wants a fresh emailed code. See Plans and approval.
STEP_UP_CODE_INVALID / STEP_UP_LOCKEDWrong code (five tries) or too many tries. Ask for a new one.
INSUFFICIENT_ROLEOnly workspace owners and admins can do this on this server
DEPLOY_NOT_ENABLEDDeploy is not enabled for this workspace yet
DEPLOYMENT_IN_PROGRESSWait for it to finish before planning another change
TRAFFIC_UNCHANGED / ROLLBACK_NOT_NEEDEDAlready at what you asked for
OBSERVED_REQUIREDThis server does not read your cloud itself; send the observed state, or ask it to

Deployments​

SymptomFix
An applied plan does not moveNo worker is running. The workbench says so, and ductape deploy capabilities show has worker.alive: false.
A deployment failedductape deploy deployments journal <id> shows each step and the cause. It rolled back to the last good release if there was one.
A function is Failed with ImageAccessDenied (AWS)Do not add expiry rules to the ductape/ repositories or push images there yourself.
A function not called for weeks fails on its first call (AWS)Lambda puts idle container functions to sleep. Call again; deploying always wakes it.
The deployed endpoint answers 401 or 403 in a browserThat is intended. Endpoints check signed requests and your cloud's own identity.
A version cannot be retiredIt is still serving, or not deprecated. The message says where.