stacktape 3.5.8 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.tsconfig.bun-build.json +1 -0
- package/ai-docs/cli-ref/aws-profile-create.md +22 -0
- package/ai-docs/cli-ref/aws-profile-delete.md +22 -0
- package/ai-docs/cli-ref/aws-profile-list.md +20 -0
- package/ai-docs/cli-ref/aws-profile-update.md +22 -0
- package/ai-docs/cli-ref/bastion-session.md +29 -0
- package/ai-docs/cli-ref/bastion-tunnel.md +30 -0
- package/ai-docs/cli-ref/bucket-sync.md +30 -0
- package/ai-docs/cli-ref/cf-module-update.md +26 -0
- package/ai-docs/cli-ref/cf-rollback.md +28 -0
- package/ai-docs/cli-ref/codebuild-deploy.md +34 -0
- package/ai-docs/cli-ref/compile-template.md +25 -0
- package/ai-docs/cli-ref/container-session.md +30 -0
- package/ai-docs/cli-ref/debug-alarms.md +28 -0
- package/ai-docs/cli-ref/debug-aws-sdk.md +33 -0
- package/ai-docs/cli-ref/debug-container-exec.md +36 -0
- package/ai-docs/cli-ref/debug-dynamodb.md +35 -0
- package/ai-docs/cli-ref/debug-logs.md +34 -0
- package/ai-docs/cli-ref/debug-metrics.md +33 -0
- package/ai-docs/cli-ref/debug-opensearch.md +35 -0
- package/ai-docs/cli-ref/debug-redis.md +36 -0
- package/ai-docs/cli-ref/debug-sql.md +35 -0
- package/ai-docs/cli-ref/defaults-configure.md +29 -0
- package/ai-docs/cli-ref/defaults-list.md +20 -0
- package/ai-docs/cli-ref/delete.md +24 -0
- package/ai-docs/cli-ref/deploy.md +25 -0
- package/ai-docs/cli-ref/deployment-script-run.md +28 -0
- package/ai-docs/cli-ref/dev-stop.md +26 -0
- package/ai-docs/cli-ref/dev.md +45 -0
- package/ai-docs/cli-ref/domain-add.md +26 -0
- package/ai-docs/cli-ref/help.md +18 -0
- package/ai-docs/cli-ref/info-operations.md +22 -0
- package/ai-docs/cli-ref/info-stack.md +30 -0
- package/ai-docs/cli-ref/info-stacks.md +26 -0
- package/ai-docs/cli-ref/info-whoami.md +22 -0
- package/ai-docs/cli-ref/init.md +30 -0
- package/ai-docs/cli-ref/login.md +20 -0
- package/ai-docs/cli-ref/logout.md +18 -0
- package/ai-docs/cli-ref/mcp-add.md +22 -0
- package/ai-docs/cli-ref/mcp.md +20 -0
- package/ai-docs/cli-ref/org-create.md +24 -0
- package/ai-docs/cli-ref/org-delete.md +24 -0
- package/ai-docs/cli-ref/org-list.md +22 -0
- package/ai-docs/cli-ref/package-workloads.md +25 -0
- package/ai-docs/cli-ref/param-get.md +26 -0
- package/ai-docs/cli-ref/preview-changes.md +23 -0
- package/ai-docs/cli-ref/project-create.md +22 -0
- package/ai-docs/cli-ref/projects-list.md +22 -0
- package/ai-docs/cli-ref/rollback.md +28 -0
- package/ai-docs/cli-ref/script-run.md +29 -0
- package/ai-docs/cli-ref/secret-create.md +28 -0
- package/ai-docs/cli-ref/secret-delete.md +26 -0
- package/ai-docs/cli-ref/secret-get.md +26 -0
- package/ai-docs/cli-ref/upgrade.md +20 -0
- package/ai-docs/cli-ref/version.md +18 -0
- package/ai-docs/concept/connecting-resources.md +369 -0
- package/ai-docs/concept/directives.md +371 -0
- package/ai-docs/concept/extending-cloudformation.md +315 -0
- package/ai-docs/concept/overrides-and-transforms.md +352 -0
- package/ai-docs/concept/stages-and-environments.md +347 -0
- package/ai-docs/concept/typescript-config.md +447 -0
- package/ai-docs/concept/yaml-config.md +338 -0
- package/ai-docs/config-ref/_root.md +131 -0
- package/ai-docs/config-ref/application-load-balancer.md +1109 -0
- package/ai-docs/config-ref/astro-web.md +115 -0
- package/ai-docs/config-ref/aws-cdk-construct.md +68 -0
- package/ai-docs/config-ref/bastion.md +93 -0
- package/ai-docs/config-ref/batch-job.md +179 -0
- package/ai-docs/config-ref/bucket.md +348 -0
- package/ai-docs/config-ref/cdn.md +496 -0
- package/ai-docs/config-ref/custom-resource.md +80 -0
- package/ai-docs/config-ref/deployment-script.md +79 -0
- package/ai-docs/config-ref/dynamo-db-table.md +202 -0
- package/ai-docs/config-ref/edge-lambda-function.md +87 -0
- package/ai-docs/config-ref/efs-filesystem.md +72 -0
- package/ai-docs/config-ref/event-bus.md +63 -0
- package/ai-docs/config-ref/function.md +409 -0
- package/ai-docs/config-ref/hosting-bucket.md +171 -0
- package/ai-docs/config-ref/http-api-gateway.md +149 -0
- package/ai-docs/config-ref/http-endpoint.md +92 -0
- package/ai-docs/config-ref/kinesis-stream.md +97 -0
- package/ai-docs/config-ref/mongo-db-atlas-cluster.md +254 -0
- package/ai-docs/config-ref/multi-container-workload.md +399 -0
- package/ai-docs/config-ref/network-load-balancer.md +118 -0
- package/ai-docs/config-ref/nextjs-web.md +147 -0
- package/ai-docs/config-ref/nuxt-web.md +81 -0
- package/ai-docs/config-ref/open-search.md +206 -0
- package/ai-docs/config-ref/private-service.md +75 -0
- package/ai-docs/config-ref/redis-cluster.md +223 -0
- package/ai-docs/config-ref/relational-database.md +525 -0
- package/ai-docs/config-ref/remix-web.md +74 -0
- package/ai-docs/config-ref/sns-topic.md +69 -0
- package/ai-docs/config-ref/solidstart-web.md +75 -0
- package/ai-docs/config-ref/sqs-queue-not-empty.md +414 -0
- package/ai-docs/config-ref/sqs-queue.md +232 -0
- package/ai-docs/config-ref/state-machine.md +235 -0
- package/ai-docs/config-ref/sveltekit-web.md +81 -0
- package/ai-docs/config-ref/tanstack-web.md +75 -0
- package/ai-docs/config-ref/upstash-redis.md +59 -0
- package/ai-docs/config-ref/user-auth-pool.md +876 -0
- package/ai-docs/config-ref/web-app-firewall.md +212 -0
- package/ai-docs/config-ref/web-service.md +178 -0
- package/ai-docs/config-ref/worker-service.md +41 -0
- package/ai-docs/getting-started/console.md +232 -0
- package/ai-docs/getting-started/deployment.md +434 -0
- package/ai-docs/getting-started/dev-mode.md +118 -0
- package/ai-docs/getting-started/how-it-works.md +119 -0
- package/ai-docs/getting-started/intro.md +157 -0
- package/ai-docs/getting-started/using-with-ai.md +228 -0
- package/ai-docs/getting-started/workflow.md +197 -0
- package/ai-docs/index.json +1514 -0
- package/ai-docs/recipe/background-jobs.md +183 -0
- package/ai-docs/recipe/database-migrations.md +240 -0
- package/ai-docs/recipe/graphql-api.md +211 -0
- package/ai-docs/recipe/monorepo-setup.md +183 -0
- package/ai-docs/recipe/nextjs-full-stack.md +188 -0
- package/ai-docs/recipe/rest-api-with-database.md +156 -0
- package/ai-docs/recipe/scheduled-tasks.md +186 -0
- package/ai-docs/recipe/static-website.md +241 -0
- package/ai-docs/troubleshooting/cloudformation-stack-states.md +189 -0
- package/bin/stacktape.js +0 -12
- package/package.json +1 -1
- package/plain.d.ts +372 -111
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
---
|
|
2
|
+
docType: recipe
|
|
3
|
+
title: Static Website
|
|
4
|
+
tags:
|
|
5
|
+
- static
|
|
6
|
+
- website
|
|
7
|
+
- recipe
|
|
8
|
+
source: docs/_curated-docs/recipes/static-website.mdx
|
|
9
|
+
priority: 1
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Static Website Hosting
|
|
13
|
+
|
|
14
|
+
Host a static website with S3 and CloudFront CDN.
|
|
15
|
+
|
|
16
|
+
## Using Hosting Bucket (Recommended)
|
|
17
|
+
|
|
18
|
+
`HostingBucket` is purpose-built for static websites with CDN included automatically:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { defineConfig, HostingBucket } from 'stacktape';
|
|
22
|
+
|
|
23
|
+
export default defineConfig(({ stage }) => {
|
|
24
|
+
const isProduction = stage === 'production';
|
|
25
|
+
|
|
26
|
+
const website = new HostingBucket({
|
|
27
|
+
uploadDirectoryPath: './dist',
|
|
28
|
+
hostingContentType: 'single-page-app', // or 'static-website'
|
|
29
|
+
customDomains: isProduction ? [{ domainName: 'mysite.com' }, { domainName: 'www.mysite.com' }] : []
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
resources: { website }
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### YAML equivalent
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
resources:
|
|
42
|
+
website:
|
|
43
|
+
type: hosting-bucket
|
|
44
|
+
properties:
|
|
45
|
+
uploadDirectoryPath: ./dist
|
|
46
|
+
hostingContentType: single-page-app
|
|
47
|
+
customDomains:
|
|
48
|
+
- domainName: mysite.com
|
|
49
|
+
- domainName: www.mysite.com
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Hosting Content Types
|
|
53
|
+
|
|
54
|
+
### Single Page App (React, Vue, etc.)
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
const website = new HostingBucket({
|
|
58
|
+
uploadDirectoryPath: './dist',
|
|
59
|
+
hostingContentType: 'single-page-app'
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- All routes redirect to `index.html`
|
|
64
|
+
- Client-side routing works correctly
|
|
65
|
+
- HTML files never cached, assets cached indefinitely
|
|
66
|
+
|
|
67
|
+
### Static Website (Multi-page)
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
const website = new HostingBucket({
|
|
71
|
+
uploadDirectoryPath: './public',
|
|
72
|
+
hostingContentType: 'static-website',
|
|
73
|
+
indexDocument: '/index.html',
|
|
74
|
+
errorDocument: '/404.html'
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- Each page is a separate HTML file
|
|
79
|
+
- Direct file serving
|
|
80
|
+
- Custom error pages
|
|
81
|
+
|
|
82
|
+
## Build Integration
|
|
83
|
+
|
|
84
|
+
Run your build command before upload:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const website = new HostingBucket({
|
|
88
|
+
uploadDirectoryPath: './dist',
|
|
89
|
+
build: {
|
|
90
|
+
command: 'npm run build',
|
|
91
|
+
workingDirectory: '.'
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Custom Headers
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
const website = new HostingBucket({
|
|
100
|
+
uploadDirectoryPath: './dist',
|
|
101
|
+
fileOptions: [
|
|
102
|
+
{
|
|
103
|
+
includePattern: 'assets/**',
|
|
104
|
+
headers: [{ key: 'Cache-Control', value: 'public, max-age=31536000, immutable' }]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
includePattern: '*.html',
|
|
108
|
+
headers: [{ key: 'Cache-Control', value: 'no-cache' }]
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Environment Variables
|
|
115
|
+
|
|
116
|
+
Inject backend URLs into frontend HTML:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
const api = new HttpApiGateway({
|
|
120
|
+
routes: [
|
|
121
|
+
/* ... */
|
|
122
|
+
]
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
const website = new HostingBucket({
|
|
126
|
+
uploadDirectoryPath: './dist',
|
|
127
|
+
injectEnvironment: [{ name: 'API_URL', value: $ResourceParam('api', 'url') }]
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Access in JavaScript via `window.STP_INJECTED_ENV.API_URL`.
|
|
132
|
+
|
|
133
|
+
## With API Backend
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { defineConfig, HostingBucket, LambdaFunction, HttpApiGateway, HttpApiIntegration } from 'stacktape';
|
|
137
|
+
|
|
138
|
+
export default defineConfig(() => {
|
|
139
|
+
const api = new LambdaFunction({
|
|
140
|
+
packaging: {
|
|
141
|
+
type: 'stacktape-lambda-buildpack',
|
|
142
|
+
properties: { entryfilePath: './api/handler.ts' }
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const gateway = new HttpApiGateway({
|
|
147
|
+
routes: [{ path: '/api/{proxy+}', method: '*', integration: new HttpApiIntegration({ function: 'api' }) }]
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
const website = new HostingBucket({
|
|
151
|
+
uploadDirectoryPath: './dist',
|
|
152
|
+
hostingContentType: 'single-page-app',
|
|
153
|
+
routeRewrites: [
|
|
154
|
+
{
|
|
155
|
+
path: '/api/*',
|
|
156
|
+
routeTo: {
|
|
157
|
+
type: 'http-api-gateway',
|
|
158
|
+
properties: { httpApiGatewayName: 'gateway' }
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
]
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
resources: { api, gateway, website }
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Using Regular Bucket with CDN
|
|
171
|
+
|
|
172
|
+
For more control, use `Bucket` with explicit CDN configuration:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
import { defineConfig, Bucket } from 'stacktape';
|
|
176
|
+
|
|
177
|
+
export default defineConfig(({ stage }) => {
|
|
178
|
+
const website = new Bucket({
|
|
179
|
+
directoryUpload: {
|
|
180
|
+
directoryPath: './dist',
|
|
181
|
+
headersPreset: 'single-page-app'
|
|
182
|
+
},
|
|
183
|
+
cdn: {
|
|
184
|
+
enabled: true,
|
|
185
|
+
rewriteRoutesForSinglePageApp: true,
|
|
186
|
+
customDomains: stage === 'production' ? [{ domainName: 'mysite.com' }] : []
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
resources: { website }
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Build & Deploy
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Deploy (build runs automatically if configured)
|
|
200
|
+
stacktape deploy --stage dev --region us-east-1
|
|
201
|
+
|
|
202
|
+
# Or build manually first
|
|
203
|
+
npm run build
|
|
204
|
+
stacktape deploy --stage dev --region us-east-1
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Sync Without Full Deploy
|
|
208
|
+
|
|
209
|
+
Update website files without CloudFormation:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
stacktape bucket:sync --stage dev --region us-east-1 --resourceName website
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Edge Functions
|
|
216
|
+
|
|
217
|
+
Add authentication or request modification at the edge:
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
import { defineConfig, HostingBucket, EdgeLambdaFunction } from 'stacktape';
|
|
221
|
+
|
|
222
|
+
export default defineConfig(() => {
|
|
223
|
+
const authFunction = new EdgeLambdaFunction({
|
|
224
|
+
packaging: {
|
|
225
|
+
type: 'stacktape-lambda-buildpack',
|
|
226
|
+
properties: { entryfilePath: './edge/auth.ts' }
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
const website = new HostingBucket({
|
|
231
|
+
uploadDirectoryPath: './dist',
|
|
232
|
+
edgeFunctions: {
|
|
233
|
+
onRequest: 'authFunction'
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
return {
|
|
238
|
+
resources: { authFunction, website }
|
|
239
|
+
};
|
|
240
|
+
});
|
|
241
|
+
```
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
docType: troubleshooting
|
|
3
|
+
title: CloudFormation Stack States
|
|
4
|
+
tags:
|
|
5
|
+
- cloudformation
|
|
6
|
+
- stack
|
|
7
|
+
- states
|
|
8
|
+
- troubleshooting
|
|
9
|
+
source: docs/_curated-docs/troubleshooting/cloudformation-stack-states.mdx
|
|
10
|
+
priority: 2
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# CloudFormation Stack States
|
|
14
|
+
|
|
15
|
+
Every Stacktape deployment is backed by a CloudFormation stack. The stack has a **status** that reflects what happened during the
|
|
16
|
+
last operation (deploy, delete, rollback). Most of the time you won't need to think about this - but when a deployment fails, understanding
|
|
17
|
+
the stack state helps you recover quickly.
|
|
18
|
+
|
|
19
|
+
You can check the current state of your stacks using:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
stacktape info:stacks --region us-east-1
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Healthy States
|
|
26
|
+
|
|
27
|
+
These states mean your stack is working normally and ready for the next deploy or delete.
|
|
28
|
+
|
|
29
|
+
| State | Meaning |
|
|
30
|
+
| ----------------- | ---------------------------------------------------- |
|
|
31
|
+
| `CREATE_COMPLETE` | Stack was successfully created (first deploy). |
|
|
32
|
+
| `UPDATE_COMPLETE` | Stack was successfully updated. |
|
|
33
|
+
| `IMPORT_COMPLETE` | Resources were successfully imported into the stack. |
|
|
34
|
+
|
|
35
|
+
No action needed - you can run `deploy`, `delete`, or any other command.
|
|
36
|
+
|
|
37
|
+
## Failed / Needs Attention
|
|
38
|
+
|
|
39
|
+
These are the states you're most likely to encounter when something goes wrong.
|
|
40
|
+
|
|
41
|
+
### `UPDATE_FAILED`
|
|
42
|
+
|
|
43
|
+
**What happened:** A deployment failed mid-way. With `--disableAutoRollback` enabled, the stack stays in this state instead of
|
|
44
|
+
rolling back automatically.
|
|
45
|
+
|
|
46
|
+
**What to do:**
|
|
47
|
+
|
|
48
|
+
- **Option A** - Fix the issue and redeploy:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
stacktape deploy --stage <stage> --region <region>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Stacktape can deploy directly from `UPDATE_FAILED` state. It will attempt to apply your changes again.
|
|
55
|
+
|
|
56
|
+
- **Option B** - Roll back to the previous working state:
|
|
57
|
+
```bash
|
|
58
|
+
stacktape rollback --stage <stage> --region <region>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### `CREATE_FAILED`
|
|
62
|
+
|
|
63
|
+
**What happened:** The very first deployment of the stack failed.
|
|
64
|
+
|
|
65
|
+
**What to do:**
|
|
66
|
+
|
|
67
|
+
- Roll back the failed creation:
|
|
68
|
+
```bash
|
|
69
|
+
stacktape rollback --stage <stage> --region <region>
|
|
70
|
+
```
|
|
71
|
+
After rollback completes the stack will be in `ROLLBACK_COMPLETE` state. From there, delete it and start fresh:
|
|
72
|
+
```bash
|
|
73
|
+
stacktape delete --stage <stage> --region <region>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### `UPDATE_ROLLBACK_FAILED`
|
|
77
|
+
|
|
78
|
+
**What happened:** A deployment failed, and the automatic rollback also failed. This is the most problematic state.
|
|
79
|
+
|
|
80
|
+
**What to do:**
|
|
81
|
+
|
|
82
|
+
- Continue the rollback (optionally skipping problematic resources):
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
stacktape rollback --stage <stage> --region <region>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
If specific resources are blocking the rollback, skip them:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
stacktape rollback --stage <stage> --region <region> --resourcesToSkip MyResource1 MyResource2
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The `--resourcesToSkip` values are CloudFormation **logical resource IDs** (visible in the AWS CloudFormation console or in the
|
|
95
|
+
deployment error output).
|
|
96
|
+
|
|
97
|
+
- If rollback still fails, you may need to manually fix or delete the problematic resources in the AWS console, then retry.
|
|
98
|
+
|
|
99
|
+
### `UPDATE_ROLLBACK_COMPLETE`
|
|
100
|
+
|
|
101
|
+
**What happened:** A deployment failed but was successfully rolled back to the previous state.
|
|
102
|
+
|
|
103
|
+
**What to do:** Your stack is back to the last working version. Fix the issue in your configuration and redeploy:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
stacktape deploy --stage <stage> --region <region>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### `ROLLBACK_COMPLETE`
|
|
110
|
+
|
|
111
|
+
**What happened:** The first-ever deployment (`create`) failed and was rolled back. The stack exists but contains no resources.
|
|
112
|
+
|
|
113
|
+
**What to do:** Delete the empty stack and try again:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
stacktape delete --stage <stage> --region <region>
|
|
117
|
+
stacktape deploy --stage <stage> --region <region>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### `ROLLBACK_FAILED`
|
|
121
|
+
|
|
122
|
+
**What happened:** The first deployment failed and the rollback of that creation also failed.
|
|
123
|
+
|
|
124
|
+
**What to do:** Delete the stack (you may need to use the AWS console if some resources are stuck):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
stacktape delete --stage <stage> --region <region>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `DELETE_FAILED`
|
|
131
|
+
|
|
132
|
+
**What happened:** Some resources couldn't be deleted (e.g., non-empty S3 bucket, resource in use by another stack).
|
|
133
|
+
|
|
134
|
+
**What to do:**
|
|
135
|
+
|
|
136
|
+
1. Check which resources failed to delete (visible in the AWS CloudFormation console).
|
|
137
|
+
2. Manually resolve the issue (empty the bucket, remove dependencies, etc.).
|
|
138
|
+
3. Retry the delete:
|
|
139
|
+
```bash
|
|
140
|
+
stacktape delete --stage <stage> --region <region>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## In-Progress States
|
|
144
|
+
|
|
145
|
+
These states mean an operation is currently running. Stacktape automatically waits for these to complete before starting a new operation.
|
|
146
|
+
|
|
147
|
+
| State | Meaning |
|
|
148
|
+
| ---------------------------------------------- | -------------------------------------- |
|
|
149
|
+
| `CREATE_IN_PROGRESS` | Stack is being created. |
|
|
150
|
+
| `UPDATE_IN_PROGRESS` | Stack is being updated. |
|
|
151
|
+
| `DELETE_IN_PROGRESS` | Stack is being deleted. |
|
|
152
|
+
| `ROLLBACK_IN_PROGRESS` | Stack is rolling back a failed create. |
|
|
153
|
+
| `UPDATE_ROLLBACK_IN_PROGRESS` | Stack is rolling back a failed update. |
|
|
154
|
+
| `UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS` | Cleanup after a successful rollback. |
|
|
155
|
+
| `UPDATE_COMPLETE_CLEANUP_IN_PROGRESS` | Cleanup after a successful update. |
|
|
156
|
+
| `IMPORT_IN_PROGRESS` | Resources are being imported. |
|
|
157
|
+
| `IMPORT_ROLLBACK_IN_PROGRESS` | Import is being rolled back. |
|
|
158
|
+
|
|
159
|
+
If you try to run a Stacktape command while the stack is in one of these states, Stacktape will wait for the current operation
|
|
160
|
+
to finish before proceeding.
|
|
161
|
+
|
|
162
|
+
## Auto-Rollback Behavior
|
|
163
|
+
|
|
164
|
+
By default, Stacktape enables **auto-rollback**: if a deployment fails, CloudFormation automatically rolls back to the previous
|
|
165
|
+
working state. The stack ends up in `UPDATE_ROLLBACK_COMPLETE` (ready for the next deploy).
|
|
166
|
+
|
|
167
|
+
If you disable auto-rollback:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
stacktape deploy --stage <stage> --region <region> --disableAutoRollback
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
...a failed deployment leaves the stack in `UPDATE_FAILED`. This can be useful for debugging because you can inspect the
|
|
174
|
+
partially-updated resources, but you'll need to either redeploy or manually rollback before the stack is fully operational again.
|
|
175
|
+
|
|
176
|
+
## Quick Reference
|
|
177
|
+
|
|
178
|
+
| Stack State | Can Deploy? | Can Delete? | Can Rollback? | Recommended Action |
|
|
179
|
+
| -------------------------- | ----------- | ----------- | ------------- | ------------------------------------------- |
|
|
180
|
+
| `CREATE_COMPLETE` | Yes | Yes | - | None needed |
|
|
181
|
+
| `UPDATE_COMPLETE` | Yes | Yes | - | None needed |
|
|
182
|
+
| `UPDATE_FAILED` | Yes | Yes | Yes | Fix and redeploy, or rollback |
|
|
183
|
+
| `CREATE_FAILED` | - | - | Yes | Rollback, then delete |
|
|
184
|
+
| `UPDATE_ROLLBACK_COMPLETE` | Yes | Yes | - | Fix config and redeploy |
|
|
185
|
+
| `UPDATE_ROLLBACK_FAILED` | - | - | Yes | Rollback with `--resourcesToSkip` if needed |
|
|
186
|
+
| `ROLLBACK_COMPLETE` | Yes | Yes | - | Delete and redeploy |
|
|
187
|
+
| `ROLLBACK_FAILED` | - | Yes | - | Delete the stack |
|
|
188
|
+
| `DELETE_FAILED` | - | Yes | - | Fix blocking resources, retry delete |
|
|
189
|
+
| `*_IN_PROGRESS` | Waits | Waits | Waits | Wait for completion |
|
package/bin/stacktape.js
CHANGED
|
@@ -420,18 +420,6 @@ async function ensureBinary() {
|
|
|
420
420
|
}
|
|
421
421
|
}
|
|
422
422
|
|
|
423
|
-
function getManualInstallCommand(platformKey) {
|
|
424
|
-
const commands = {
|
|
425
|
-
'win32-x64': 'iwr https://installs.stacktape.com/windows.ps1 -useb | iex',
|
|
426
|
-
'linux-x64': 'curl -L https://installs.stacktape.com/linux.sh | sh',
|
|
427
|
-
'linux-arm64': 'curl -L https://installs.stacktape.com/linux-arm.sh | sh',
|
|
428
|
-
'linux-x64-musl': 'curl -L https://installs.stacktape.com/alpine.sh | sh',
|
|
429
|
-
'darwin-x64': 'curl -L https://installs.stacktape.com/macos.sh | sh',
|
|
430
|
-
'darwin-arm64': 'curl -L https://installs.stacktape.com/macos-arm.sh | sh'
|
|
431
|
-
};
|
|
432
|
-
return commands[platformKey] || 'See https://docs.stacktape.com for installation instructions';
|
|
433
|
-
}
|
|
434
|
-
|
|
435
423
|
function getGlobalBinaryPathIfVersionMatches() {
|
|
436
424
|
const binaryName = platform() === 'win32' ? 'stacktape.exe' : 'stacktape';
|
|
437
425
|
const globalDir = join(homedir(), '.stacktape', 'bin');
|