@sst-community/sst 4.19.0 → 5.0.0-alpha.1

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.
Files changed (832) hide show
  1. package/README.md +92 -52
  2. package/package.json +35 -11
  3. package/platform/js/chunks/chunk-HIZZCEDS.js +328 -0
  4. package/platform/js/chunks/chunk-HIZZCEDS.js.map +6 -0
  5. package/platform/js/chunks/chunk-KOKHGKJ2.js +639 -0
  6. package/platform/js/chunks/chunk-KOKHGKJ2.js.map +6 -0
  7. package/platform/js/chunks/chunk-ONNI4XNK.js +367 -0
  8. package/platform/js/chunks/chunk-ONNI4XNK.js.map +6 -0
  9. package/platform/js/chunks/chunk-VIFHC73J.js +108 -0
  10. package/platform/js/chunks/chunk-VIFHC73J.js.map +6 -0
  11. package/platform/js/chunks/chunk-WJ6BVA46.js +10 -0
  12. package/platform/js/chunks/chunk-WJ6BVA46.js.map +6 -0
  13. package/platform/js/chunks/chunk-ZOXXXME5.js +472 -0
  14. package/platform/js/chunks/chunk-ZOXXXME5.js.map +6 -0
  15. package/platform/js/chunks/component-32FCLIRK.js +26 -0
  16. package/platform/js/chunks/component-32FCLIRK.js.map +6 -0
  17. package/platform/js/chunks/config-DMGMTLNB.js +10 -0
  18. package/platform/js/chunks/config-DMGMTLNB.js.map +6 -0
  19. package/platform/js/chunks/link-OJ3RNGQ3.js +9 -0
  20. package/platform/js/chunks/link-OJ3RNGQ3.js.map +6 -0
  21. package/platform/js/components/aws/index.js +35362 -0
  22. package/platform/js/components/aws/index.js.map +6 -0
  23. package/platform/js/components/cloudflare/index.js +3246 -0
  24. package/platform/js/components/cloudflare/index.js.map +6 -0
  25. package/platform/js/components/core.js +114 -0
  26. package/platform/js/components/core.js.map +6 -0
  27. package/platform/js/components/vercel/index.js +120 -0
  28. package/platform/js/components/vercel/index.js.map +6 -0
  29. package/platform/js/testing/index.js +569 -0
  30. package/platform/js/testing/index.js.map +6 -0
  31. package/platform/package.json +25 -0
  32. package/platform/src/ast/add.mjs +190 -0
  33. package/platform/src/auto/run.ts +109 -0
  34. package/platform/src/components/README.md +652 -0
  35. package/platform/src/components/args.ts +133 -0
  36. package/platform/src/components/aws/alb.ts +577 -0
  37. package/platform/src/components/aws/analog.ts +462 -0
  38. package/platform/src/components/aws/apigateway-websocket-route.ts +206 -0
  39. package/platform/src/components/aws/apigateway-websocket.ts +894 -0
  40. package/platform/src/components/aws/apigatewayv1-api-key.ts +90 -0
  41. package/platform/src/components/aws/apigatewayv1-authorizer.ts +178 -0
  42. package/platform/src/components/aws/apigatewayv1-base-route.ts +78 -0
  43. package/platform/src/components/aws/apigatewayv1-integration-route.ts +92 -0
  44. package/platform/src/components/aws/apigatewayv1-lambda-route.ts +152 -0
  45. package/platform/src/components/aws/apigatewayv1-usage-plan.ts +109 -0
  46. package/platform/src/components/aws/apigatewayv1.ts +1691 -0
  47. package/platform/src/components/aws/apigatewayv2-authorizer.ts +199 -0
  48. package/platform/src/components/aws/apigatewayv2-base-route.ts +69 -0
  49. package/platform/src/components/aws/apigatewayv2-lambda-route.ts +141 -0
  50. package/platform/src/components/aws/apigatewayv2-private-route.ts +101 -0
  51. package/platform/src/components/aws/apigatewayv2-url-route.ts +90 -0
  52. package/platform/src/components/aws/apigatewayv2.ts +1439 -0
  53. package/platform/src/components/aws/app-sync-data-source.ts +264 -0
  54. package/platform/src/components/aws/app-sync-function.ts +79 -0
  55. package/platform/src/components/aws/app-sync-resolver.ts +110 -0
  56. package/platform/src/components/aws/app-sync.ts +849 -0
  57. package/platform/src/components/aws/astro.ts +580 -0
  58. package/platform/src/components/aws/aurora.ts +1356 -0
  59. package/platform/src/components/aws/auth-v1.ts +69 -0
  60. package/platform/src/components/aws/auth.ts +417 -0
  61. package/platform/src/components/aws/bucket-lambda-subscriber.ts +162 -0
  62. package/platform/src/components/aws/bucket-notification.ts +254 -0
  63. package/platform/src/components/aws/bucket-queue-subscriber.ts +122 -0
  64. package/platform/src/components/aws/bucket-topic-subscriber.ts +144 -0
  65. package/platform/src/components/aws/bucket.ts +2046 -0
  66. package/platform/src/components/aws/bus-base-subscriber.ts +52 -0
  67. package/platform/src/components/aws/bus-lambda-subscriber.ts +125 -0
  68. package/platform/src/components/aws/bus-queue-subscriber.ts +88 -0
  69. package/platform/src/components/aws/bus.ts +630 -0
  70. package/platform/src/components/aws/cdn.ts +561 -0
  71. package/platform/src/components/aws/cluster-v1.ts +932 -0
  72. package/platform/src/components/aws/cluster.ts +584 -0
  73. package/platform/src/components/aws/cognito-identity-pool.ts +433 -0
  74. package/platform/src/components/aws/cognito-identity-provider.ts +96 -0
  75. package/platform/src/components/aws/cognito-user-pool-client.ts +114 -0
  76. package/platform/src/components/aws/cognito-user-pool.ts +1089 -0
  77. package/platform/src/components/aws/cron-v2.ts +555 -0
  78. package/platform/src/components/aws/cron.ts +435 -0
  79. package/platform/src/components/aws/dns-validated-certificate.ts +108 -0
  80. package/platform/src/components/aws/dns.ts +221 -0
  81. package/platform/src/components/aws/dsql.ts +741 -0
  82. package/platform/src/components/aws/dynamo-lambda-subscriber.ts +124 -0
  83. package/platform/src/components/aws/dynamo.ts +929 -0
  84. package/platform/src/components/aws/efs.ts +410 -0
  85. package/platform/src/components/aws/email.ts +673 -0
  86. package/platform/src/components/aws/fargate.ts +1279 -0
  87. package/platform/src/components/aws/function.ts +3227 -0
  88. package/platform/src/components/aws/helpers/apigateway-account.ts +78 -0
  89. package/platform/src/components/aws/helpers/apigatewayv2-domain.ts +144 -0
  90. package/platform/src/components/aws/helpers/arn.ts +182 -0
  91. package/platform/src/components/aws/helpers/bootstrap.ts +16 -0
  92. package/platform/src/components/aws/helpers/client.ts +76 -0
  93. package/platform/src/components/aws/helpers/container-builder.ts +33 -0
  94. package/platform/src/components/aws/helpers/custom-domain.ts +128 -0
  95. package/platform/src/components/aws/helpers/event-source.ts +41 -0
  96. package/platform/src/components/aws/helpers/fargate.ts +727 -0
  97. package/platform/src/components/aws/helpers/function-builder.ts +133 -0
  98. package/platform/src/components/aws/helpers/function-code.ts +224 -0
  99. package/platform/src/components/aws/helpers/function-part.ts +202 -0
  100. package/platform/src/components/aws/helpers/function-permission.ts +29 -0
  101. package/platform/src/components/aws/helpers/load-balancer-args.ts +88 -0
  102. package/platform/src/components/aws/helpers/load-balancer.ts +17 -0
  103. package/platform/src/components/aws/helpers/provider.ts +36 -0
  104. package/platform/src/components/aws/helpers/queue-policy.ts +33 -0
  105. package/platform/src/components/aws/helpers/rds.ts +212 -0
  106. package/platform/src/components/aws/helpers/site-builder.ts +41 -0
  107. package/platform/src/components/aws/helpers/subscriber.ts +23 -0
  108. package/platform/src/components/aws/helpers/vpc.ts +27 -0
  109. package/platform/src/components/aws/https-redirect.ts +216 -0
  110. package/platform/src/components/aws/iam-edit.ts +50 -0
  111. package/platform/src/components/aws/index.ts +61 -0
  112. package/platform/src/components/aws/kinesis-stream-lambda-subscriber.ts +122 -0
  113. package/platform/src/components/aws/kinesis-stream.ts +416 -0
  114. package/platform/src/components/aws/linkable.ts +32 -0
  115. package/platform/src/components/aws/logging.ts +25 -0
  116. package/platform/src/components/aws/microvm.ts +988 -0
  117. package/platform/src/components/aws/mysql.ts +1047 -0
  118. package/platform/src/components/aws/nextjs.ts +1052 -0
  119. package/platform/src/components/aws/nuxt.ts +527 -0
  120. package/platform/src/components/aws/open-search.ts +603 -0
  121. package/platform/src/components/aws/opencontrol.ts +235 -0
  122. package/platform/src/components/aws/permission.ts +80 -0
  123. package/platform/src/components/aws/postgres-v1.ts +537 -0
  124. package/platform/src/components/aws/postgres.ts +1074 -0
  125. package/platform/src/components/aws/providers/bucket-files.ts +32 -0
  126. package/platform/src/components/aws/providers/distribution-deployment-waiter.ts +27 -0
  127. package/platform/src/components/aws/providers/distribution-invalidation.ts +24 -0
  128. package/platform/src/components/aws/providers/function-environment-update.ts +46 -0
  129. package/platform/src/components/aws/providers/hosted-zone-lookup.ts +25 -0
  130. package/platform/src/components/aws/providers/kv-keys.ts +15 -0
  131. package/platform/src/components/aws/providers/kv-routes-update.ts +24 -0
  132. package/platform/src/components/aws/providers/microvm-image-prune.ts +48 -0
  133. package/platform/src/components/aws/providers/origin-access-control.ts +21 -0
  134. package/platform/src/components/aws/providers/rds-role-lookup.ts +21 -0
  135. package/platform/src/components/aws/providers/vector-table.ts +25 -0
  136. package/platform/src/components/aws/queue-lambda-subscriber.ts +135 -0
  137. package/platform/src/components/aws/queue.ts +712 -0
  138. package/platform/src/components/aws/react.ts +510 -0
  139. package/platform/src/components/aws/realtime-lambda-subscriber.ts +129 -0
  140. package/platform/src/components/aws/realtime.ts +345 -0
  141. package/platform/src/components/aws/redis-v1.ts +595 -0
  142. package/platform/src/components/aws/redis.ts +1078 -0
  143. package/platform/src/components/aws/remix.ts +576 -0
  144. package/platform/src/components/aws/router-base-route.ts +83 -0
  145. package/platform/src/components/aws/router-bucket-route.ts +63 -0
  146. package/platform/src/components/aws/router-url-route.ts +75 -0
  147. package/platform/src/components/aws/router.ts +3281 -0
  148. package/platform/src/components/aws/service-v1.ts +876 -0
  149. package/platform/src/components/aws/service.ts +2994 -0
  150. package/platform/src/components/aws/sns-topic-lambda-subscriber.ts +127 -0
  151. package/platform/src/components/aws/sns-topic-queue-subscriber.ts +105 -0
  152. package/platform/src/components/aws/sns-topic.ts +700 -0
  153. package/platform/src/components/aws/solid-start.ts +467 -0
  154. package/platform/src/components/aws/ssr-site.ts +2204 -0
  155. package/platform/src/components/aws/static-site.ts +1389 -0
  156. package/platform/src/components/aws/step-functions/choice.ts +123 -0
  157. package/platform/src/components/aws/step-functions/fail.ts +69 -0
  158. package/platform/src/components/aws/step-functions/map.ts +264 -0
  159. package/platform/src/components/aws/step-functions/parallel.ts +170 -0
  160. package/platform/src/components/aws/step-functions/pass.ts +48 -0
  161. package/platform/src/components/aws/step-functions/state.ts +376 -0
  162. package/platform/src/components/aws/step-functions/succeed.ts +31 -0
  163. package/platform/src/components/aws/step-functions/task.ts +538 -0
  164. package/platform/src/components/aws/step-functions/wait.ts +105 -0
  165. package/platform/src/components/aws/step-functions.ts +804 -0
  166. package/platform/src/components/aws/svelte-kit.ts +563 -0
  167. package/platform/src/components/aws/takeover/alb.ts +9 -0
  168. package/platform/src/components/aws/takeover/apigatewayv2.ts +43 -0
  169. package/platform/src/components/aws/takeover/app-sync.ts +45 -0
  170. package/platform/src/components/aws/takeover/aurora.ts +19 -0
  171. package/platform/src/components/aws/takeover/bucket.ts +94 -0
  172. package/platform/src/components/aws/takeover/bus.ts +43 -0
  173. package/platform/src/components/aws/takeover/cognito-user-pool.ts +21 -0
  174. package/platform/src/components/aws/takeover/cron-v2.ts +9 -0
  175. package/platform/src/components/aws/takeover/dsql.ts +12 -0
  176. package/platform/src/components/aws/takeover/dynamo.ts +31 -0
  177. package/platform/src/components/aws/takeover/efs.ts +9 -0
  178. package/platform/src/components/aws/takeover/function.ts +21 -0
  179. package/platform/src/components/aws/takeover/helpers.ts +26 -0
  180. package/platform/src/components/aws/takeover/index.ts +27 -0
  181. package/platform/src/components/aws/takeover/mysql.ts +17 -0
  182. package/platform/src/components/aws/takeover/postgres.ts +17 -0
  183. package/platform/src/components/aws/takeover/queue.ts +21 -0
  184. package/platform/src/components/aws/takeover/redis.ts +10 -0
  185. package/platform/src/components/aws/takeover/service.ts +22 -0
  186. package/platform/src/components/aws/takeover/sns-topic.ts +27 -0
  187. package/platform/src/components/aws/takeover/task.ts +13 -0
  188. package/platform/src/components/aws/tan-stack-start.ts +479 -0
  189. package/platform/src/components/aws/task.ts +571 -0
  190. package/platform/src/components/aws/v5/alb.ts +310 -0
  191. package/platform/src/components/aws/v5/apigatewayv2.ts +845 -0
  192. package/platform/src/components/aws/v5/app-sync.ts +673 -0
  193. package/platform/src/components/aws/v5/aurora.ts +855 -0
  194. package/platform/src/components/aws/v5/bucket.ts +1001 -0
  195. package/platform/src/components/aws/v5/bus.ts +321 -0
  196. package/platform/src/components/aws/v5/cluster.ts +230 -0
  197. package/platform/src/components/aws/v5/cognito-user-pool-client.ts +100 -0
  198. package/platform/src/components/aws/v5/cognito-user-pool.ts +693 -0
  199. package/platform/src/components/aws/v5/cron-v2.ts +316 -0
  200. package/platform/src/components/aws/v5/dsql.ts +665 -0
  201. package/platform/src/components/aws/v5/dynamo.ts +477 -0
  202. package/platform/src/components/aws/v5/efs.ts +311 -0
  203. package/platform/src/components/aws/v5/function.ts +1527 -0
  204. package/platform/src/components/aws/v5/index.ts +26 -0
  205. package/platform/src/components/aws/v5/mysql.ts +604 -0
  206. package/platform/src/components/aws/v5/postgres.ts +612 -0
  207. package/platform/src/components/aws/v5/queue.ts +271 -0
  208. package/platform/src/components/aws/v5/redis.ts +550 -0
  209. package/platform/src/components/aws/v5/service.ts +2209 -0
  210. package/platform/src/components/aws/v5/sns-topic.ts +284 -0
  211. package/platform/src/components/aws/v5/task.ts +549 -0
  212. package/platform/src/components/aws/vector.ts +316 -0
  213. package/platform/src/components/aws/vpc-v1.ts +580 -0
  214. package/platform/src/components/aws/vpc.ts +1641 -0
  215. package/platform/src/components/aws/workflow.ts +421 -0
  216. package/platform/src/components/base/base-site.ts +101 -0
  217. package/platform/src/components/base/base-ssr-site.ts +120 -0
  218. package/platform/src/components/base/base-static-site.ts +314 -0
  219. package/platform/src/components/cloudflare/account-id.ts +1 -0
  220. package/platform/src/components/cloudflare/ai.ts +77 -0
  221. package/platform/src/components/cloudflare/astro.ts +355 -0
  222. package/platform/src/components/cloudflare/auth.ts +69 -0
  223. package/platform/src/components/cloudflare/binding.ts +132 -0
  224. package/platform/src/components/cloudflare/bucket.ts +142 -0
  225. package/platform/src/components/cloudflare/cron.ts +207 -0
  226. package/platform/src/components/cloudflare/d1.ts +230 -0
  227. package/platform/src/components/cloudflare/dns.ts +253 -0
  228. package/platform/src/components/cloudflare/durable-object.ts +144 -0
  229. package/platform/src/components/cloudflare/experimental/index.ts +3 -0
  230. package/platform/src/components/cloudflare/experimental/solid-start.ts +288 -0
  231. package/platform/src/components/cloudflare/experimental/static-site.ts +4 -0
  232. package/platform/src/components/cloudflare/helpers/compatibility.ts +44 -0
  233. package/platform/src/components/cloudflare/helpers/fetch.ts +81 -0
  234. package/platform/src/components/cloudflare/helpers/validation.ts +74 -0
  235. package/platform/src/components/cloudflare/helpers/worker-builder.ts +57 -0
  236. package/platform/src/components/cloudflare/helpers/wrangler.ts +222 -0
  237. package/platform/src/components/cloudflare/hyperdrive.ts +402 -0
  238. package/platform/src/components/cloudflare/index.ts +25 -0
  239. package/platform/src/components/cloudflare/kv.ts +218 -0
  240. package/platform/src/components/cloudflare/providers/dns-record.ts +43 -0
  241. package/platform/src/components/cloudflare/providers/kv-data.ts +107 -0
  242. package/platform/src/components/cloudflare/providers/worker-assets.ts +41 -0
  243. package/platform/src/components/cloudflare/providers/worker-placement.ts +93 -0
  244. package/platform/src/components/cloudflare/providers/worker-script.ts +47 -0
  245. package/platform/src/components/cloudflare/providers/worker-url.ts +109 -0
  246. package/platform/src/components/cloudflare/providers/zone-lookup.ts +85 -0
  247. package/platform/src/components/cloudflare/queue-worker-subscriber.ts +192 -0
  248. package/platform/src/components/cloudflare/queue.ts +310 -0
  249. package/platform/src/components/cloudflare/rate-limit.ts +178 -0
  250. package/platform/src/components/cloudflare/react-router.ts +322 -0
  251. package/platform/src/components/cloudflare/ssr-site.ts +293 -0
  252. package/platform/src/components/cloudflare/static-site-v2.ts +428 -0
  253. package/platform/src/components/cloudflare/static-site.ts +470 -0
  254. package/platform/src/components/cloudflare/tan-stack-start.ts +408 -0
  255. package/platform/src/components/cloudflare/worker.ts +1080 -0
  256. package/platform/src/components/cloudflare/workflow.ts +319 -0
  257. package/platform/src/components/component.ts +242 -0
  258. package/platform/src/components/core.ts +43 -0
  259. package/platform/src/components/cpu.ts +10 -0
  260. package/platform/src/components/dns.ts +82 -0
  261. package/platform/src/components/duration.ts +67 -0
  262. package/platform/src/components/error.ts +5 -0
  263. package/platform/src/components/esbuild.ts +15 -0
  264. package/platform/src/components/experimental/dev-command.ts +127 -0
  265. package/platform/src/components/experimental/index.ts +1 -0
  266. package/platform/src/components/groups.ts +9 -0
  267. package/platform/src/components/index.ts +9 -0
  268. package/platform/src/components/input.ts +2 -0
  269. package/platform/src/components/link.ts +201 -0
  270. package/platform/src/components/linkable.ts +360 -0
  271. package/platform/src/components/naming-rules.ts +299 -0
  272. package/platform/src/components/naming.ts +189 -0
  273. package/platform/src/components/parts-component.ts +662 -0
  274. package/platform/src/components/parts.ts +299 -0
  275. package/platform/src/components/path.ts +5 -0
  276. package/platform/src/components/rpc/rpc.ts +110 -0
  277. package/platform/src/components/secret.ts +159 -0
  278. package/platform/src/components/size.ts +28 -0
  279. package/platform/src/components/takeover.ts +131 -0
  280. package/platform/src/components/transform.ts +107 -0
  281. package/platform/src/components/vercel/account-id.ts +1 -0
  282. package/platform/src/components/vercel/dns.ts +171 -0
  283. package/platform/src/components/vercel/index.ts +2 -0
  284. package/platform/src/components/vercel/providers/dns-record.ts +34 -0
  285. package/platform/src/config.ts +1460 -0
  286. package/platform/src/global-aliases.d.ts +37 -0
  287. package/platform/src/global.d.ts +374 -0
  288. package/platform/src/internal.d.ts +18 -0
  289. package/platform/src/runtime/worker/unenv.d.ts +14 -0
  290. package/platform/src/runtime/worker/unenv.mjs +26 -0
  291. package/platform/src/shim/run.js +25 -0
  292. package/platform/src/testing/global.ts +83 -0
  293. package/platform/src/testing/index.ts +103 -0
  294. package/platform/src/testing/mock.ts +646 -0
  295. package/platform/src/testing/vitest.ts +36 -0
  296. package/platform/src/util/compare-semver.ts +23 -0
  297. package/platform/src/util/fs.ts +49 -0
  298. package/platform/src/util/lazy.ts +12 -0
  299. package/platform/src/util/minify.ts +10 -0
  300. package/platform/src/util/package.ts +29 -0
  301. package/platform/src/util/semaphore.ts +29 -0
  302. package/platform/src/util/warn.ts +7 -0
  303. package/platform/types/auto/run.d.ts +9 -0
  304. package/platform/types/auto/run.d.ts.map +1 -0
  305. package/platform/types/components/args.d.ts +77 -0
  306. package/platform/types/components/args.d.ts.map +1 -0
  307. package/platform/types/components/aws/alb.d.ts +283 -0
  308. package/platform/types/components/aws/alb.d.ts.map +1 -0
  309. package/platform/types/components/aws/analog.d.ts +408 -0
  310. package/platform/types/components/aws/analog.d.ts.map +1 -0
  311. package/platform/types/components/aws/apigateway-websocket-route.d.ts +74 -0
  312. package/platform/types/components/aws/apigateway-websocket-route.d.ts.map +1 -0
  313. package/platform/types/components/aws/apigateway-websocket.d.ts +560 -0
  314. package/platform/types/components/aws/apigateway-websocket.d.ts.map +1 -0
  315. package/platform/types/components/aws/apigatewayv1-api-key.d.ts +48 -0
  316. package/platform/types/components/aws/apigatewayv1-api-key.d.ts.map +1 -0
  317. package/platform/types/components/aws/apigatewayv1-authorizer.d.ts +55 -0
  318. package/platform/types/components/aws/apigatewayv1-authorizer.d.ts.map +1 -0
  319. package/platform/types/components/aws/apigatewayv1-base-route.d.ts +36 -0
  320. package/platform/types/components/aws/apigatewayv1-base-route.d.ts.map +1 -0
  321. package/platform/types/components/aws/apigatewayv1-integration-route.d.ts +39 -0
  322. package/platform/types/components/aws/apigatewayv1-integration-route.d.ts.map +1 -0
  323. package/platform/types/components/aws/apigatewayv1-lambda-route.d.ts +53 -0
  324. package/platform/types/components/aws/apigatewayv1-lambda-route.d.ts.map +1 -0
  325. package/platform/types/components/aws/apigatewayv1-usage-plan.d.ts +53 -0
  326. package/platform/types/components/aws/apigatewayv1-usage-plan.d.ts.map +1 -0
  327. package/platform/types/components/aws/apigatewayv1.d.ts +1028 -0
  328. package/platform/types/components/aws/apigatewayv1.d.ts.map +1 -0
  329. package/platform/types/components/aws/apigatewayv2-authorizer.d.ts +54 -0
  330. package/platform/types/components/aws/apigatewayv2-authorizer.d.ts.map +1 -0
  331. package/platform/types/components/aws/apigatewayv2-base-route.d.ts +28 -0
  332. package/platform/types/components/aws/apigatewayv2-base-route.d.ts.map +1 -0
  333. package/platform/types/components/aws/apigatewayv2-lambda-route.d.ts +59 -0
  334. package/platform/types/components/aws/apigatewayv2-lambda-route.d.ts.map +1 -0
  335. package/platform/types/components/aws/apigatewayv2-private-route.d.ts +54 -0
  336. package/platform/types/components/aws/apigatewayv2-private-route.d.ts.map +1 -0
  337. package/platform/types/components/aws/apigatewayv2-url-route.d.ts +44 -0
  338. package/platform/types/components/aws/apigatewayv2-url-route.d.ts.map +1 -0
  339. package/platform/types/components/aws/apigatewayv2.d.ts +955 -0
  340. package/platform/types/components/aws/apigatewayv2.d.ts.map +1 -0
  341. package/platform/types/components/aws/app-sync-data-source.d.ts +52 -0
  342. package/platform/types/components/aws/app-sync-data-source.d.ts.map +1 -0
  343. package/platform/types/components/aws/app-sync-function.d.ts +33 -0
  344. package/platform/types/components/aws/app-sync-function.d.ts.map +1 -0
  345. package/platform/types/components/aws/app-sync-resolver.d.ts +41 -0
  346. package/platform/types/components/aws/app-sync-resolver.d.ts.map +1 -0
  347. package/platform/types/components/aws/app-sync.d.ts +638 -0
  348. package/platform/types/components/aws/app-sync.d.ts.map +1 -0
  349. package/platform/types/components/aws/astro.d.ts +409 -0
  350. package/platform/types/components/aws/astro.d.ts.map +1 -0
  351. package/platform/types/components/aws/aurora.d.ts +720 -0
  352. package/platform/types/components/aws/aurora.d.ts.map +1 -0
  353. package/platform/types/components/aws/auth-v1.d.ts +26 -0
  354. package/platform/types/components/aws/auth-v1.d.ts.map +1 -0
  355. package/platform/types/components/aws/auth.d.ts +295 -0
  356. package/platform/types/components/aws/auth.d.ts.map +1 -0
  357. package/platform/types/components/aws/bucket-lambda-subscriber.d.ts +61 -0
  358. package/platform/types/components/aws/bucket-lambda-subscriber.d.ts.map +1 -0
  359. package/platform/types/components/aws/bucket-notification.d.ts +47 -0
  360. package/platform/types/components/aws/bucket-notification.d.ts.map +1 -0
  361. package/platform/types/components/aws/bucket-queue-subscriber.d.ts +55 -0
  362. package/platform/types/components/aws/bucket-queue-subscriber.d.ts.map +1 -0
  363. package/platform/types/components/aws/bucket-topic-subscriber.d.ts +55 -0
  364. package/platform/types/components/aws/bucket-topic-subscriber.d.ts.map +1 -0
  365. package/platform/types/components/aws/bucket.d.ts +1356 -0
  366. package/platform/types/components/aws/bucket.d.ts.map +1 -0
  367. package/platform/types/components/aws/bus-base-subscriber.d.ts +20 -0
  368. package/platform/types/components/aws/bus-base-subscriber.d.ts.map +1 -0
  369. package/platform/types/components/aws/bus-lambda-subscriber.d.ts +50 -0
  370. package/platform/types/components/aws/bus-lambda-subscriber.d.ts.map +1 -0
  371. package/platform/types/components/aws/bus-queue-subscriber.d.ts +44 -0
  372. package/platform/types/components/aws/bus-queue-subscriber.d.ts.map +1 -0
  373. package/platform/types/components/aws/bus.d.ts +447 -0
  374. package/platform/types/components/aws/bus.d.ts.map +1 -0
  375. package/platform/types/components/aws/cdn.d.ts +310 -0
  376. package/platform/types/components/aws/cdn.d.ts.map +1 -0
  377. package/platform/types/components/aws/cluster-v1.d.ts +885 -0
  378. package/platform/types/components/aws/cluster-v1.d.ts.map +1 -0
  379. package/platform/types/components/aws/cluster.d.ts +364 -0
  380. package/platform/types/components/aws/cluster.d.ts.map +1 -0
  381. package/platform/types/components/aws/cognito-identity-pool.d.ts +199 -0
  382. package/platform/types/components/aws/cognito-identity-pool.d.ts.map +1 -0
  383. package/platform/types/components/aws/cognito-identity-provider.d.ts +38 -0
  384. package/platform/types/components/aws/cognito-identity-provider.d.ts.map +1 -0
  385. package/platform/types/components/aws/cognito-user-pool-client.d.ts +50 -0
  386. package/platform/types/components/aws/cognito-user-pool-client.d.ts.map +1 -0
  387. package/platform/types/components/aws/cognito-user-pool.d.ts +703 -0
  388. package/platform/types/components/aws/cognito-user-pool.d.ts.map +1 -0
  389. package/platform/types/components/aws/cron-v2.d.ts +325 -0
  390. package/platform/types/components/aws/cron-v2.d.ts.map +1 -0
  391. package/platform/types/components/aws/cron.d.ts +259 -0
  392. package/platform/types/components/aws/cron.d.ts.map +1 -0
  393. package/platform/types/components/aws/dns-validated-certificate.d.ts +27 -0
  394. package/platform/types/components/aws/dns-validated-certificate.d.ts.map +1 -0
  395. package/platform/types/components/aws/dns.d.ts +94 -0
  396. package/platform/types/components/aws/dns.d.ts.map +1 -0
  397. package/platform/types/components/aws/dsql.d.ts +369 -0
  398. package/platform/types/components/aws/dsql.d.ts.map +1 -0
  399. package/platform/types/components/aws/dynamo-lambda-subscriber.d.ts +55 -0
  400. package/platform/types/components/aws/dynamo-lambda-subscriber.d.ts.map +1 -0
  401. package/platform/types/components/aws/dynamo.d.ts +628 -0
  402. package/platform/types/components/aws/dynamo.d.ts.map +1 -0
  403. package/platform/types/components/aws/efs.d.ts +217 -0
  404. package/platform/types/components/aws/efs.d.ts.map +1 -0
  405. package/platform/types/components/aws/email.d.ts +370 -0
  406. package/platform/types/components/aws/email.d.ts.map +1 -0
  407. package/platform/types/components/aws/fargate.d.ts +894 -0
  408. package/platform/types/components/aws/fargate.d.ts.map +1 -0
  409. package/platform/types/components/aws/function.d.ts +1755 -0
  410. package/platform/types/components/aws/function.d.ts.map +1 -0
  411. package/platform/types/components/aws/helpers/apigateway-account.d.ts +3 -0
  412. package/platform/types/components/aws/helpers/apigateway-account.d.ts.map +1 -0
  413. package/platform/types/components/aws/helpers/apigatewayv2-domain.d.ts +144 -0
  414. package/platform/types/components/aws/helpers/apigatewayv2-domain.d.ts.map +1 -0
  415. package/platform/types/components/aws/helpers/arn.d.ts +51 -0
  416. package/platform/types/components/aws/helpers/arn.d.ts.map +1 -0
  417. package/platform/types/components/aws/helpers/bootstrap.d.ts +13 -0
  418. package/platform/types/components/aws/helpers/bootstrap.d.ts.map +1 -0
  419. package/platform/types/components/aws/helpers/client.d.ts +7 -0
  420. package/platform/types/components/aws/helpers/client.d.ts.map +1 -0
  421. package/platform/types/components/aws/helpers/container-builder.d.ts +4 -0
  422. package/platform/types/components/aws/helpers/container-builder.d.ts.map +1 -0
  423. package/platform/types/components/aws/helpers/custom-domain.d.ts +111 -0
  424. package/platform/types/components/aws/helpers/custom-domain.d.ts.map +1 -0
  425. package/platform/types/components/aws/helpers/event-source.d.ts +26 -0
  426. package/platform/types/components/aws/helpers/event-source.d.ts.map +1 -0
  427. package/platform/types/components/aws/helpers/fargate.d.ts +225 -0
  428. package/platform/types/components/aws/helpers/fargate.d.ts.map +1 -0
  429. package/platform/types/components/aws/helpers/function-builder.d.ts +14 -0
  430. package/platform/types/components/aws/helpers/function-builder.d.ts.map +1 -0
  431. package/platform/types/components/aws/helpers/function-code.d.ts +80 -0
  432. package/platform/types/components/aws/helpers/function-code.d.ts.map +1 -0
  433. package/platform/types/components/aws/helpers/function-part.d.ts +61 -0
  434. package/platform/types/components/aws/helpers/function-part.d.ts.map +1 -0
  435. package/platform/types/components/aws/helpers/function-permission.d.ts +17 -0
  436. package/platform/types/components/aws/helpers/function-permission.d.ts.map +1 -0
  437. package/platform/types/components/aws/helpers/load-balancer-args.d.ts +40 -0
  438. package/platform/types/components/aws/helpers/load-balancer-args.d.ts.map +1 -0
  439. package/platform/types/components/aws/helpers/load-balancer.d.ts +9 -0
  440. package/platform/types/components/aws/helpers/load-balancer.d.ts.map +1 -0
  441. package/platform/types/components/aws/helpers/provider.d.ts +3 -0
  442. package/platform/types/components/aws/helpers/provider.d.ts.map +1 -0
  443. package/platform/types/components/aws/helpers/queue-policy.d.ts +11 -0
  444. package/platform/types/components/aws/helpers/queue-policy.d.ts.map +1 -0
  445. package/platform/types/components/aws/helpers/rds.d.ts +98 -0
  446. package/platform/types/components/aws/helpers/rds.d.ts.map +1 -0
  447. package/platform/types/components/aws/helpers/site-builder.d.ts +4 -0
  448. package/platform/types/components/aws/helpers/site-builder.d.ts.map +1 -0
  449. package/platform/types/components/aws/helpers/subscriber.d.ts +6 -0
  450. package/platform/types/components/aws/helpers/subscriber.d.ts.map +1 -0
  451. package/platform/types/components/aws/helpers/vpc.d.ts +14 -0
  452. package/platform/types/components/aws/helpers/vpc.d.ts.map +1 -0
  453. package/platform/types/components/aws/https-redirect.d.ts +38 -0
  454. package/platform/types/components/aws/https-redirect.d.ts.map +1 -0
  455. package/platform/types/components/aws/iam-edit.d.ts +39 -0
  456. package/platform/types/components/aws/iam-edit.d.ts.map +1 -0
  457. package/platform/types/components/aws/index.d.ts +56 -0
  458. package/platform/types/components/aws/index.d.ts.map +1 -0
  459. package/platform/types/components/aws/kinesis-stream-lambda-subscriber.d.ts +49 -0
  460. package/platform/types/components/aws/kinesis-stream-lambda-subscriber.d.ts.map +1 -0
  461. package/platform/types/components/aws/kinesis-stream.d.ts +254 -0
  462. package/platform/types/components/aws/kinesis-stream.d.ts.map +1 -0
  463. package/platform/types/components/aws/linkable.d.ts +17 -0
  464. package/platform/types/components/aws/linkable.d.ts.map +1 -0
  465. package/platform/types/components/aws/logging.d.ts +26 -0
  466. package/platform/types/components/aws/logging.d.ts.map +1 -0
  467. package/platform/types/components/aws/microvm.d.ts +439 -0
  468. package/platform/types/components/aws/microvm.d.ts.map +1 -0
  469. package/platform/types/components/aws/mysql.d.ts +525 -0
  470. package/platform/types/components/aws/mysql.d.ts.map +1 -0
  471. package/platform/types/components/aws/nextjs.d.ts +534 -0
  472. package/platform/types/components/aws/nextjs.d.ts.map +1 -0
  473. package/platform/types/components/aws/nuxt.d.ts +480 -0
  474. package/platform/types/components/aws/nuxt.d.ts.map +1 -0
  475. package/platform/types/components/aws/open-search.d.ts +306 -0
  476. package/platform/types/components/aws/open-search.d.ts.map +1 -0
  477. package/platform/types/components/aws/opencontrol.d.ts +169 -0
  478. package/platform/types/components/aws/opencontrol.d.ts.map +1 -0
  479. package/platform/types/components/aws/permission.d.ts +80 -0
  480. package/platform/types/components/aws/permission.d.ts.map +1 -0
  481. package/platform/types/components/aws/postgres-v1.d.ts +328 -0
  482. package/platform/types/components/aws/postgres-v1.d.ts.map +1 -0
  483. package/platform/types/components/aws/postgres.d.ts +529 -0
  484. package/platform/types/components/aws/postgres.d.ts.map +1 -0
  485. package/platform/types/components/aws/providers/bucket-files.d.ts +18 -0
  486. package/platform/types/components/aws/providers/bucket-files.d.ts.map +1 -0
  487. package/platform/types/components/aws/providers/distribution-deployment-waiter.d.ts +13 -0
  488. package/platform/types/components/aws/providers/distribution-deployment-waiter.d.ts.map +1 -0
  489. package/platform/types/components/aws/providers/distribution-invalidation.d.ts +11 -0
  490. package/platform/types/components/aws/providers/distribution-invalidation.d.ts.map +1 -0
  491. package/platform/types/components/aws/providers/function-environment-update.d.ts +33 -0
  492. package/platform/types/components/aws/providers/function-environment-update.d.ts.map +1 -0
  493. package/platform/types/components/aws/providers/hosted-zone-lookup.d.ts +11 -0
  494. package/platform/types/components/aws/providers/hosted-zone-lookup.d.ts.map +1 -0
  495. package/platform/types/components/aws/providers/kv-keys.d.ts +11 -0
  496. package/platform/types/components/aws/providers/kv-keys.d.ts.map +1 -0
  497. package/platform/types/components/aws/providers/kv-routes-update.d.ts +11 -0
  498. package/platform/types/components/aws/providers/kv-routes-update.d.ts.map +1 -0
  499. package/platform/types/components/aws/providers/microvm-image-prune.d.ts +35 -0
  500. package/platform/types/components/aws/providers/microvm-image-prune.d.ts.map +1 -0
  501. package/platform/types/components/aws/providers/origin-access-control.d.ts +8 -0
  502. package/platform/types/components/aws/providers/origin-access-control.d.ts.map +1 -0
  503. package/platform/types/components/aws/providers/rds-role-lookup.d.ts +8 -0
  504. package/platform/types/components/aws/providers/rds-role-lookup.d.ts.map +1 -0
  505. package/platform/types/components/aws/providers/vector-table.d.ts +12 -0
  506. package/platform/types/components/aws/providers/vector-table.d.ts.map +1 -0
  507. package/platform/types/components/aws/queue-lambda-subscriber.d.ts +53 -0
  508. package/platform/types/components/aws/queue-lambda-subscriber.d.ts.map +1 -0
  509. package/platform/types/components/aws/queue.d.ts +494 -0
  510. package/platform/types/components/aws/queue.d.ts.map +1 -0
  511. package/platform/types/components/aws/react.d.ts +407 -0
  512. package/platform/types/components/aws/react.d.ts.map +1 -0
  513. package/platform/types/components/aws/realtime-lambda-subscriber.d.ts +53 -0
  514. package/platform/types/components/aws/realtime-lambda-subscriber.d.ts.map +1 -0
  515. package/platform/types/components/aws/realtime.d.ts +237 -0
  516. package/platform/types/components/aws/realtime.d.ts.map +1 -0
  517. package/platform/types/components/aws/redis-v1.d.ts +348 -0
  518. package/platform/types/components/aws/redis-v1.d.ts.map +1 -0
  519. package/platform/types/components/aws/redis.d.ts +545 -0
  520. package/platform/types/components/aws/redis.d.ts.map +1 -0
  521. package/platform/types/components/aws/remix.d.ts +408 -0
  522. package/platform/types/components/aws/remix.d.ts.map +1 -0
  523. package/platform/types/components/aws/router-base-route.d.ts +28 -0
  524. package/platform/types/components/aws/router-base-route.d.ts.map +1 -0
  525. package/platform/types/components/aws/router-bucket-route.d.ts +29 -0
  526. package/platform/types/components/aws/router-bucket-route.d.ts.map +1 -0
  527. package/platform/types/components/aws/router-url-route.d.ts +28 -0
  528. package/platform/types/components/aws/router-url-route.d.ts.map +1 -0
  529. package/platform/types/components/aws/router.d.ts +1754 -0
  530. package/platform/types/components/aws/router.d.ts.map +1 -0
  531. package/platform/types/components/aws/service-v1.d.ts +78 -0
  532. package/platform/types/components/aws/service-v1.d.ts.map +1 -0
  533. package/platform/types/components/aws/service.d.ts +1756 -0
  534. package/platform/types/components/aws/service.d.ts.map +1 -0
  535. package/platform/types/components/aws/sns-topic-lambda-subscriber.d.ts +53 -0
  536. package/platform/types/components/aws/sns-topic-lambda-subscriber.d.ts.map +1 -0
  537. package/platform/types/components/aws/sns-topic-queue-subscriber.d.ts +55 -0
  538. package/platform/types/components/aws/sns-topic-queue-subscriber.d.ts.map +1 -0
  539. package/platform/types/components/aws/sns-topic.d.ts +394 -0
  540. package/platform/types/components/aws/sns-topic.d.ts.map +1 -0
  541. package/platform/types/components/aws/solid-start.d.ts +399 -0
  542. package/platform/types/components/aws/solid-start.d.ts.map +1 -0
  543. package/platform/types/components/aws/ssr-site.d.ts +895 -0
  544. package/platform/types/components/aws/ssr-site.d.ts.map +1 -0
  545. package/platform/types/components/aws/static-site.d.ts +744 -0
  546. package/platform/types/components/aws/static-site.d.ts.map +1 -0
  547. package/platform/types/components/aws/step-functions/choice.d.ts +73 -0
  548. package/platform/types/components/aws/step-functions/choice.d.ts.map +1 -0
  549. package/platform/types/components/aws/step-functions/fail.d.ts +63 -0
  550. package/platform/types/components/aws/step-functions/fail.d.ts.map +1 -0
  551. package/platform/types/components/aws/step-functions/map.d.ts +236 -0
  552. package/platform/types/components/aws/step-functions/map.d.ts.map +1 -0
  553. package/platform/types/components/aws/step-functions/parallel.d.ts +127 -0
  554. package/platform/types/components/aws/step-functions/parallel.d.ts.map +1 -0
  555. package/platform/types/components/aws/step-functions/pass.d.ts +39 -0
  556. package/platform/types/components/aws/step-functions/pass.d.ts.map +1 -0
  557. package/platform/types/components/aws/step-functions/state.d.ts +231 -0
  558. package/platform/types/components/aws/step-functions/state.d.ts.map +1 -0
  559. package/platform/types/components/aws/step-functions/succeed.d.ts +26 -0
  560. package/platform/types/components/aws/step-functions/succeed.d.ts.map +1 -0
  561. package/platform/types/components/aws/step-functions/task.d.ts +485 -0
  562. package/platform/types/components/aws/step-functions/task.d.ts.map +1 -0
  563. package/platform/types/components/aws/step-functions/wait.d.ts +91 -0
  564. package/platform/types/components/aws/step-functions/wait.d.ts.map +1 -0
  565. package/platform/types/components/aws/step-functions.d.ts +478 -0
  566. package/platform/types/components/aws/step-functions.d.ts.map +1 -0
  567. package/platform/types/components/aws/svelte-kit.d.ts +456 -0
  568. package/platform/types/components/aws/svelte-kit.d.ts.map +1 -0
  569. package/platform/types/components/aws/takeover/alb.d.ts +2 -0
  570. package/platform/types/components/aws/takeover/alb.d.ts.map +1 -0
  571. package/platform/types/components/aws/takeover/apigatewayv2.d.ts +2 -0
  572. package/platform/types/components/aws/takeover/apigatewayv2.d.ts.map +1 -0
  573. package/platform/types/components/aws/takeover/app-sync.d.ts +2 -0
  574. package/platform/types/components/aws/takeover/app-sync.d.ts.map +1 -0
  575. package/platform/types/components/aws/takeover/aurora.d.ts +2 -0
  576. package/platform/types/components/aws/takeover/aurora.d.ts.map +1 -0
  577. package/platform/types/components/aws/takeover/bucket.d.ts +2 -0
  578. package/platform/types/components/aws/takeover/bucket.d.ts.map +1 -0
  579. package/platform/types/components/aws/takeover/bus.d.ts +2 -0
  580. package/platform/types/components/aws/takeover/bus.d.ts.map +1 -0
  581. package/platform/types/components/aws/takeover/cognito-user-pool.d.ts +2 -0
  582. package/platform/types/components/aws/takeover/cognito-user-pool.d.ts.map +1 -0
  583. package/platform/types/components/aws/takeover/cron-v2.d.ts +2 -0
  584. package/platform/types/components/aws/takeover/cron-v2.d.ts.map +1 -0
  585. package/platform/types/components/aws/takeover/dsql.d.ts +2 -0
  586. package/platform/types/components/aws/takeover/dsql.d.ts.map +1 -0
  587. package/platform/types/components/aws/takeover/dynamo.d.ts +2 -0
  588. package/platform/types/components/aws/takeover/dynamo.d.ts.map +1 -0
  589. package/platform/types/components/aws/takeover/efs.d.ts +2 -0
  590. package/platform/types/components/aws/takeover/efs.d.ts.map +1 -0
  591. package/platform/types/components/aws/takeover/function.d.ts +2 -0
  592. package/platform/types/components/aws/takeover/function.d.ts.map +1 -0
  593. package/platform/types/components/aws/takeover/helpers.d.ts +16 -0
  594. package/platform/types/components/aws/takeover/helpers.d.ts.map +1 -0
  595. package/platform/types/components/aws/takeover/index.d.ts +28 -0
  596. package/platform/types/components/aws/takeover/index.d.ts.map +1 -0
  597. package/platform/types/components/aws/takeover/mysql.d.ts +2 -0
  598. package/platform/types/components/aws/takeover/mysql.d.ts.map +1 -0
  599. package/platform/types/components/aws/takeover/postgres.d.ts +2 -0
  600. package/platform/types/components/aws/takeover/postgres.d.ts.map +1 -0
  601. package/platform/types/components/aws/takeover/queue.d.ts +2 -0
  602. package/platform/types/components/aws/takeover/queue.d.ts.map +1 -0
  603. package/platform/types/components/aws/takeover/redis.d.ts +2 -0
  604. package/platform/types/components/aws/takeover/redis.d.ts.map +1 -0
  605. package/platform/types/components/aws/takeover/service.d.ts +2 -0
  606. package/platform/types/components/aws/takeover/service.d.ts.map +1 -0
  607. package/platform/types/components/aws/takeover/sns-topic.d.ts +2 -0
  608. package/platform/types/components/aws/takeover/sns-topic.d.ts.map +1 -0
  609. package/platform/types/components/aws/takeover/task.d.ts +2 -0
  610. package/platform/types/components/aws/takeover/task.d.ts.map +1 -0
  611. package/platform/types/components/aws/tan-stack-start.d.ts +359 -0
  612. package/platform/types/components/aws/tan-stack-start.d.ts.map +1 -0
  613. package/platform/types/components/aws/task.d.ts +342 -0
  614. package/platform/types/components/aws/task.d.ts.map +1 -0
  615. package/platform/types/components/aws/v5/alb.d.ts +177 -0
  616. package/platform/types/components/aws/v5/alb.d.ts.map +1 -0
  617. package/platform/types/components/aws/v5/apigatewayv2.d.ts +482 -0
  618. package/platform/types/components/aws/v5/apigatewayv2.d.ts.map +1 -0
  619. package/platform/types/components/aws/v5/app-sync.d.ts +424 -0
  620. package/platform/types/components/aws/v5/app-sync.d.ts.map +1 -0
  621. package/platform/types/components/aws/v5/aurora.d.ts +459 -0
  622. package/platform/types/components/aws/v5/aurora.d.ts.map +1 -0
  623. package/platform/types/components/aws/v5/bucket.d.ts +578 -0
  624. package/platform/types/components/aws/v5/bucket.d.ts.map +1 -0
  625. package/platform/types/components/aws/v5/bus.d.ts +255 -0
  626. package/platform/types/components/aws/v5/bus.d.ts.map +1 -0
  627. package/platform/types/components/aws/v5/cluster.d.ts +167 -0
  628. package/platform/types/components/aws/v5/cluster.d.ts.map +1 -0
  629. package/platform/types/components/aws/v5/cognito-user-pool-client.d.ts +69 -0
  630. package/platform/types/components/aws/v5/cognito-user-pool-client.d.ts.map +1 -0
  631. package/platform/types/components/aws/v5/cognito-user-pool.d.ts +396 -0
  632. package/platform/types/components/aws/v5/cognito-user-pool.d.ts.map +1 -0
  633. package/platform/types/components/aws/v5/cron-v2.d.ts +206 -0
  634. package/platform/types/components/aws/v5/cron-v2.d.ts.map +1 -0
  635. package/platform/types/components/aws/v5/dsql.d.ts +453 -0
  636. package/platform/types/components/aws/v5/dsql.d.ts.map +1 -0
  637. package/platform/types/components/aws/v5/dynamo.d.ts +328 -0
  638. package/platform/types/components/aws/v5/dynamo.d.ts.map +1 -0
  639. package/platform/types/components/aws/v5/efs.d.ts +178 -0
  640. package/platform/types/components/aws/v5/efs.d.ts.map +1 -0
  641. package/platform/types/components/aws/v5/function.d.ts +582 -0
  642. package/platform/types/components/aws/v5/function.d.ts.map +1 -0
  643. package/platform/types/components/aws/v5/index.d.ts +27 -0
  644. package/platform/types/components/aws/v5/index.d.ts.map +1 -0
  645. package/platform/types/components/aws/v5/mysql.d.ts +347 -0
  646. package/platform/types/components/aws/v5/mysql.d.ts.map +1 -0
  647. package/platform/types/components/aws/v5/postgres.d.ts +348 -0
  648. package/platform/types/components/aws/v5/postgres.d.ts.map +1 -0
  649. package/platform/types/components/aws/v5/queue.d.ts +190 -0
  650. package/platform/types/components/aws/v5/queue.d.ts.map +1 -0
  651. package/platform/types/components/aws/v5/redis.d.ts +214 -0
  652. package/platform/types/components/aws/v5/redis.d.ts.map +1 -0
  653. package/platform/types/components/aws/v5/service.d.ts +1347 -0
  654. package/platform/types/components/aws/v5/service.d.ts.map +1 -0
  655. package/platform/types/components/aws/v5/sns-topic.d.ts +226 -0
  656. package/platform/types/components/aws/v5/sns-topic.d.ts.map +1 -0
  657. package/platform/types/components/aws/v5/task.d.ts +346 -0
  658. package/platform/types/components/aws/v5/task.d.ts.map +1 -0
  659. package/platform/types/components/aws/vector.d.ts +163 -0
  660. package/platform/types/components/aws/vector.d.ts.map +1 -0
  661. package/platform/types/components/aws/vpc-v1.d.ts +208 -0
  662. package/platform/types/components/aws/vpc-v1.d.ts.map +1 -0
  663. package/platform/types/components/aws/vpc.d.ts +491 -0
  664. package/platform/types/components/aws/vpc.d.ts.map +1 -0
  665. package/platform/types/components/aws/workflow.d.ts +331 -0
  666. package/platform/types/components/aws/workflow.d.ts.map +1 -0
  667. package/platform/types/components/base/base-site.d.ts +53 -0
  668. package/platform/types/components/base/base-site.d.ts.map +1 -0
  669. package/platform/types/components/base/base-ssr-site.d.ts +13 -0
  670. package/platform/types/components/base/base-ssr-site.d.ts.map +1 -0
  671. package/platform/types/components/base/base-static-site.d.ts +199 -0
  672. package/platform/types/components/base/base-static-site.d.ts.map +1 -0
  673. package/platform/types/components/cloudflare/account-id.d.ts +2 -0
  674. package/platform/types/components/cloudflare/account-id.d.ts.map +1 -0
  675. package/platform/types/components/cloudflare/ai.d.ts +68 -0
  676. package/platform/types/components/cloudflare/ai.d.ts.map +1 -0
  677. package/platform/types/components/cloudflare/astro.d.ts +249 -0
  678. package/platform/types/components/cloudflare/astro.d.ts.map +1 -0
  679. package/platform/types/components/cloudflare/auth.d.ts +22 -0
  680. package/platform/types/components/cloudflare/auth.d.ts.map +1 -0
  681. package/platform/types/components/cloudflare/binding.d.ts +109 -0
  682. package/platform/types/components/cloudflare/binding.d.ts.map +1 -0
  683. package/platform/types/components/cloudflare/bucket.d.ts +98 -0
  684. package/platform/types/components/cloudflare/bucket.d.ts.map +1 -0
  685. package/platform/types/components/cloudflare/cron.d.ts +151 -0
  686. package/platform/types/components/cloudflare/cron.d.ts.map +1 -0
  687. package/platform/types/components/cloudflare/d1.d.ts +142 -0
  688. package/platform/types/components/cloudflare/d1.d.ts.map +1 -0
  689. package/platform/types/components/cloudflare/dns.d.ts +100 -0
  690. package/platform/types/components/cloudflare/dns.d.ts.map +1 -0
  691. package/platform/types/components/cloudflare/durable-object.d.ts +125 -0
  692. package/platform/types/components/cloudflare/durable-object.d.ts.map +1 -0
  693. package/platform/types/components/cloudflare/experimental/index.d.ts +4 -0
  694. package/platform/types/components/cloudflare/experimental/index.d.ts.map +1 -0
  695. package/platform/types/components/cloudflare/experimental/solid-start.d.ts +219 -0
  696. package/platform/types/components/cloudflare/experimental/solid-start.d.ts.map +1 -0
  697. package/platform/types/components/cloudflare/experimental/static-site.d.ts +3 -0
  698. package/platform/types/components/cloudflare/experimental/static-site.d.ts.map +1 -0
  699. package/platform/types/components/cloudflare/helpers/compatibility.d.ts +21 -0
  700. package/platform/types/components/cloudflare/helpers/compatibility.d.ts.map +1 -0
  701. package/platform/types/components/cloudflare/helpers/fetch.d.ts +19 -0
  702. package/platform/types/components/cloudflare/helpers/fetch.d.ts.map +1 -0
  703. package/platform/types/components/cloudflare/helpers/validation.d.ts +15 -0
  704. package/platform/types/components/cloudflare/helpers/validation.d.ts.map +1 -0
  705. package/platform/types/components/cloudflare/helpers/worker-builder.d.ts +10 -0
  706. package/platform/types/components/cloudflare/helpers/worker-builder.d.ts.map +1 -0
  707. package/platform/types/components/cloudflare/helpers/wrangler.d.ts +31 -0
  708. package/platform/types/components/cloudflare/helpers/wrangler.d.ts.map +1 -0
  709. package/platform/types/components/cloudflare/hyperdrive.d.ts +302 -0
  710. package/platform/types/components/cloudflare/hyperdrive.d.ts.map +1 -0
  711. package/platform/types/components/cloudflare/index.d.ts +25 -0
  712. package/platform/types/components/cloudflare/index.d.ts.map +1 -0
  713. package/platform/types/components/cloudflare/kv.d.ts +140 -0
  714. package/platform/types/components/cloudflare/kv.d.ts.map +1 -0
  715. package/platform/types/components/cloudflare/providers/dns-record.d.ts +21 -0
  716. package/platform/types/components/cloudflare/providers/dns-record.d.ts.map +1 -0
  717. package/platform/types/components/cloudflare/providers/kv-data.d.ts +23 -0
  718. package/platform/types/components/cloudflare/providers/kv-data.d.ts.map +1 -0
  719. package/platform/types/components/cloudflare/providers/worker-assets.d.ts +19 -0
  720. package/platform/types/components/cloudflare/providers/worker-assets.d.ts.map +1 -0
  721. package/platform/types/components/cloudflare/providers/worker-placement.d.ts +27 -0
  722. package/platform/types/components/cloudflare/providers/worker-placement.d.ts.map +1 -0
  723. package/platform/types/components/cloudflare/providers/worker-script.d.ts +23 -0
  724. package/platform/types/components/cloudflare/providers/worker-script.d.ts.map +1 -0
  725. package/platform/types/components/cloudflare/providers/worker-url.d.ts +24 -0
  726. package/platform/types/components/cloudflare/providers/worker-url.d.ts.map +1 -0
  727. package/platform/types/components/cloudflare/providers/zone-lookup.d.ts +22 -0
  728. package/platform/types/components/cloudflare/providers/zone-lookup.d.ts.map +1 -0
  729. package/platform/types/components/cloudflare/queue-worker-subscriber.d.ts +122 -0
  730. package/platform/types/components/cloudflare/queue-worker-subscriber.d.ts.map +1 -0
  731. package/platform/types/components/cloudflare/queue.d.ts +235 -0
  732. package/platform/types/components/cloudflare/queue.d.ts.map +1 -0
  733. package/platform/types/components/cloudflare/rate-limit.d.ts +117 -0
  734. package/platform/types/components/cloudflare/rate-limit.d.ts.map +1 -0
  735. package/platform/types/components/cloudflare/react-router.d.ts +262 -0
  736. package/platform/types/components/cloudflare/react-router.d.ts.map +1 -0
  737. package/platform/types/components/cloudflare/ssr-site.d.ts +60 -0
  738. package/platform/types/components/cloudflare/ssr-site.d.ts.map +1 -0
  739. package/platform/types/components/cloudflare/static-site-v2.d.ts +302 -0
  740. package/platform/types/components/cloudflare/static-site-v2.d.ts.map +1 -0
  741. package/platform/types/components/cloudflare/static-site.d.ts +270 -0
  742. package/platform/types/components/cloudflare/static-site.d.ts.map +1 -0
  743. package/platform/types/components/cloudflare/tan-stack-start.d.ts +259 -0
  744. package/platform/types/components/cloudflare/tan-stack-start.d.ts.map +1 -0
  745. package/platform/types/components/cloudflare/worker.d.ts +483 -0
  746. package/platform/types/components/cloudflare/worker.d.ts.map +1 -0
  747. package/platform/types/components/cloudflare/workflow.d.ts +248 -0
  748. package/platform/types/components/cloudflare/workflow.d.ts.map +1 -0
  749. package/platform/types/components/component.d.ts +67 -0
  750. package/platform/types/components/component.d.ts.map +1 -0
  751. package/platform/types/components/core.d.ts +16 -0
  752. package/platform/types/components/core.d.ts.map +1 -0
  753. package/platform/types/components/cpu.d.ts +3 -0
  754. package/platform/types/components/cpu.d.ts.map +1 -0
  755. package/platform/types/components/dns.d.ts +63 -0
  756. package/platform/types/components/dns.d.ts.map +1 -0
  757. package/platform/types/components/duration.d.ts +9 -0
  758. package/platform/types/components/duration.d.ts.map +1 -0
  759. package/platform/types/components/error.d.ts +4 -0
  760. package/platform/types/components/error.d.ts.map +1 -0
  761. package/platform/types/components/esbuild.d.ts +3 -0
  762. package/platform/types/components/esbuild.d.ts.map +1 -0
  763. package/platform/types/components/experimental/dev-command.d.ts +99 -0
  764. package/platform/types/components/experimental/dev-command.d.ts.map +1 -0
  765. package/platform/types/components/experimental/index.d.ts +2 -0
  766. package/platform/types/components/experimental/index.d.ts.map +1 -0
  767. package/platform/types/components/groups.d.ts +6 -0
  768. package/platform/types/components/groups.d.ts.map +1 -0
  769. package/platform/types/components/index.d.ts +5 -0
  770. package/platform/types/components/index.d.ts.map +1 -0
  771. package/platform/types/components/input.d.ts +3 -0
  772. package/platform/types/components/input.d.ts.map +1 -0
  773. package/platform/types/components/link.d.ts +41 -0
  774. package/platform/types/components/link.d.ts.map +1 -0
  775. package/platform/types/components/linkable.d.ts +301 -0
  776. package/platform/types/components/linkable.d.ts.map +1 -0
  777. package/platform/types/components/naming-rules.d.ts +32 -0
  778. package/platform/types/components/naming-rules.d.ts.map +1 -0
  779. package/platform/types/components/naming.d.ts +21 -0
  780. package/platform/types/components/naming.d.ts.map +1 -0
  781. package/platform/types/components/parts-component.d.ts +241 -0
  782. package/platform/types/components/parts-component.d.ts.map +1 -0
  783. package/platform/types/components/parts.d.ts +194 -0
  784. package/platform/types/components/parts.d.ts.map +1 -0
  785. package/platform/types/components/path.d.ts +2 -0
  786. package/platform/types/components/path.d.ts.map +1 -0
  787. package/platform/types/components/rpc/rpc.d.ts +19 -0
  788. package/platform/types/components/rpc/rpc.d.ts.map +1 -0
  789. package/platform/types/components/secret.d.ts +123 -0
  790. package/platform/types/components/secret.d.ts.map +1 -0
  791. package/platform/types/components/size.d.ts +5 -0
  792. package/platform/types/components/size.d.ts.map +1 -0
  793. package/platform/types/components/takeover.d.ts +88 -0
  794. package/platform/types/components/takeover.d.ts.map +1 -0
  795. package/platform/types/components/transform.d.ts +34 -0
  796. package/platform/types/components/transform.d.ts.map +1 -0
  797. package/platform/types/components/vercel/account-id.d.ts +2 -0
  798. package/platform/types/components/vercel/account-id.d.ts.map +1 -0
  799. package/platform/types/components/vercel/dns.d.ts +73 -0
  800. package/platform/types/components/vercel/dns.d.ts.map +1 -0
  801. package/platform/types/components/vercel/index.d.ts +3 -0
  802. package/platform/types/components/vercel/index.d.ts.map +1 -0
  803. package/platform/types/components/vercel/providers/dns-record.d.ts +15 -0
  804. package/platform/types/components/vercel/providers/dns-record.d.ts.map +1 -0
  805. package/platform/types/config.d.ts +1437 -0
  806. package/platform/types/config.d.ts.map +1 -0
  807. package/platform/types/global-aliases.d.ts +37 -0
  808. package/platform/types/global.d.ts +374 -0
  809. package/platform/types/internal.d.ts +18 -0
  810. package/platform/types/runtime/worker/unenv.d.ts +14 -0
  811. package/platform/types/testing/global.d.ts +11 -0
  812. package/platform/types/testing/global.d.ts.map +1 -0
  813. package/platform/types/testing/index.d.ts +80 -0
  814. package/platform/types/testing/index.d.ts.map +1 -0
  815. package/platform/types/testing/mock.d.ts +136 -0
  816. package/platform/types/testing/mock.d.ts.map +1 -0
  817. package/platform/types/testing/vitest.d.ts +19 -0
  818. package/platform/types/testing/vitest.d.ts.map +1 -0
  819. package/platform/types/util/compare-semver.d.ts +4 -0
  820. package/platform/types/util/compare-semver.d.ts.map +1 -0
  821. package/platform/types/util/fs.d.ts +5 -0
  822. package/platform/types/util/fs.d.ts.map +1 -0
  823. package/platform/types/util/lazy.d.ts +2 -0
  824. package/platform/types/util/lazy.d.ts.map +1 -0
  825. package/platform/types/util/minify.d.ts +2 -0
  826. package/platform/types/util/minify.d.ts.map +1 -0
  827. package/platform/types/util/package.d.ts +10 -0
  828. package/platform/types/util/package.d.ts.map +1 -0
  829. package/platform/types/util/semaphore.d.ts +9 -0
  830. package/platform/types/util/semaphore.d.ts.map +1 -0
  831. package/platform/types/util/warn.d.ts +2 -0
  832. package/platform/types/util/warn.d.ts.map +1 -0
@@ -0,0 +1,2994 @@
1
+ import {
2
+ ComponentResourceOptions,
3
+ Output,
4
+ all,
5
+ interpolate,
6
+ output,
7
+ } from "@pulumi/pulumi";
8
+ import { Component, Prettify, Transform, transform } from "../component.js";
9
+ import { dns as awsDns } from "./dns.js";
10
+ import { VisibleError } from "../error.js";
11
+ import { DnsValidatedCertificate } from "./dns-validated-certificate.js";
12
+ import { Link } from "../link.js";
13
+ import { URL_UNAVAILABLE } from "./linkable.js";
14
+ import {
15
+ appautoscaling,
16
+ ec2,
17
+ ecs,
18
+ getRegionOutput,
19
+ iam,
20
+ lb,
21
+ servicediscovery,
22
+ } from "@pulumi/aws";
23
+ import { Vpc } from "./vpc.js";
24
+ import { DevCommand } from "../experimental/dev-command.js";
25
+ import { DurationMinutes, toSeconds } from "../duration.js";
26
+ import { Input } from "../input.js";
27
+ import {
28
+ FargateBaseArgs,
29
+ FargateContainerArgs,
30
+ createExecutionRole,
31
+ createTaskDefinition,
32
+ createTaskRole,
33
+ normalizeArchitecture,
34
+ normalizeContainers,
35
+ normalizeCpu,
36
+ normalizeMemory,
37
+ normalizeStorage,
38
+ } from "./fargate.js";
39
+ import { Dns } from "../dns.js";
40
+ import { hashStringToPrettyString } from "../naming.js";
41
+ import { Alb } from "./alb.js";
42
+ import { listenerKey, targetKey } from "./helpers/load-balancer.js";
43
+
44
+ type Port = `${number}/${"http" | "https" | "tcp" | "udp" | "tcp_udp" | "tls"}`;
45
+
46
+ interface ServiceRules {
47
+ /**
48
+ * The port and protocol the service listens on. Uses the format `{port}/{protocol}`.
49
+ *
50
+ * @example
51
+ * ```js
52
+ * {
53
+ * listen: "80/http"
54
+ * }
55
+ * ```
56
+ */
57
+ listen: Input<Port>;
58
+ /**
59
+ * The port and protocol of the container the service forwards the traffic to. Uses the
60
+ * format `{port}/{protocol}`.
61
+ *
62
+ * @example
63
+ * ```js
64
+ * {
65
+ * forward: "80/http"
66
+ * }
67
+ * ```
68
+ * @default The same port and protocol as `listen`.
69
+ */
70
+ forward?: Input<Port>;
71
+ /**
72
+ * The name of the container to forward the traffic to. This maps to the `name` defined in the
73
+ * `container` prop.
74
+ *
75
+ * You only need this if there's more than one container. If there's only one container, the
76
+ * traffic is automatically forwarded there.
77
+ */
78
+ container?: Input<string>;
79
+ /**
80
+ * The port and protocol to redirect the traffic to. Uses the format `{port}/{protocol}`.
81
+ *
82
+ * @example
83
+ * ```js
84
+ * {
85
+ * redirect: "80/http"
86
+ * }
87
+ * ```
88
+ */
89
+ redirect?: Input<Port>;
90
+ /**
91
+ * @deprecated Use `conditions.path` instead.
92
+ */
93
+ path?: Input<string>;
94
+ /**
95
+ * The conditions for the redirect. Only applicable to `http` and `https` protocols.
96
+ */
97
+ conditions?: Input<{
98
+ /**
99
+ * Configure path-based routing. Only requests matching the path are forwarded to
100
+ * the container.
101
+ *
102
+ * ```js
103
+ * {
104
+ * path: "/api/*"
105
+ * }
106
+ * ```
107
+ *
108
+ * The path pattern is case-sensitive, supports wildcards, and can be up to 128
109
+ * characters.
110
+ * - `*` matches 0 or more characters. For example, `/api/*` matches `/api/` or
111
+ * `/api/orders`.
112
+ * - `?` matches exactly 1 character. For example, `/api/?.png` matches `/api/a.png`.
113
+ *
114
+ * @default Requests to all paths are forwarded.
115
+ */
116
+ path?: Input<string>;
117
+ /**
118
+ * Configure query string based routing. Only requests matching one of the query
119
+ * string conditions are forwarded to the container.
120
+ *
121
+ * Takes a list of `key`, the name of the query string parameter, and `value` pairs.
122
+ * Where `value` is the value of the query string parameter. But it can be a pattern as well.
123
+ *
124
+ * If multiple `key` and `value` pairs are provided, it'll match requests with **any** of the
125
+ * query string parameters.
126
+ *
127
+ * @default Query string is not checked when forwarding requests.
128
+ *
129
+ * @example
130
+ *
131
+ * For example, to match requests with query string `version=v1`.
132
+ *
133
+ * ```js
134
+ * {
135
+ * query: [
136
+ * { key: "version", value: "v1" }
137
+ * ]
138
+ * }
139
+ * ```
140
+ *
141
+ * Or match requests with query string matching `env=test*`.
142
+ *
143
+ * ```js
144
+ * {
145
+ * query: [
146
+ * { key: "env", value: "test*" }
147
+ * ]
148
+ * }
149
+ * ```
150
+ *
151
+ * Match requests with query string `version=v1` **or** `env=test*`.
152
+ *
153
+ * ```js
154
+ * {
155
+ * query: [
156
+ * { key: "version", value: "v1" },
157
+ * { key: "env", value: "test*" }
158
+ * ]
159
+ * }
160
+ * ```
161
+ *
162
+ * Match requests with any query string key with value `example`.
163
+ *
164
+ * ```js
165
+ * {
166
+ * query: [
167
+ * { value: "example" }
168
+ * ]
169
+ * }
170
+ * ```
171
+ */
172
+ query?: Input<
173
+ Input<{
174
+ /**
175
+ * The name of the query string parameter.
176
+ */
177
+ key?: Input<string>;
178
+ /**
179
+ * The value of the query string parameter.
180
+ *
181
+ * If no `key` is provided, it'll match any request where a query string parameter with
182
+ * the given value exists.
183
+ */
184
+ value: Input<string>;
185
+ }>[]
186
+ >;
187
+ /**
188
+ * Configure header based routing. Only requests matching the header
189
+ * name and values are forwarded to the container.
190
+ *
191
+ * Both the header name and values are case insensitive.
192
+ *
193
+ * @default Header is not checked when forwarding requests.
194
+ *
195
+ * @example
196
+ *
197
+ * For example, if you specify `X-Custom-Header` as the name and `Value1`
198
+ * as a value, it will match requests with the header
199
+ * `x-custom-header: value1` as well.
200
+ *
201
+ * ```js
202
+ * {
203
+ * header: {
204
+ * name: "X-Custom-Header",
205
+ * values: ["Value1", "Value2", "Prefix*"]
206
+ * }
207
+ * }
208
+ * ```
209
+ */
210
+ header?: Input<{
211
+ /**
212
+ * The name of the HTTP header field to check. This is case-insensitive.
213
+ */
214
+ name: Input<string>;
215
+
216
+ /**
217
+ * The values to match against the header value. The rule matches if the
218
+ * request header matches any of these values. Values are case-insensitive
219
+ * and support wildcards (`*` and `?`) for pattern matching.
220
+ */
221
+ values: Input<Input<string>>[];
222
+ }>;
223
+ }>;
224
+ }
225
+
226
+ type AlbPort = `${number}/${"http" | "https"}`;
227
+
228
+ export interface ServiceAlbRule {
229
+ /**
230
+ * The port and protocol to listen on, in `{port}/{protocol}` format. Must match a listener on the ALB.
231
+ *
232
+ * @example
233
+ * ```js
234
+ * {
235
+ * listen: "443/https"
236
+ * }
237
+ * ```
238
+ */
239
+ listen: AlbPort;
240
+ /**
241
+ * The container port and protocol to forward traffic to. Uses the format `{port}/{protocol}`.
242
+ *
243
+ * The protocol must match what the container actually speaks — using `"3000/https"` when
244
+ * the container speaks HTTP will cause health check failures.
245
+ *
246
+ * @example
247
+ * ```js
248
+ * {
249
+ * forward: "8080/http"
250
+ * }
251
+ * ```
252
+ */
253
+ forward: AlbPort;
254
+ /**
255
+ * The name of the container to forward the traffic to. Required when multiple containers
256
+ * are configured.
257
+ */
258
+ container?: string;
259
+ /**
260
+ * The conditions for the listener rule. At least one condition (path, query, or header)
261
+ * must be specified. The ALB owns the default action — services only add conditional rules.
262
+ *
263
+ * @example
264
+ * ```js
265
+ * {
266
+ * conditions: {
267
+ * path: "/api/*"
268
+ * }
269
+ * }
270
+ * ```
271
+ */
272
+ conditions: {
273
+ /**
274
+ * Path pattern to match. Supports wildcards (`*` and `?`).
275
+ */
276
+ path?: Input<string>;
277
+ /**
278
+ * Query string conditions.
279
+ */
280
+ query?: Input<
281
+ Input<{
282
+ key?: Input<string>;
283
+ value: Input<string>;
284
+ }>[]
285
+ >;
286
+ /**
287
+ * HTTP header condition.
288
+ */
289
+ header?: Input<{
290
+ name: Input<string>;
291
+ values: Input<Input<string>>[];
292
+ }>;
293
+ };
294
+ /**
295
+ * Explicit priority for the listener rule (1–50000).
296
+ * Must be unique per listener across ALL services sharing the ALB.
297
+ * Use non-overlapping ranges per service (e.g., Service A: 100-199, Service B: 200-299).
298
+ *
299
+ * @example
300
+ * ```js
301
+ * {
302
+ * priority: 100
303
+ * }
304
+ * ```
305
+ */
306
+ priority: number;
307
+ }
308
+
309
+ interface ServiceContainerArgs extends FargateContainerArgs {
310
+ /**
311
+ * Configure the health check for the container. Same as the top-level
312
+ * [`health`](#health).
313
+ */
314
+ health?: ServiceArgs["health"];
315
+ /**
316
+ * Configure how this container works in `sst dev`. Same as the top-level
317
+ * [`dev`](#dev).
318
+ */
319
+ dev?: {
320
+ /**
321
+ * The command that `sst dev` runs to start this in dev mode. Same as the top-level
322
+ * [`dev.command`](#dev-command).
323
+ */
324
+ command: Input<string>;
325
+ /**
326
+ * Configure if you want to automatically start this when `sst dev` starts. Same as the
327
+ * top-level [`dev.autostart`](#dev-autostart).
328
+ */
329
+ autostart?: Input<boolean>;
330
+ /**
331
+ * Change the directory from where the `command` is run. Same as the top-level
332
+ * [`dev.directory`](#dev-directory).
333
+ */
334
+ directory?: Input<string>;
335
+ };
336
+ }
337
+
338
+ export interface ServiceArgs extends FargateBaseArgs {
339
+ /**
340
+ * Configure how this component works in `sst dev`.
341
+ *
342
+ * :::note
343
+ * In `sst dev` your service is not deployed.
344
+ * :::
345
+ *
346
+ * By default, your service in not deployed in `sst dev`. Instead, you can set the
347
+ * `dev.command` and it'll be started locally in a separate tab in the
348
+ * `sst dev` multiplexer. Read more about [`sst dev`](/docs/reference/cli/#dev).
349
+ *
350
+ * This makes it so that the container doesn't have to be redeployed on every change. To
351
+ * disable this and deploy your service in `sst dev`, pass in `false`.
352
+ */
353
+ dev?:
354
+ | false
355
+ | {
356
+ /**
357
+ * The `url` when this is running in dev mode.
358
+ *
359
+ * Since this component is not deployed in `sst dev`, there is no real URL. But if you are
360
+ * using this component's `url` or linking to this component's `url`, it can be useful to
361
+ * have a placeholder URL. It avoids having to handle it being `undefined`.
362
+ * @default `"http://url-unavailable-in-dev.mode"`
363
+ */
364
+ url?: Input<string>;
365
+ /**
366
+ * The command that `sst dev` runs to start this in dev mode. This is the command you run
367
+ * when you want to run your service locally.
368
+ */
369
+ command?: Input<string>;
370
+ /**
371
+ * Configure if you want to automatically start this when `sst dev` starts. You can still
372
+ * start it manually later.
373
+ * @default `true`
374
+ */
375
+ autostart?: Input<boolean>;
376
+ /**
377
+ * Change the directory from where the `command` is run.
378
+ * @default Uses the `image.dockerfile` path
379
+ */
380
+ directory?: Input<string>;
381
+ };
382
+ /**
383
+ * Configure a public endpoint for the service. When configured, a load balancer
384
+ * will be created to route traffic to the containers. By default, the endpoint is an
385
+ * auto-generated load balancer URL.
386
+ *
387
+ * You can also add a custom domain for the public endpoint.
388
+ * @deprecated Use `loadBalancer` instead.
389
+ * @example
390
+ *
391
+ * ```js
392
+ * {
393
+ * public: {
394
+ * domain: "example.com",
395
+ * rules: [
396
+ * { listen: "80/http" },
397
+ * { listen: "443/https", forward: "80/http" }
398
+ * ]
399
+ * }
400
+ * }
401
+ * ```
402
+ */
403
+ public?: Input<{
404
+ /**
405
+ * Set a custom domain for your public endpoint.
406
+ *
407
+ * Automatically manages domains hosted on AWS Route 53, Cloudflare, and Vercel. For other
408
+ * providers, you'll need to pass in a `cert` that validates domain ownership and add the
409
+ * DNS records.
410
+ *
411
+ * When SST creates the certificate, the load balancer is created after the certificate
412
+ * is validated, and removed before the certificate.
413
+ *
414
+ * :::tip
415
+ * Built-in support for AWS Route 53, Cloudflare, and Vercel. And manual setup for other
416
+ * providers.
417
+ * :::
418
+ *
419
+ * @example
420
+ *
421
+ * By default this assumes the domain is hosted on Route 53.
422
+ *
423
+ * ```js
424
+ * {
425
+ * domain: "example.com"
426
+ * }
427
+ * ```
428
+ *
429
+ * For domains hosted on Cloudflare.
430
+ *
431
+ * ```js
432
+ * {
433
+ * domain: {
434
+ * name: "example.com",
435
+ * dns: sst.cloudflare.dns()
436
+ * }
437
+ * }
438
+ * ```
439
+ */
440
+ domain?: Input<
441
+ | string
442
+ | {
443
+ /**
444
+ * The custom domain you want to use.
445
+ *
446
+ * @example
447
+ * ```js
448
+ * {
449
+ * domain: {
450
+ * name: "example.com"
451
+ * }
452
+ * }
453
+ * ```
454
+ *
455
+ * Can also include subdomains based on the current stage.
456
+ *
457
+ * ```js
458
+ * {
459
+ * domain: {
460
+ * name: `${$app.stage}.example.com`
461
+ * }
462
+ * }
463
+ * ```
464
+ */
465
+ name: Input<string>;
466
+ /**
467
+ * Alias domains that should be used.
468
+ *
469
+ * @example
470
+ * ```js {4}
471
+ * {
472
+ * domain: {
473
+ * name: "app1.example.com",
474
+ * aliases: ["app2.example.com"]
475
+ * }
476
+ * }
477
+ * ```
478
+ */
479
+ aliases?: Input<string[]>;
480
+ /**
481
+ * The ARN of an ACM (AWS Certificate Manager) certificate that proves ownership of the
482
+ * domain. By default, a certificate is created and validated automatically.
483
+ *
484
+ * :::tip
485
+ * You need to pass in a `cert` for domains that are not hosted on supported `dns` providers.
486
+ * :::
487
+ *
488
+ * To manually set up a domain on an unsupported provider, you'll need to:
489
+ *
490
+ * 1. [Validate that you own the domain](https://docs.aws.amazon.com/acm/latest/userguide/domain-ownership-validation.html) by creating an ACM certificate. You can either validate it by setting a DNS record or by verifying an email sent to the domain owner.
491
+ * 2. Once validated, set the certificate ARN as the `cert` and set `dns` to `false`.
492
+ * 3. Add the DNS records in your provider to point to the load balancer endpoint.
493
+ *
494
+ * @example
495
+ * ```js
496
+ * {
497
+ * domain: {
498
+ * name: "example.com",
499
+ * dns: false,
500
+ * cert: "arn:aws:acm:us-east-1:112233445566:certificate/3a958790-8878-4cdc-a396-06d95064cf63"
501
+ * }
502
+ * }
503
+ * ```
504
+ */
505
+ cert?: Input<string>;
506
+ /**
507
+ * The DNS provider to use for the domain. Defaults to the AWS.
508
+ *
509
+ * Takes an adapter that can create the DNS records on the provider. This can automate
510
+ * validating the domain and setting up the DNS routing.
511
+ *
512
+ * Supports Route 53, Cloudflare, and Vercel adapters. For other providers, you'll need
513
+ * to set `dns` to `false` and pass in a certificate validating ownership via `cert`.
514
+ *
515
+ * @default `sst.aws.dns`
516
+ *
517
+ * @example
518
+ *
519
+ * Specify the hosted zone ID for the Route 53 domain.
520
+ *
521
+ * ```js
522
+ * {
523
+ * domain: {
524
+ * name: "example.com",
525
+ * dns: sst.aws.dns({
526
+ * zone: "Z2FDTNDATAQYW2"
527
+ * })
528
+ * }
529
+ * }
530
+ * ```
531
+ *
532
+ * Use a domain hosted on Cloudflare, needs the Cloudflare provider.
533
+ *
534
+ * ```js
535
+ * {
536
+ * domain: {
537
+ * name: "example.com",
538
+ * dns: sst.cloudflare.dns()
539
+ * }
540
+ * }
541
+ * ```
542
+ *
543
+ * Use a domain hosted on Vercel, needs the Vercel provider.
544
+ *
545
+ * ```js
546
+ * {
547
+ * domain: {
548
+ * name: "example.com",
549
+ * dns: sst.vercel.dns()
550
+ * }
551
+ * }
552
+ * ```
553
+ */
554
+ dns?: Input<false | (Dns & {})>;
555
+ }
556
+ >;
557
+ /** @deprecated Use `rules` instead. */
558
+ ports?: Input<Prettify<ServiceRules>[]>;
559
+ /**
560
+ * Configure the mapping for the ports the public endpoint listens to and forwards to
561
+ * the service.
562
+ * This supports two types of protocols:
563
+ *
564
+ * 1. Application Layer Protocols: `http` and `https`. This'll create an [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html).
565
+ * 2. Network Layer Protocols: `tcp`, `udp`, `tcp_udp`, and `tls`. This'll create a [Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html).
566
+ *
567
+ * :::note
568
+ * If you are listening on `https` or `tls`, you need to specify a custom `public.domain`.
569
+ * :::
570
+ *
571
+ * You can **not** configure both application and network layer protocols for the same
572
+ * service.
573
+ *
574
+ * @example
575
+ * Here we are listening on port `80` and forwarding it to the service on port `8080`.
576
+ * ```js
577
+ * {
578
+ * public: {
579
+ * rules: [
580
+ * { listen: "80/http", forward: "8080/http" }
581
+ * ]
582
+ * }
583
+ * }
584
+ * ```
585
+ *
586
+ * The `forward` port and protocol defaults to the `listen` port and protocol. So in this
587
+ * case both are `80/http`.
588
+ *
589
+ * ```js
590
+ * {
591
+ * public: {
592
+ * rules: [
593
+ * { listen: "80/http" }
594
+ * ]
595
+ * }
596
+ * }
597
+ * ```
598
+ *
599
+ * If multiple containers are configured via the `containers` argument, you need to
600
+ * specify which container the traffic should be forwarded to.
601
+ *
602
+ * ```js
603
+ * {
604
+ * public: {
605
+ * rules: [
606
+ * { listen: "80/http", container: "app" },
607
+ * { listen: "8000/http", container: "admin" },
608
+ * ]
609
+ * }
610
+ * }
611
+ * ```
612
+ */
613
+ rules?: Input<Prettify<ServiceRules>[]>;
614
+ }>;
615
+ /**
616
+ * Configure a load balancer to route traffic to the containers.
617
+ *
618
+ * While you can expose a service through API Gateway, it's better to use a load balancer
619
+ * for most traditional web applications. It is more expensive to start but at higher
620
+ * levels of traffic it ends up being more cost effective.
621
+ *
622
+ * Also, if you need to listen on network layer protocols like `tcp` or `udp`, you have to
623
+ * expose it through a load balancer.
624
+ *
625
+ * By default, the endpoint is an auto-generated load balancer URL. You can also add a
626
+ * custom domain for the endpoint.
627
+ *
628
+ * @default Load balancer is not created
629
+ * @example
630
+ *
631
+ * ```js
632
+ * {
633
+ * loadBalancer: {
634
+ * domain: "example.com",
635
+ * rules: [
636
+ * { listen: "80/http", redirect: "443/https" },
637
+ * { listen: "443/https", forward: "80/http" }
638
+ * ]
639
+ * }
640
+ * }
641
+ * ```
642
+ */
643
+ loadBalancer?: Input<
644
+ | {
645
+ /**
646
+ * Configure if the load balancer should be public or private.
647
+ *
648
+ * When set to `false`, the load balancer endpoint will only be accessible within the
649
+ * VPC.
650
+ *
651
+ * @default `true`
652
+ */
653
+ public?: Input<boolean>;
654
+ /**
655
+ * Set a custom domain for your load balancer endpoint.
656
+ *
657
+ * Automatically manages domains hosted on AWS Route 53, Cloudflare, and Vercel. For other
658
+ * providers, you'll need to pass in a `cert` that validates domain ownership and add the
659
+ * DNS records.
660
+ *
661
+ * When SST creates the certificate, the load balancer is created after the certificate
662
+ * is validated, and removed before the certificate.
663
+ *
664
+ * :::tip
665
+ * Built-in support for AWS Route 53, Cloudflare, and Vercel. And manual setup for other
666
+ * providers.
667
+ * :::
668
+ *
669
+ * @example
670
+ *
671
+ * By default this assumes the domain is hosted on Route 53.
672
+ *
673
+ * ```js
674
+ * {
675
+ * domain: "example.com"
676
+ * }
677
+ * ```
678
+ *
679
+ * For domains hosted on Cloudflare.
680
+ *
681
+ * ```js
682
+ * {
683
+ * domain: {
684
+ * name: "example.com",
685
+ * dns: sst.cloudflare.dns()
686
+ * }
687
+ * }
688
+ * ```
689
+ */
690
+ domain?: Input<
691
+ | string
692
+ | {
693
+ /**
694
+ * The custom domain you want to use.
695
+ *
696
+ * @example
697
+ * ```js
698
+ * {
699
+ * domain: {
700
+ * name: "example.com"
701
+ * }
702
+ * }
703
+ * ```
704
+ *
705
+ * Can also include subdomains based on the current stage.
706
+ *
707
+ * ```js
708
+ * {
709
+ * domain: {
710
+ * name: `${$app.stage}.example.com`
711
+ * }
712
+ * }
713
+ * ```
714
+ *
715
+ * Wildcard domains are supported.
716
+ *
717
+ * ```js
718
+ * {
719
+ * domain: {
720
+ * name: "*.example.com"
721
+ * }
722
+ * }
723
+ * ```
724
+ */
725
+ name: Input<string>;
726
+ /**
727
+ * Alias domains that should be used.
728
+ *
729
+ * @example
730
+ * ```js {4}
731
+ * {
732
+ * domain: {
733
+ * name: "app1.example.com",
734
+ * aliases: ["app2.example.com"]
735
+ * }
736
+ * }
737
+ * ```
738
+ */
739
+ aliases?: Input<string[]>;
740
+ /**
741
+ * The ARN of an ACM (AWS Certificate Manager) certificate that proves ownership of the
742
+ * domain. By default, a certificate is created and validated automatically.
743
+ *
744
+ * :::tip
745
+ * You need to pass in a `cert` for domains that are not hosted on supported `dns` providers.
746
+ * :::
747
+ *
748
+ * To manually set up a domain on an unsupported provider, you'll need to:
749
+ *
750
+ * 1. [Validate that you own the domain](https://docs.aws.amazon.com/acm/latest/userguide/domain-ownership-validation.html) by creating an ACM certificate. You can either validate it by setting a DNS record or by verifying an email sent to the domain owner.
751
+ * 2. Once validated, set the certificate ARN as the `cert` and set `dns` to `false`.
752
+ * 3. Add the DNS records in your provider to point to the load balancer endpoint.
753
+ *
754
+ * @example
755
+ * ```js
756
+ * {
757
+ * domain: {
758
+ * name: "example.com",
759
+ * dns: false,
760
+ * cert: "arn:aws:acm:us-east-1:112233445566:certificate/3a958790-8878-4cdc-a396-06d95064cf63"
761
+ * }
762
+ * }
763
+ * ```
764
+ */
765
+ cert?: Input<string>;
766
+ /**
767
+ * The DNS provider to use for the domain. Defaults to the AWS.
768
+ *
769
+ * Takes an adapter that can create the DNS records on the provider. This can automate
770
+ * validating the domain and setting up the DNS routing.
771
+ *
772
+ * Supports Route 53, Cloudflare, and Vercel adapters. For other providers, you'll need
773
+ * to set `dns` to `false` and pass in a certificate validating ownership via `cert`.
774
+ *
775
+ * @default `sst.aws.dns`
776
+ *
777
+ * @example
778
+ *
779
+ * Specify the hosted zone ID for the Route 53 domain.
780
+ *
781
+ * ```js
782
+ * {
783
+ * domain: {
784
+ * name: "example.com",
785
+ * dns: sst.aws.dns({
786
+ * zone: "Z2FDTNDATAQYW2"
787
+ * })
788
+ * }
789
+ * }
790
+ * ```
791
+ *
792
+ * Use a domain hosted on Cloudflare, needs the Cloudflare provider.
793
+ *
794
+ * ```js
795
+ * {
796
+ * domain: {
797
+ * name: "example.com",
798
+ * dns: sst.cloudflare.dns()
799
+ * }
800
+ * }
801
+ * ```
802
+ *
803
+ * Use a domain hosted on Vercel, needs the Vercel provider.
804
+ *
805
+ * ```js
806
+ * {
807
+ * domain: {
808
+ * name: "example.com",
809
+ * dns: sst.vercel.dns()
810
+ * }
811
+ * }
812
+ * ```
813
+ */
814
+ dns?: Input<false | (Dns & {})>;
815
+ }
816
+ >;
817
+ /** @deprecated Use `rules` instead. */
818
+ ports?: Input<Prettify<ServiceRules>[]>;
819
+ /**
820
+ * Configure the mapping for the ports the load balancer listens to, forwards, or redirects to
821
+ * the service.
822
+ * This supports two types of protocols:
823
+ *
824
+ * 1. Application Layer Protocols: `http` and `https`. This'll create an [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html).
825
+ * 2. Network Layer Protocols: `tcp`, `udp`, `tcp_udp`, and `tls`. This'll create a [Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html).
826
+ *
827
+ * :::note
828
+ * If you want to listen on `https` or `tls`, you need to specify a custom
829
+ * `loadBalancer.domain`.
830
+ * :::
831
+ *
832
+ * You **can not configure** both application and network layer protocols for the same
833
+ * service.
834
+ *
835
+ * @example
836
+ * Here we are listening on port `80` and forwarding it to the service on port `8080`.
837
+ * ```js
838
+ * {
839
+ * rules: [
840
+ * { listen: "80/http", forward: "8080/http" }
841
+ * ]
842
+ * }
843
+ * ```
844
+ *
845
+ * The `forward` port and protocol defaults to the `listen` port and protocol. So in this
846
+ * case both are `80/http`.
847
+ *
848
+ * ```js
849
+ * {
850
+ * rules: [
851
+ * { listen: "80/http" }
852
+ * ]
853
+ * }
854
+ * ```
855
+ *
856
+ * If multiple containers are configured via the `containers` argument, you need to
857
+ * specify which container the traffic should be forwarded to.
858
+ *
859
+ * ```js
860
+ * {
861
+ * rules: [
862
+ * { listen: "80/http", container: "app" },
863
+ * { listen: "8000/http", container: "admin" }
864
+ * ]
865
+ * }
866
+ * ```
867
+ *
868
+ * You can also route the same port to multiple containers via path-based routing.
869
+ *
870
+ * ```js
871
+ * {
872
+ * rules: [
873
+ * {
874
+ * listen: "80/http",
875
+ * container: "app",
876
+ * conditions: { path: "/api/*" }
877
+ * },
878
+ * {
879
+ * listen: "80/http",
880
+ * container: "admin",
881
+ * conditions: { path: "/admin/*" }
882
+ * }
883
+ * ]
884
+ * }
885
+ * ```
886
+ *
887
+ * Additionally, you can redirect traffic from one port to another. This is
888
+ * commonly used to redirect http to https.
889
+ *
890
+ * ```js
891
+ * {
892
+ * rules: [
893
+ * { listen: "80/http", redirect: "443/https" },
894
+ * { listen: "443/https", forward: "80/http" }
895
+ * ]
896
+ * }
897
+ * ```
898
+ */
899
+ rules?: Input<Prettify<ServiceRules>[]>;
900
+ /**
901
+ * Configure the health check that the load balancer runs on your containers.
902
+ *
903
+ * :::tip
904
+ * This health check is different from the [`health`](#health) check.
905
+ * :::
906
+ *
907
+ * This health check is run by the load balancer. While, `health` is run by ECS. This
908
+ * cannot be disabled if you are using a load balancer. While the other is off by default.
909
+ *
910
+ * Since this cannot be disabled, here are some tips on how to debug an unhealthy
911
+ * health check.
912
+ *
913
+ * <details>
914
+ * <summary>How to debug a load balancer health check</summary>
915
+ *
916
+ * If you notice a `Unhealthy: Health checks failed` error, it's because the health
917
+ * check has failed. When it fails, the load balancer will terminate the containers,
918
+ * causing any requests to fail.
919
+ *
920
+ * Here's how to debug it:
921
+ *
922
+ * 1. Verify the health check path.
923
+ *
924
+ * By default, the load balancer checks the `/` path. Ensure it's accessible in your
925
+ * containers. If your application runs on a different path, then update the path in
926
+ * the health check config accordingly.
927
+ *
928
+ * 2. Confirm the containers are operational.
929
+ *
930
+ * Navigate to **ECS console** > select the **cluster** > go to the **Tasks tab** >
931
+ * choose **Any desired status** under the **Filter desired status** dropdown > select
932
+ * a task and check for errors under the **Logs tab**. If it has error that means that
933
+ * the container failed to start.
934
+ *
935
+ * 3. If the container was terminated by the load balancer while still starting up, try
936
+ * increasing the health check interval and timeout.
937
+ * </details>
938
+ *
939
+ * For `http` and `https` the default is:
940
+ *
941
+ * ```js
942
+ * {
943
+ * path: "/",
944
+ * healthyThreshold: 5,
945
+ * successCodes: "200",
946
+ * timeout: "5 seconds",
947
+ * unhealthyThreshold: 2,
948
+ * interval: "30 seconds"
949
+ * }
950
+ * ```
951
+ *
952
+ * For `tcp` and `udp` the default is:
953
+ *
954
+ * ```js
955
+ * {
956
+ * healthyThreshold: 5,
957
+ * timeout: "6 seconds",
958
+ * unhealthyThreshold: 2,
959
+ * interval: "30 seconds"
960
+ * }
961
+ * ```
962
+ *
963
+ * @example
964
+ *
965
+ * To configure the health check, we use the _port/protocol_ format. Here we are
966
+ * configuring a health check that pings the `/health` path on port `8080`
967
+ * every 10 seconds.
968
+ *
969
+ * ```js
970
+ * {
971
+ * rules: [
972
+ * { listen: "80/http", forward: "8080/http" }
973
+ * ],
974
+ * health: {
975
+ * "8080/http": {
976
+ * path: "/health",
977
+ * interval: "10 seconds"
978
+ * }
979
+ * }
980
+ * }
981
+ * ```
982
+ *
983
+ */
984
+ health?: Input<
985
+ Record<
986
+ Port,
987
+ Input<{
988
+ /**
989
+ * The URL path to ping on the service for health checks. Only applicable to
990
+ * `http` and `https` protocols.
991
+ * @default `"/"`
992
+ */
993
+ path?: Input<string>;
994
+ /**
995
+ * The time period between each health check request. Must be between `5 seconds`
996
+ * and `300 seconds`.
997
+ * @default `"30 seconds"`
998
+ */
999
+ interval?: Input<DurationMinutes>;
1000
+ /**
1001
+ * The timeout for each health check request. If no response is received within this
1002
+ * time, it is considered failed. Must be between `2 seconds` and `120 seconds`.
1003
+ * @default `"5 seconds"`
1004
+ */
1005
+ timeout?: Input<DurationMinutes>;
1006
+ /**
1007
+ * The number of consecutive successful health check requests required to consider the
1008
+ * target healthy. Must be between 2 and 10.
1009
+ * @default `5`
1010
+ */
1011
+ healthyThreshold?: Input<number>;
1012
+ /**
1013
+ * The number of consecutive failed health check requests required to consider the
1014
+ * target unhealthy. Must be between 2 and 10.
1015
+ * @default `2`
1016
+ */
1017
+ unhealthyThreshold?: Input<number>;
1018
+ /**
1019
+ * One or more HTTP response codes the health check treats as successful. Only
1020
+ * applicable to `http` and `https` protocols.
1021
+ *
1022
+ * @default `"200"`
1023
+ * @example
1024
+ * ```js
1025
+ * {
1026
+ * successCodes: "200-299"
1027
+ * }
1028
+ * ```
1029
+ */
1030
+ successCodes?: Input<string>;
1031
+ }>
1032
+ >
1033
+ >;
1034
+ }
1035
+ | {
1036
+ /**
1037
+ * The `Alb` instance to attach this service to. When provided, the service creates
1038
+ * target groups and listener rules on the shared ALB instead of creating its own
1039
+ * load balancer.
1040
+ *
1041
+ * ECS tasks use the VPC's default security group, which allows all traffic within the
1042
+ * VPC CIDR. For tighter security, add an explicit security group ingress rule from the
1043
+ * ALB's security group using `transform`.
1044
+ *
1045
+ * @example
1046
+ * ```js
1047
+ * {
1048
+ * loadBalancer: {
1049
+ * instance: alb,
1050
+ * rules: [
1051
+ * { listen: "443/https", forward: "8080/http", conditions: { path: "/api/*" }, priority: 100 }
1052
+ * ]
1053
+ * }
1054
+ * }
1055
+ * ```
1056
+ */
1057
+ instance: Alb;
1058
+ /**
1059
+ * The rules for routing traffic from the ALB to this service's containers.
1060
+ * Each rule must have explicit conditions and priority.
1061
+ */
1062
+ rules: Prettify<ServiceAlbRule>[];
1063
+ /**
1064
+ * Configure health checks for the target groups. Uses the same format as the inline
1065
+ * health check config, keyed by `{port}/{protocol}`.
1066
+ */
1067
+ health?: Record<
1068
+ AlbPort,
1069
+ Input<{
1070
+ path?: Input<string>;
1071
+ interval?: Input<DurationMinutes>;
1072
+ timeout?: Input<DurationMinutes>;
1073
+ healthyThreshold?: Input<number>;
1074
+ unhealthyThreshold?: Input<number>;
1075
+ successCodes?: Input<string>;
1076
+ }>
1077
+ >;
1078
+ }
1079
+ >;
1080
+ /**
1081
+ * Configure the CloudMap service registry for the service.
1082
+ *
1083
+ * This creates an `srv` record in the CloudMap service. This is needed if you want to connect
1084
+ * an `ApiGatewayV2` VPC link to the service.
1085
+ *
1086
+ * API Gateway will forward requests to the given port on the service.
1087
+ *
1088
+ * @example
1089
+ * ```js
1090
+ * {
1091
+ * serviceRegistry: {
1092
+ * port: 80
1093
+ * }
1094
+ * }
1095
+ * ```
1096
+ */
1097
+ serviceRegistry?: Input<{
1098
+ /**
1099
+ * The port in the service to forward requests to.
1100
+ */
1101
+ port: number;
1102
+ }>;
1103
+ /**
1104
+ * Configure the service to automatically scale up or down based on the CPU or memory
1105
+ * utilization of a container. By default, scaling is disabled and the service will run
1106
+ * in a single container.
1107
+ *
1108
+ * @default `{ min: 1, max: 1 }`
1109
+ *
1110
+ * @example
1111
+ * ```js
1112
+ * {
1113
+ * scaling: {
1114
+ * min: 4,
1115
+ * max: 16,
1116
+ * cpuUtilization: 50,
1117
+ * memoryUtilization: 50
1118
+ * }
1119
+ * }
1120
+ * ```
1121
+ */
1122
+ scaling?: Input<{
1123
+ /**
1124
+ * The minimum number of containers to scale down to.
1125
+ * @default `1`
1126
+ * @example
1127
+ * ```js
1128
+ * {
1129
+ * scaling: {
1130
+ * min: 4
1131
+ * }
1132
+ * }
1133
+ * ```
1134
+ */
1135
+ min?: Input<number>;
1136
+ /**
1137
+ * The maximum number of containers to scale up to.
1138
+ * @default `1`
1139
+ * @example
1140
+ * ```js
1141
+ * {
1142
+ * scaling: {
1143
+ * max: 16
1144
+ * }
1145
+ * }
1146
+ * ```
1147
+ */
1148
+ max?: Input<number>;
1149
+ /**
1150
+ * The target CPU utilization percentage to scale up or down. It'll scale up
1151
+ * when the CPU utilization is above the target and scale down when it's below the target.
1152
+ * @default `70`
1153
+ * @example
1154
+ * ```js
1155
+ * {
1156
+ * scaling: {
1157
+ * cpuUtilization: 50
1158
+ * }
1159
+ * }
1160
+ * ```
1161
+ */
1162
+ cpuUtilization?: Input<false | number>;
1163
+ /**
1164
+ * The target memory utilization percentage to scale up or down. It'll scale up
1165
+ * when the memory utilization is above the target and scale down when it's below the target.
1166
+ * @default `70`
1167
+ * @example
1168
+ * ```js
1169
+ * {
1170
+ * scaling: {
1171
+ * memoryUtilization: 50
1172
+ * }
1173
+ * }
1174
+ * ```
1175
+ */
1176
+ memoryUtilization?: Input<false | number>;
1177
+ /**
1178
+ * The target request count to scale up or down. It'll scale up when the request count is
1179
+ * above the target and scale down when it's below the target.
1180
+ * @default `false`
1181
+ * @example
1182
+ * ```js
1183
+ * {
1184
+ * scaling: {
1185
+ * requestCount: 1500
1186
+ * }
1187
+ * }
1188
+ * ```
1189
+ */
1190
+ requestCount?: Input<false | number>;
1191
+ /**
1192
+ * The amount of time, in seconds, after a scale-in activity completes before another scale-in activity can start.
1193
+ * This prevents the auto scaler from removing too many tasks too quickly.
1194
+ * @example
1195
+ * ```js
1196
+ * {
1197
+ * scaling: {
1198
+ * scaleInCooldown: "60 seconds"
1199
+ * }
1200
+ * }
1201
+ * ```
1202
+ */
1203
+ scaleInCooldown?: Input<DurationMinutes>;
1204
+ /**
1205
+ * The amount of time, in seconds, after a scale-out activity completes before another scale-out activity can start.
1206
+ * This prevents the auto scaler from adding too many tasks too quickly.
1207
+ * @example
1208
+ * ```js
1209
+ * {
1210
+ * scaling: {
1211
+ * scaleOutCooldown: "60 seconds"
1212
+ * }
1213
+ * }
1214
+ * ```
1215
+ */
1216
+ scaleOutCooldown?: Input<DurationMinutes>;
1217
+ }>;
1218
+ /**
1219
+ * Configure the capacity provider; regular Fargate or Fargate Spot, for this service.
1220
+ *
1221
+ * :::tip
1222
+ * Fargate Spot is a good option for dev or PR environments.
1223
+ * :::
1224
+ *
1225
+ * Fargate Spot allows you to run containers on spare AWS capacity at around 50% discount
1226
+ * compared to regular Fargate. [Learn more about Fargate
1227
+ * pricing](https://aws.amazon.com/fargate/pricing/).
1228
+ *
1229
+ * :::note
1230
+ * AWS might shut down Fargate Spot instances to reclaim capacity.
1231
+ * :::
1232
+ *
1233
+ * There are a couple of caveats:
1234
+ *
1235
+ * 1. AWS may reclaim this capacity and **turn off your service** after a two-minute warning.
1236
+ * This is rare, but it can happen.
1237
+ * 2. If there's no spare capacity, you'll **get an error**.
1238
+ *
1239
+ * This makes Fargate Spot a good option for dev or PR environments. You can set this using.
1240
+ *
1241
+ * ```js
1242
+ * {
1243
+ * capacity: "spot"
1244
+ * }
1245
+ * ```
1246
+ *
1247
+ * You can also configure the % of regular vs spot capacity you want through the `weight` prop.
1248
+ * And optionally set the `base` or first X number of tasks that'll be started using a given
1249
+ * capacity.
1250
+ *
1251
+ * For example, the `base: 1` says that the first task uses regular Fargate, and from that
1252
+ * point on there will be an even split between the capacity providers.
1253
+ *
1254
+ * ```js
1255
+ * {
1256
+ * capacity: {
1257
+ * fargate: { weight: 1, base: 1 },
1258
+ * spot: { weight: 1 }
1259
+ * }
1260
+ * }
1261
+ * ```
1262
+ *
1263
+ * The `base` works in tandem with the `scaling` prop. So setting `base` to X doesn't mean
1264
+ * it'll start those tasks right away. It means that as your service scales up, according to
1265
+ * the `scaling` prop, it'll ensure that the first X tasks will be with the given capacity.
1266
+ *
1267
+ * :::caution
1268
+ * Changing `capacity` requires taking down and recreating the ECS service.
1269
+ * :::
1270
+ *
1271
+ * And this is why you can only set the `base` for only one capacity provider. So you
1272
+ * are not allowed to do the following.
1273
+ *
1274
+ * ```js
1275
+ * {
1276
+ * capacity: {
1277
+ * fargate: { weight: 1, base: 1 },
1278
+ * // This will give you an error
1279
+ * spot: { weight: 1, base: 1 }
1280
+ * }
1281
+ * }
1282
+ * ```
1283
+ *
1284
+ * When you change the `capacity`, the ECS service is terminated and recreated. This will
1285
+ * cause some temporary downtime.
1286
+ *
1287
+ * @default Regular Fargate
1288
+ *
1289
+ * @example
1290
+ *
1291
+ * Here are some examples settings.
1292
+ *
1293
+ * - Use only Fargate Spot.
1294
+ *
1295
+ * ```js
1296
+ * {
1297
+ * capacity: "spot"
1298
+ * }
1299
+ * ```
1300
+ * - Use 50% regular Fargate and 50% Fargate Spot.
1301
+ *
1302
+ * ```js
1303
+ * {
1304
+ * capacity: {
1305
+ * fargate: { weight: 1 },
1306
+ * spot: { weight: 1 }
1307
+ * }
1308
+ * }
1309
+ * ```
1310
+ * - Use 50% regular Fargate and 50% Fargate Spot. And ensure that the first 2 tasks use
1311
+ * regular Fargate.
1312
+ *
1313
+ * ```js
1314
+ * {
1315
+ * capacity: {
1316
+ * fargate: { weight: 1, base: 2 },
1317
+ * spot: { weight: 1 }
1318
+ * }
1319
+ * }
1320
+ * ```
1321
+ */
1322
+ capacity?: Input<
1323
+ | "spot"
1324
+ | {
1325
+ /**
1326
+ * Configure how the regular Fargate capacity is allocated.
1327
+ */
1328
+ fargate?: Input<{
1329
+ /**
1330
+ * Start the first `base` number of tasks with the given capacity.
1331
+ *
1332
+ * :::caution
1333
+ * You can only specify `base` for one capacity provider.
1334
+ * :::
1335
+ */
1336
+ base?: Input<number>;
1337
+ /**
1338
+ * Ensure the given ratio of tasks are started for this capacity.
1339
+ */
1340
+ weight: Input<number>;
1341
+ }>;
1342
+ /**
1343
+ * Configure how the Fargate spot capacity is allocated.
1344
+ */
1345
+ spot?: Input<{
1346
+ /**
1347
+ * Start the first `base` number of tasks with the given capacity.
1348
+ *
1349
+ * :::caution
1350
+ * You can only specify `base` for one capacity provider.
1351
+ * :::
1352
+ */
1353
+ base?: Input<number>;
1354
+ /**
1355
+ * Ensure the given ratio of tasks are started for this capacity.
1356
+ */
1357
+ weight: Input<number>;
1358
+ }>;
1359
+ }
1360
+ >;
1361
+ /**
1362
+ * Configure the health check that ECS runs on your containers.
1363
+ *
1364
+ * :::tip
1365
+ * This health check is different from the [`loadBalancer.health`](#loadbalancer-health) check.
1366
+ * :::
1367
+ *
1368
+ * This health check is run by ECS. While, `loadBalancer.health` is run by the load balancer,
1369
+ * if you are using one. This is off by default. While the load balancer one
1370
+ * cannot be disabled.
1371
+ *
1372
+ * This config maps to the `HEALTHCHECK` parameter of the `docker run` command. Learn
1373
+ * more about [container health checks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html).
1374
+ *
1375
+ * @default Health check is disabled
1376
+ * @example
1377
+ * ```js
1378
+ * {
1379
+ * health: {
1380
+ * command: ["CMD-SHELL", "curl -f http://localhost:3000/ || exit 1"],
1381
+ * startPeriod: "60 seconds",
1382
+ * timeout: "5 seconds",
1383
+ * interval: "30 seconds",
1384
+ * retries: 3
1385
+ * }
1386
+ * }
1387
+ * ```
1388
+ */
1389
+ health?: Input<{
1390
+ /**
1391
+ * A string array representing the command that the container runs to determine if it is
1392
+ * healthy.
1393
+ *
1394
+ * It must start with `CMD` to run the command arguments directly. Or `CMD-SHELL` to run
1395
+ * the command with the container's default shell.
1396
+ *
1397
+ * @example
1398
+ * ```js
1399
+ * {
1400
+ * command: ["CMD-SHELL", "curl -f http://localhost:3000/ || exit 1"]
1401
+ * }
1402
+ * ```
1403
+ */
1404
+ command: Input<string[]>;
1405
+ /**
1406
+ * The grace period to provide containers time to bootstrap before failed health checks
1407
+ * count towards the maximum number of retries. Must be between `0 seconds` and
1408
+ * `300 seconds`.
1409
+ * @default `"0 seconds"`
1410
+ */
1411
+ startPeriod?: Input<DurationMinutes>;
1412
+ /**
1413
+ * The maximum time to allow one command to run. Must be between `2 seconds` and
1414
+ * `60 seconds`.
1415
+ * @default `"5 seconds"`
1416
+ */
1417
+ timeout?: Input<DurationMinutes>;
1418
+ /**
1419
+ * The time between running the command for the health check. Must be between `5 seconds`
1420
+ * and `300 seconds`.
1421
+ * @default `"30 seconds"`
1422
+ */
1423
+ interval?: Input<DurationMinutes>;
1424
+ /**
1425
+ * The number of consecutive failures required to consider the check to have failed. Must
1426
+ * be between `1` and `10`.
1427
+ * @default `3`
1428
+ */
1429
+ retries?: Input<number>;
1430
+ }>;
1431
+ /**
1432
+ * The containers to run in the service.
1433
+ *
1434
+ * :::tip
1435
+ * You can optionally run multiple containers in a service.
1436
+ * :::
1437
+ *
1438
+ * By default this starts a single container. To add multiple containers in the service, pass
1439
+ * in an array of containers args.
1440
+ *
1441
+ * ```ts
1442
+ * {
1443
+ * containers: [
1444
+ * {
1445
+ * name: "app",
1446
+ * image: "nginxdemos/hello:plain-text"
1447
+ * },
1448
+ * {
1449
+ * name: "admin",
1450
+ * image: {
1451
+ * context: "./admin",
1452
+ * dockerfile: "Dockerfile"
1453
+ * }
1454
+ * }
1455
+ * ]
1456
+ * }
1457
+ * ```
1458
+ *
1459
+ * If you specify `containers`, you cannot list the above args at the top-level. For example,
1460
+ * you **cannot** pass in `image` at the top level.
1461
+ *
1462
+ * ```diff lang="ts"
1463
+ * {
1464
+ * - image: "nginxdemos/hello:plain-text",
1465
+ * containers: [
1466
+ * {
1467
+ * name: "app",
1468
+ * image: "nginxdemos/hello:plain-text"
1469
+ * },
1470
+ * {
1471
+ * name: "admin",
1472
+ * image: "nginxdemos/hello:plain-text"
1473
+ * }
1474
+ * ]
1475
+ * }
1476
+ * ```
1477
+ *
1478
+ * You will need to pass in `image` as a part of the `containers`.
1479
+ */
1480
+ containers?: Input<Prettify<ServiceContainerArgs>>[];
1481
+ /**
1482
+ * Configure if `sst deploy` should wait for the service to be stable.
1483
+ *
1484
+ * :::tip
1485
+ * For non-prod environments it might make sense to pass in `false`.
1486
+ * :::
1487
+ *
1488
+ * Waiting for this process to finish ensures that new content will be available after
1489
+ * the deploy finishes. However, this process can sometimes take more than 5 mins.
1490
+ * @default `false`
1491
+ * @example
1492
+ * ```js
1493
+ * {
1494
+ * wait: true
1495
+ * }
1496
+ * ```
1497
+ */
1498
+ wait?: Input<boolean>;
1499
+ /**
1500
+ * [Transform](/docs/components#transform) how this component creates its underlying
1501
+ * resources.
1502
+ */
1503
+ transform?: Prettify<
1504
+ FargateBaseArgs["transform"] & {
1505
+ /**
1506
+ * Transform the ECS Service resource.
1507
+ */
1508
+ service?: Transform<ecs.ServiceArgs>;
1509
+ /**
1510
+ * Transform the AWS Load Balancer resource.
1511
+ */
1512
+ loadBalancer?: Transform<lb.LoadBalancerArgs>;
1513
+ /**
1514
+ * Transform the AWS Security Group resource for the Load Balancer.
1515
+ */
1516
+ loadBalancerSecurityGroup?: Transform<ec2.SecurityGroupArgs>;
1517
+ /**
1518
+ * Transform the AWS Load Balancer listener resource.
1519
+ */
1520
+ listener?: Transform<lb.ListenerArgs>;
1521
+ /**
1522
+ * Transform the AWS Load Balancer target group resource.
1523
+ */
1524
+ target?: Transform<lb.TargetGroupArgs>;
1525
+ /**
1526
+ * Transform the AWS Application Auto Scaling target resource.
1527
+ */
1528
+ autoScalingTarget?: Transform<appautoscaling.TargetArgs>;
1529
+ /**
1530
+ * Transform the AWS Load Balancer listener rule resource. Only applies when
1531
+ * attaching to an external ALB via the `loadBalancer.instance` prop.
1532
+ */
1533
+ listenerRule?: Transform<lb.ListenerRuleArgs>;
1534
+ }
1535
+ >;
1536
+ }
1537
+
1538
+ /**
1539
+ * The `Service` component lets you create containers that are always running, like web or
1540
+ * application servers. It uses [Amazon ECS](https://aws.amazon.com/ecs/) on [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html).
1541
+ *
1542
+ * @example
1543
+ *
1544
+ * #### Create a Service
1545
+ *
1546
+ * Services are run inside an ECS Cluster. If you haven't already, create one.
1547
+ *
1548
+ * ```ts title="sst.config.ts"
1549
+ * const vpc = new sst.aws.Vpc("MyVpc");
1550
+ * const cluster = new sst.aws.Cluster("MyCluster", { vpc });
1551
+ * ```
1552
+ *
1553
+ * Add the service to it.
1554
+ *
1555
+ * ```ts title="sst.config.ts"
1556
+ * const service = new sst.aws.Service("MyService", { cluster });
1557
+ * ```
1558
+ *
1559
+ * #### Configure the container image
1560
+ *
1561
+ * By default, the service will look for a Dockerfile in the root directory. Optionally
1562
+ * configure the image context and dockerfile.
1563
+ *
1564
+ * ```ts title="sst.config.ts"
1565
+ * new sst.aws.Service("MyService", {
1566
+ * cluster,
1567
+ * image: {
1568
+ * context: "./app",
1569
+ * dockerfile: "Dockerfile"
1570
+ * }
1571
+ * });
1572
+ * ```
1573
+ *
1574
+ * To add multiple containers in the service, pass in an array of containers args.
1575
+ *
1576
+ * ```ts title="sst.config.ts"
1577
+ * new sst.aws.Service("MyService", {
1578
+ * cluster,
1579
+ * containers: [
1580
+ * {
1581
+ * name: "app",
1582
+ * image: "nginxdemos/hello:plain-text"
1583
+ * },
1584
+ * {
1585
+ * name: "admin",
1586
+ * image: {
1587
+ * context: "./admin",
1588
+ * dockerfile: "Dockerfile"
1589
+ * }
1590
+ * }
1591
+ * ]
1592
+ * });
1593
+ * ```
1594
+ *
1595
+ * This is useful for running sidecar containers.
1596
+ *
1597
+ * #### Enable auto-scaling
1598
+ *
1599
+ * ```ts title="sst.config.ts"
1600
+ * new sst.aws.Service("MyService", {
1601
+ * cluster,
1602
+ * scaling: {
1603
+ * min: 4,
1604
+ * max: 16,
1605
+ * cpuUtilization: 50,
1606
+ * memoryUtilization: 50
1607
+ * }
1608
+ * });
1609
+ * ```
1610
+ *
1611
+ * #### Expose through API Gateway
1612
+ *
1613
+ * You can give your service a public URL by exposing it through API Gateway HTTP API. You can
1614
+ * also optionally give it a custom domain.
1615
+ *
1616
+ * ```ts title="sst.config.ts"
1617
+ * const service = new sst.aws.Service("MyService", {
1618
+ * cluster,
1619
+ * serviceRegistry: {
1620
+ * port: 80
1621
+ * }
1622
+ * });
1623
+ *
1624
+ * const api = new sst.aws.ApiGatewayV2("MyApi", {
1625
+ * vpc,
1626
+ * domain: "example.com"
1627
+ * });
1628
+ * api.routePrivate("$default", service.nodes.cloudmapService.arn);
1629
+ * ```
1630
+ *
1631
+ * #### Add a load balancer
1632
+ *
1633
+ * You can also expose your service by adding a load balancer to it and optionally
1634
+ * adding a custom domain.
1635
+ *
1636
+ * ```ts title="sst.config.ts"
1637
+ * new sst.aws.Service("MyService", {
1638
+ * cluster,
1639
+ * loadBalancer: {
1640
+ * domain: "example.com",
1641
+ * rules: [
1642
+ * { listen: "80/http" },
1643
+ * { listen: "443/https", forward: "80/http" }
1644
+ * ]
1645
+ * }
1646
+ * });
1647
+ * ```
1648
+ *
1649
+ * #### Link resources
1650
+ *
1651
+ * [Link resources](/docs/linking/) to your service. This will grant permissions
1652
+ * to the resources and allow you to access it in your app.
1653
+ *
1654
+ * ```ts {5} title="sst.config.ts"
1655
+ * const bucket = new sst.aws.Bucket("MyBucket");
1656
+ *
1657
+ * new sst.aws.Service("MyService", {
1658
+ * cluster,
1659
+ * link: [bucket]
1660
+ * });
1661
+ * ```
1662
+ *
1663
+ * You can use the [SDK](/docs/reference/sdk/) to access the linked resources in your service.
1664
+ *
1665
+ * ```ts title="app.ts"
1666
+ * import { Resource } from "sst";
1667
+ *
1668
+ * console.log(Resource.MyBucket.name);
1669
+ * ```
1670
+ *
1671
+ * #### Service discovery
1672
+ *
1673
+ * This component automatically creates a Cloud Map service host name for the
1674
+ * service. So anything in the same VPC can access it using the service's host name.
1675
+ *
1676
+ * For example, if you link the service to a Lambda function that's in the same VPC.
1677
+ *
1678
+ * ```ts title="sst.config.ts" {2,4}
1679
+ * new sst.aws.Function("MyFunction", {
1680
+ * vpc,
1681
+ * url: true,
1682
+ * link: [service],
1683
+ * handler: "lambda.handler"
1684
+ * });
1685
+ * ```
1686
+ *
1687
+ * You can access the service by its host name using the [SDK](/docs/reference/sdk/).
1688
+ *
1689
+ * ```ts title="lambda.ts"
1690
+ * import { Resource } from "sst";
1691
+ *
1692
+ * await fetch(`http://${Resource.MyService.service}`);
1693
+ * ```
1694
+ *
1695
+ * [Check out an example](/docs/examples/#aws-cluster-service-discovery).
1696
+ *
1697
+ * ---
1698
+ *
1699
+ * ### Cost
1700
+ *
1701
+ * By default, this uses a _Linux/X86_ _Fargate_ container with 0.25 vCPUs at $0.04048 per
1702
+ * vCPU per hour and 0.5 GB of memory at $0.004445 per GB per hour. It includes 20GB of
1703
+ * _Ephemeral Storage_ for free with additional storage at $0.000111 per GB per hour. Each
1704
+ * container also gets a public IPv4 address at $0.005 per hour.
1705
+ *
1706
+ * It works out to $0.04048 x 0.25 x 24 x 30 + $0.004445 x 0.5 x 24 x 30 + $0.005
1707
+ * x 24 x 30 or **$12 per month**.
1708
+ *
1709
+ * If you are using all Fargate Spot instances with `capacity: "spot"`, it's $0.01218784 x 0.25
1710
+ * x 24 x 30 + $0.00133831 x 0.5 x 24 x 30 + $0.005 x 24 x 30 or **$6 per month**
1711
+ *
1712
+ * Adjust this for the `cpu`, `memory` and `storage` you are using. And
1713
+ * check the prices for _Linux/ARM_ if you are using `arm64` as your `architecture`.
1714
+ *
1715
+ * The above are rough estimates for _us-east-1_, check out the
1716
+ * [Fargate pricing](https://aws.amazon.com/fargate/pricing/) and the
1717
+ * [Public IPv4 Address pricing](https://aws.amazon.com/vpc/pricing/) for more details.
1718
+ *
1719
+ * #### Scaling
1720
+ *
1721
+ * By default, `scaling` is disabled. If enabled, adjust the above for the number of containers.
1722
+ *
1723
+ * #### API Gateway
1724
+ *
1725
+ * If you expose your service through API Gateway, you'll need to add the cost of
1726
+ * [API Gateway HTTP API](https://aws.amazon.com/api-gateway/pricing/#HTTP_APIs) as well.
1727
+ * For services that don't get a lot of traffic, this ends up being a lot cheaper since API
1728
+ * Gateway is pay per request.
1729
+ *
1730
+ * Learn more about using
1731
+ * [Cluster with API Gateway](/docs/examples/#aws-cluster-with-api-gateway).
1732
+ *
1733
+ * #### Application Load Balancer
1734
+ *
1735
+ * If you add `loadBalancer` _HTTP_ or _HTTPS_ `rules`, an ALB is created at $0.0225 per hour,
1736
+ * $0.008 per LCU-hour, and $0.005 per hour if HTTPS with a custom domain is used. Where LCU
1737
+ * is a measure of how much traffic is processed.
1738
+ *
1739
+ * That works out to $0.0225 x 24 x 30 or **$16 per month**. Add $0.005 x 24 x 30 or **$4 per
1740
+ * month** for HTTPS. Also add the LCU-hour used.
1741
+ *
1742
+ * The above are rough estimates for _us-east-1_, check out the
1743
+ * [Application Load Balancer pricing](https://aws.amazon.com/elasticloadbalancing/pricing/)
1744
+ * for more details.
1745
+ *
1746
+ * #### Network Load Balancer
1747
+ *
1748
+ * If you add `loadBalancer` _TCP_, _UDP_, or _TLS_ `rules`, an NLB is created at $0.0225 per hour and
1749
+ * $0.006 per NLCU-hour. Where NCLU is a measure of how much traffic is processed.
1750
+ *
1751
+ * That works out to $0.0225 x 24 x 30 or **$16 per month**. Also add the NLCU-hour used.
1752
+ *
1753
+ * The above are rough estimates for _us-east-1_, check out the
1754
+ * [Network Load Balancer pricing](https://aws.amazon.com/elasticloadbalancing/pricing/)
1755
+ * for more details.
1756
+ */
1757
+ export class Service extends Component implements Link.Linkable {
1758
+ private readonly _name: string;
1759
+ private readonly _service?: Output<ecs.Service>;
1760
+ private readonly cloudmapNamespace?: Output<string | undefined>;
1761
+ private readonly cloudmapService?: Output<
1762
+ servicediscovery.Service | undefined
1763
+ >;
1764
+ private readonly executionRole?: iam.Role;
1765
+ private readonly taskRole: iam.Role;
1766
+ private readonly taskDefinition?: Output<ecs.TaskDefinition>;
1767
+ private readonly loadBalancer?: lb.LoadBalancer;
1768
+ private readonly autoScalingTarget?: appautoscaling.Target;
1769
+ private readonly domain?: Output<string | undefined>;
1770
+ private readonly _url?: Output<string>;
1771
+ private readonly devUrl?: Output<string>;
1772
+ private readonly dev: boolean;
1773
+
1774
+ constructor(
1775
+ name: string,
1776
+ args: ServiceArgs,
1777
+ opts: ComponentResourceOptions = {},
1778
+ ) {
1779
+ super(__pulumiType, name, args, opts);
1780
+ this._name = name;
1781
+
1782
+ const self = this;
1783
+ const clusterArn = args.cluster.nodes.cluster.arn;
1784
+ const clusterName = args.cluster.nodes.cluster.name;
1785
+ const region = getRegionOutput({}, opts).region;
1786
+ const dev = normalizeDev();
1787
+ const wait = output(args.wait ?? false);
1788
+ const architecture = normalizeArchitecture(args);
1789
+ const cpu = normalizeCpu(args);
1790
+ const memory = normalizeMemory(cpu, args);
1791
+ const storage = normalizeStorage(args);
1792
+ const containers = normalizeContainers("service", args, name, architecture);
1793
+ const albAttachment = detectAlbAttachment();
1794
+ const lbArgs = albAttachment ? undefined : normalizeLoadBalancer();
1795
+ const scaling = normalizeScaling();
1796
+ const capacity = normalizeCapacity();
1797
+ const vpc = normalizeVpc();
1798
+
1799
+ const taskRole = createTaskRole(name, args, opts, self, !!dev);
1800
+
1801
+ this.dev = !!dev;
1802
+ this.cloudmapNamespace = vpc.cloudmapNamespaceName;
1803
+ this.taskRole = taskRole;
1804
+
1805
+ if (dev) {
1806
+ this.devUrl = (!lbArgs && !args.loadBalancer) ? undefined : dev.url;
1807
+ registerReceiver();
1808
+ return;
1809
+ }
1810
+
1811
+ const executionRole = createExecutionRole(name, args, opts, self);
1812
+ const taskDefinition = createTaskDefinition(
1813
+ name,
1814
+ args,
1815
+ opts,
1816
+ self,
1817
+ containers,
1818
+ architecture,
1819
+ cpu,
1820
+ memory,
1821
+ storage,
1822
+ taskRole,
1823
+ executionRole,
1824
+ );
1825
+ let loadBalancer: lb.LoadBalancer | undefined;
1826
+ let targetGroups: ReturnType<typeof createTargets>;
1827
+ let targetEntries: Output<{ targetGroup: lb.TargetGroup; containerName: string; containerPort: number }[]>;
1828
+ let effectiveLbArn: Output<string> | undefined;
1829
+ let effectiveDomain: Output<string | undefined>;
1830
+ let effectiveDnsName: Output<string> | undefined;
1831
+ const { cert, arn: certificateArn } = createSsl();
1832
+ if (albAttachment) {
1833
+ all([albAttachment.instance._vpc, vpc.id]).apply(
1834
+ ([albVpcId, clusterVpcId]) => {
1835
+ if (albVpcId !== clusterVpcId) {
1836
+ throw new VisibleError(
1837
+ `The ALB VPC "${albVpcId}" does not match the cluster VPC "${clusterVpcId}" in Service "${name}". The ALB and cluster must be in the same VPC.`,
1838
+ );
1839
+ }
1840
+ },
1841
+ );
1842
+ const { targets: albTargets, entries: albEntries } = createAlbTargetsAndEntries(albAttachment);
1843
+ targetGroups = output(albTargets);
1844
+ targetEntries = albEntries;
1845
+ createAlbListenerRules(albAttachment, albTargets);
1846
+ effectiveLbArn = albAttachment.instance.arn;
1847
+ effectiveDomain = output(undefined);
1848
+ effectiveDnsName = albAttachment.instance.dnsName;
1849
+ } else {
1850
+ loadBalancer = createLoadBalancer();
1851
+ targetGroups = createTargets();
1852
+ targetEntries = computeTargetEntries();
1853
+ createListeners();
1854
+ createDnsRecords();
1855
+ if (loadBalancer) {
1856
+ effectiveLbArn = loadBalancer.arn;
1857
+ effectiveDnsName = loadBalancer.dnsName;
1858
+ }
1859
+ effectiveDomain = lbArgs?.domain?.apply((d) => d?.name) ?? output(undefined);
1860
+ }
1861
+ const cloudmapService = createCloudmapService();
1862
+ const service = createService();
1863
+ const autoScalingTarget = createAutoScaling();
1864
+
1865
+ this._service = service;
1866
+ this.cloudmapService = cloudmapService;
1867
+ this.executionRole = executionRole;
1868
+ this.taskDefinition = taskDefinition;
1869
+ this.loadBalancer = loadBalancer ?? albAttachment?.instance.nodes.loadBalancer;
1870
+ this.autoScalingTarget = autoScalingTarget;
1871
+ this.domain = effectiveDomain;
1872
+ this._url = effectiveDnsName
1873
+ ? all([effectiveDomain, effectiveDnsName]).apply(
1874
+ ([domain, dnsName]) =>
1875
+ domain ? `https://${domain}/` : `http://${dnsName}`,
1876
+ )
1877
+ : undefined;
1878
+
1879
+ this.registerOutputs({ _hint: this._url });
1880
+ registerReceiver();
1881
+
1882
+ function normalizeDev() {
1883
+ if (!$dev) return undefined;
1884
+ if (args.dev === false) return undefined;
1885
+
1886
+ return {
1887
+ url: output(args.dev?.url ?? URL_UNAVAILABLE),
1888
+ };
1889
+ }
1890
+
1891
+ function normalizeVpc() {
1892
+ // "vpc" is a Vpc component
1893
+ if (args.cluster.vpc instanceof Vpc) {
1894
+ const vpc = args.cluster.vpc;
1895
+ return {
1896
+ isSstVpc: true,
1897
+ id: vpc.id,
1898
+ loadBalancerSubnets: lbArgs?.pub.apply((v) =>
1899
+ v ? vpc.publicSubnets : vpc.privateSubnets,
1900
+ ),
1901
+ containerSubnets: vpc.publicSubnets,
1902
+ securityGroups: vpc.securityGroups,
1903
+ cloudmapNamespaceId: vpc.nodes.cloudmapNamespace.id,
1904
+ cloudmapNamespaceName: vpc.nodes.cloudmapNamespace.name,
1905
+ };
1906
+ }
1907
+
1908
+ // "vpc" is object
1909
+ return output(args.cluster.vpc).apply((vpc) => ({
1910
+ isSstVpc: false,
1911
+ ...vpc,
1912
+ }));
1913
+ }
1914
+
1915
+ function normalizeScaling() {
1916
+ // External ALB is always "application" type
1917
+ const lbType = albAttachment ? output("application" as const) : lbArgs?.type;
1918
+ return all([lbType, args.scaling]).apply(([type, v]) => {
1919
+ if (type !== "application" && v?.requestCount)
1920
+ throw new VisibleError(
1921
+ `Request count scaling is only supported for http/https protocols.`,
1922
+ );
1923
+
1924
+ return {
1925
+ min: v?.min ?? 1,
1926
+ max: v?.max ?? 1,
1927
+ cpuUtilization: v?.cpuUtilization ?? 70,
1928
+ memoryUtilization: v?.memoryUtilization ?? 70,
1929
+ requestCount: v?.requestCount ?? false,
1930
+ scaleInCooldown: v?.scaleInCooldown ? toSeconds(v.scaleInCooldown) : undefined,
1931
+ scaleOutCooldown: v?.scaleOutCooldown ? toSeconds(v.scaleOutCooldown) : undefined,
1932
+ };
1933
+ });
1934
+ }
1935
+
1936
+ function normalizeCapacity() {
1937
+ if (!args.capacity) return;
1938
+
1939
+ return output(args.capacity).apply((v) => {
1940
+ if (v === "spot")
1941
+ return { spot: { weight: 1 }, fargate: { weight: 0 } };
1942
+ return v;
1943
+ });
1944
+ }
1945
+
1946
+ function normalizeLoadBalancer() {
1947
+ const loadBalancer = args.loadBalancer ?? args.public;
1948
+ if (!loadBalancer) return;
1949
+ // ALB attachment case is handled by detectAlbAttachment() before this is called
1950
+ const inlineLoadBalancer = output(loadBalancer).apply(
1951
+ (lb) => lb as Exclude<typeof lb, { instance: Alb }>,
1952
+ );
1953
+
1954
+ // normalize rules
1955
+ const rules = all([inlineLoadBalancer, containers]).apply(
1956
+ ([lb, containers]) => {
1957
+ // validate rules
1958
+ const lbRules = lb.rules ?? lb.ports;
1959
+ if (!lbRules || lbRules.length === 0)
1960
+ throw new VisibleError(
1961
+ `You must provide the ports to expose via "loadBalancer.rules".`,
1962
+ );
1963
+
1964
+ // validate container defined when multiple containers exists
1965
+ if (containers.length > 1) {
1966
+ lbRules.forEach((v) => {
1967
+ if (!v.container)
1968
+ throw new VisibleError(
1969
+ `You must provide a container name in "loadBalancer.rules" when there is more than one container.`,
1970
+ );
1971
+ });
1972
+ }
1973
+
1974
+ // parse protocols and ports
1975
+ const rules = lbRules.map((v) => {
1976
+ const listenParts = v.listen.split("/");
1977
+ const listenPort = parseInt(listenParts[0]);
1978
+ const listenProtocol = listenParts[1];
1979
+ const listenConditions =
1980
+ v.conditions || v.path
1981
+ ? {
1982
+ path: v.conditions?.path ?? v.path,
1983
+ query: v.conditions?.query,
1984
+ header: v.conditions?.header,
1985
+ }
1986
+ : undefined;
1987
+ if (protocolType(listenProtocol) === "network" && listenConditions)
1988
+ throw new VisibleError(
1989
+ `Invalid rule conditions for listen protocol "${v.listen}". Only "http" protocols support conditions.`,
1990
+ );
1991
+
1992
+ const redirectParts = v.redirect?.split("/");
1993
+ const redirectPort = redirectParts && parseInt(redirectParts[0]);
1994
+ const redirectProtocol = redirectParts && redirectParts[1];
1995
+ if (redirectPort && redirectProtocol) {
1996
+ if (
1997
+ protocolType(listenProtocol) !== protocolType(redirectProtocol)
1998
+ )
1999
+ throw new VisibleError(
2000
+ `The listen protocol "${v.listen}" must match the redirect protocol "${v.redirect}".`,
2001
+ );
2002
+ return {
2003
+ type: "redirect" as const,
2004
+ listenPort,
2005
+ listenProtocol,
2006
+ listenConditions,
2007
+ redirectPort,
2008
+ redirectProtocol,
2009
+ };
2010
+ }
2011
+
2012
+ const forwardParts = v.forward ? v.forward.split("/") : listenParts;
2013
+ const forwardPort = forwardParts && parseInt(forwardParts[0]);
2014
+ const forwardProtocol = forwardParts && forwardParts[1];
2015
+ if (protocolType(listenProtocol) !== protocolType(forwardProtocol))
2016
+ throw new VisibleError(
2017
+ `The listen protocol "${v.listen}" must match the forward protocol "${v.forward}".`,
2018
+ );
2019
+ return {
2020
+ type: "forward" as const,
2021
+ listenPort,
2022
+ listenProtocol,
2023
+ listenConditions,
2024
+ forwardPort,
2025
+ forwardProtocol,
2026
+ container: v.container ?? containers[0].name,
2027
+ };
2028
+ });
2029
+
2030
+ // validate protocols are consistent
2031
+ const appProtocols = rules.filter(
2032
+ (rule) => protocolType(rule.listenProtocol) === "application",
2033
+ );
2034
+ if (appProtocols.length > 0 && appProtocols.length < rules.length)
2035
+ throw new VisibleError(
2036
+ `Protocols must be either all http/https, or all tcp/udp/tcp_udp/tls.`,
2037
+ );
2038
+
2039
+ // validate certificate exists for https/tls protocol
2040
+ rules.forEach((rule) => {
2041
+ if (["https", "tls"].includes(rule.listenProtocol) && !lb.domain) {
2042
+ throw new VisibleError(
2043
+ `You must provide a custom domain for ${rule.listenProtocol.toUpperCase()} protocol.`,
2044
+ );
2045
+ }
2046
+ });
2047
+
2048
+ return rules;
2049
+ },
2050
+ );
2051
+
2052
+ // normalize domain
2053
+ const domain = output(inlineLoadBalancer).apply((lb) => {
2054
+ if (!lb.domain) return undefined;
2055
+
2056
+ // normalize domain
2057
+ const domain =
2058
+ typeof lb.domain === "string" ? { name: lb.domain } : lb.domain;
2059
+ return {
2060
+ name: domain.name,
2061
+ aliases: domain.aliases ?? [],
2062
+ dns: domain.dns === false ? undefined : domain.dns ?? awsDns(),
2063
+ cert: domain.cert,
2064
+ };
2065
+ });
2066
+
2067
+ // normalize type
2068
+ const type = output(rules).apply((rules) =>
2069
+ rules[0].listenProtocol.startsWith("http") ? "application" : "network",
2070
+ );
2071
+
2072
+ // normalize public/private
2073
+ const pub = output(inlineLoadBalancer).apply((lb) =>
2074
+ "public" in lb ? lb.public ?? true : true,
2075
+ );
2076
+
2077
+ // normalize health check
2078
+ const health = all([type, rules, inlineLoadBalancer]).apply(
2079
+ ([type, rules, lb]) =>
2080
+ Object.fromEntries(
2081
+ Object.entries(("health" in lb ? lb.health : {}) ?? {}).map(
2082
+ ([k, v]) => {
2083
+ if (
2084
+ !rules.find(
2085
+ (r) => `${r.forwardPort}/${r.forwardProtocol}` === k,
2086
+ )
2087
+ )
2088
+ throw new VisibleError(
2089
+ `Cannot configure health check for "${k}". Make sure it is defined in "loadBalancer.ports".`,
2090
+ );
2091
+ const protocol = k.split("/")[1];
2092
+ return [
2093
+ k,
2094
+ {
2095
+ path: ["http", "https"].includes(protocol)
2096
+ ? v.path ?? "/"
2097
+ : undefined,
2098
+ interval: v.interval ? toSeconds(v.interval) : 30,
2099
+ timeout: v.timeout
2100
+ ? toSeconds(v.timeout)
2101
+ : type === "application"
2102
+ ? 5
2103
+ : 6,
2104
+ healthyThreshold: v.healthyThreshold ?? 5,
2105
+ unhealthyThreshold: v.unhealthyThreshold ?? 2,
2106
+ protocol: ["http", "https"].includes(protocol)
2107
+ ? undefined
2108
+ : "TCP",
2109
+ matcher: ["http", "https"].includes(protocol)
2110
+ ? v.successCodes ?? "200"
2111
+ : undefined,
2112
+ },
2113
+ ];
2114
+ },
2115
+ ),
2116
+ ),
2117
+ );
2118
+
2119
+ return { type, rules, domain, pub, health };
2120
+ }
2121
+
2122
+ function createLoadBalancer() {
2123
+ if (!lbArgs) return;
2124
+
2125
+ const securityGroup = new ec2.SecurityGroup(
2126
+ ...transform(
2127
+ args?.transform?.loadBalancerSecurityGroup,
2128
+ `${name}LoadBalancerSecurityGroup`,
2129
+ {
2130
+ description: "Managed by SST",
2131
+ vpcId: vpc.id,
2132
+ egress: [
2133
+ {
2134
+ fromPort: 0,
2135
+ toPort: 0,
2136
+ protocol: "-1",
2137
+ cidrBlocks: ["0.0.0.0/0"],
2138
+ },
2139
+ ],
2140
+ ingress: [
2141
+ {
2142
+ fromPort: 0,
2143
+ toPort: 0,
2144
+ protocol: "-1",
2145
+ cidrBlocks: ["0.0.0.0/0"],
2146
+ },
2147
+ ],
2148
+ },
2149
+ { parent: self },
2150
+ ),
2151
+ );
2152
+
2153
+ return new lb.LoadBalancer(
2154
+ ...transform(
2155
+ args.transform?.loadBalancer,
2156
+ `${name}LoadBalancer`,
2157
+ {
2158
+ internal: lbArgs.pub.apply((v) => !v),
2159
+ loadBalancerType: lbArgs.type,
2160
+ subnets: vpc.loadBalancerSubnets,
2161
+ securityGroups: [securityGroup.id],
2162
+ enableCrossZoneLoadBalancing: true,
2163
+ },
2164
+ {
2165
+ parent: self,
2166
+ // Depend on the certificate, so on remove the load balancer is
2167
+ // deleted before it. A plain array, so a `transform` can add to
2168
+ // it; an undefined certificate adds no dependency.
2169
+ dependsOn: [cert as Output<DnsValidatedCertificate>],
2170
+ },
2171
+ ),
2172
+ );
2173
+ }
2174
+
2175
+ function createTargets() {
2176
+ if (!loadBalancer || !lbArgs) return;
2177
+
2178
+ return all([lbArgs.rules, lbArgs.health]).apply(([rules, health]) => {
2179
+ const targets: Record<string, lb.TargetGroup> = {};
2180
+
2181
+ rules.forEach((r) => {
2182
+ if (r.type !== "forward") return;
2183
+
2184
+ const container = r.container;
2185
+ const forwardProtocol = r.forwardProtocol.toUpperCase();
2186
+ const forwardPort = r.forwardPort;
2187
+ const targetId = targetKey(container!, forwardProtocol, forwardPort);
2188
+ const target =
2189
+ targets[targetId] ??
2190
+ new lb.TargetGroup(
2191
+ ...transform(
2192
+ args.transform?.target,
2193
+ `${name}Target${targetId}`,
2194
+ {
2195
+ // AWS enforces a 6-char limit on namePrefix for target groups.
2196
+ // "TCP_UDP" is 7 chars, so strip the underscore to fit.
2197
+ namePrefix: forwardProtocol.replace("_", ""),
2198
+ port: forwardPort,
2199
+ protocol: forwardProtocol,
2200
+ targetType: "ip",
2201
+ vpcId: vpc.id,
2202
+ healthCheck: health[`${r.forwardPort}/${r.forwardProtocol}`],
2203
+ },
2204
+ { parent: self },
2205
+ ),
2206
+ );
2207
+ targets[targetId] = target;
2208
+ });
2209
+ return targets;
2210
+ });
2211
+ }
2212
+
2213
+ function computeTargetEntries() {
2214
+ if (!lbArgs || !targetGroups)
2215
+ return output(
2216
+ [] as {
2217
+ targetGroup: lb.TargetGroup;
2218
+ containerName: string;
2219
+ containerPort: number;
2220
+ }[],
2221
+ );
2222
+ return all([lbArgs.rules, targetGroups]).apply(([rules, targets]) => {
2223
+ const entries: {
2224
+ targetGroup: lb.TargetGroup;
2225
+ containerName: string;
2226
+ containerPort: number;
2227
+ }[] = [];
2228
+ const seen = new Set<string>();
2229
+ for (const rule of rules) {
2230
+ if (rule.type !== "forward") continue;
2231
+ const targetId = targetKey(rule.container!, rule.forwardProtocol, rule.forwardPort);
2232
+ if (seen.has(targetId)) continue;
2233
+ seen.add(targetId);
2234
+ entries.push({
2235
+ targetGroup: targets[targetId],
2236
+ containerName: rule.container!,
2237
+ containerPort: rule.forwardPort,
2238
+ });
2239
+ }
2240
+ return entries;
2241
+ });
2242
+ }
2243
+
2244
+ function createListeners() {
2245
+ if (!lbArgs || !loadBalancer || !targetGroups) return;
2246
+
2247
+ return all([lbArgs.rules, targetGroups, certificateArn]).apply(
2248
+ ([rules, targets, cert]) => {
2249
+ // Group listeners by protocol and port
2250
+ // Because listeners with the same protocol and port but different path
2251
+ // are just rules of the same listener.
2252
+ const listenersById: Record<string, typeof rules> = {};
2253
+ rules.forEach((r) => {
2254
+ const listenProtocol = r.listenProtocol.toUpperCase();
2255
+ const listenPort = r.listenPort;
2256
+ const listenerId = listenerKey(listenProtocol, listenPort);
2257
+ listenersById[listenerId] = listenersById[listenerId] ?? [];
2258
+ listenersById[listenerId].push(r);
2259
+ });
2260
+
2261
+ // Create listeners
2262
+ return Object.entries(listenersById).map(([listenerId, rules]) => {
2263
+ const listenProtocol = rules[0].listenProtocol.toUpperCase();
2264
+ const listenPort = rules[0].listenPort;
2265
+ const defaultRule = rules.find((r) => !r.listenConditions);
2266
+ const customRules = rules.filter((r) => r.listenConditions);
2267
+ const buildActions = (r?: (typeof rules)[number]) => [
2268
+ ...(!r
2269
+ ? [
2270
+ {
2271
+ type: "fixed-response",
2272
+ fixedResponse: {
2273
+ statusCode: "403",
2274
+ contentType: "text/plain",
2275
+ messageBody: "Forbidden",
2276
+ },
2277
+ },
2278
+ ]
2279
+ : []),
2280
+ ...(r?.type === "forward"
2281
+ ? [
2282
+ {
2283
+ type: "forward",
2284
+ targetGroupArn:
2285
+ targets[
2286
+ `${r.container}${r.forwardProtocol.toUpperCase()}${
2287
+ r.forwardPort
2288
+ }`
2289
+ ].arn,
2290
+ },
2291
+ ]
2292
+ : []),
2293
+ ...(r?.type === "redirect"
2294
+ ? [
2295
+ {
2296
+ type: "redirect",
2297
+ redirect: {
2298
+ port: r.redirectPort.toString(),
2299
+ protocol: r.redirectProtocol.toUpperCase(),
2300
+ statusCode: "HTTP_301",
2301
+ },
2302
+ },
2303
+ ]
2304
+ : []),
2305
+ ];
2306
+ const listener = new lb.Listener(
2307
+ ...transform(
2308
+ args.transform?.listener,
2309
+ `${name}Listener${listenerId}`,
2310
+ {
2311
+ loadBalancerArn: loadBalancer.arn,
2312
+ port: listenPort,
2313
+ protocol: listenProtocol,
2314
+ certificateArn: ["HTTPS", "TLS"].includes(listenProtocol)
2315
+ ? cert
2316
+ : undefined,
2317
+ defaultActions: buildActions(defaultRule),
2318
+ },
2319
+ { parent: self },
2320
+ ),
2321
+ );
2322
+
2323
+ customRules.forEach(
2324
+ (r) =>
2325
+ new lb.ListenerRule(
2326
+ `${name}Listener${listenerId}Rule${hashStringToPrettyString(
2327
+ JSON.stringify(r.listenConditions),
2328
+ 4,
2329
+ )}`,
2330
+ {
2331
+ listenerArn: listener.arn,
2332
+ actions: buildActions(r),
2333
+ conditions: [
2334
+ {
2335
+ pathPattern: r.listenConditions!.path
2336
+ ? { values: [r.listenConditions!.path!] }
2337
+ : undefined,
2338
+ queryStrings: r.listenConditions!.query,
2339
+ httpHeader: r.listenConditions!.header
2340
+ ? {
2341
+ httpHeaderName: r.listenConditions!.header.name,
2342
+ values: r.listenConditions!.header.values,
2343
+ }
2344
+ : undefined,
2345
+ },
2346
+ ],
2347
+ },
2348
+ { parent: self },
2349
+ ),
2350
+ );
2351
+
2352
+ return listener;
2353
+ });
2354
+ },
2355
+ );
2356
+ }
2357
+
2358
+ function createSsl() {
2359
+ if (!lbArgs) {
2360
+ return {
2361
+ cert: output<DnsValidatedCertificate | undefined>(undefined),
2362
+ arn: output<string | undefined>(undefined),
2363
+ };
2364
+ }
2365
+
2366
+ const cert = lbArgs.domain.apply((domain) => {
2367
+ if (!domain || domain.cert) return undefined;
2368
+
2369
+ return new DnsValidatedCertificate(
2370
+ `${name}Ssl`,
2371
+ {
2372
+ domainName: domain.name,
2373
+ alternativeNames: domain.aliases,
2374
+ dns: domain.dns!,
2375
+ },
2376
+ { parent: self },
2377
+ );
2378
+ });
2379
+ return {
2380
+ cert,
2381
+ arn: all([lbArgs.domain, cert]).apply(([domain, cert]) => {
2382
+ if (!domain) return undefined;
2383
+ if (domain.cert) return domain.cert;
2384
+ // `cert` is set whenever there's a domain without `cert`, since
2385
+ // both come from the same `domain` value.
2386
+ return cert!.arn;
2387
+ }),
2388
+ };
2389
+ }
2390
+
2391
+ function createCloudmapService() {
2392
+ return output(vpc.cloudmapNamespaceId).apply((cloudmapNamespaceId) => {
2393
+ if (!cloudmapNamespaceId) return;
2394
+
2395
+ return new servicediscovery.Service(
2396
+ `${name}CloudmapService`,
2397
+ {
2398
+ name: `${name}.${$app.stage}.${$app.name}`,
2399
+ namespaceId: output(vpc.cloudmapNamespaceId).apply((id) => id!),
2400
+ forceDestroy: true,
2401
+ dnsConfig: {
2402
+ namespaceId: output(vpc.cloudmapNamespaceId).apply((id) => id!),
2403
+ dnsRecords: [
2404
+ ...(args.serviceRegistry ? [{ ttl: 60, type: "SRV" }] : []),
2405
+ { ttl: 60, type: "A" },
2406
+ ],
2407
+ },
2408
+ },
2409
+ { parent: self },
2410
+ );
2411
+ });
2412
+ }
2413
+
2414
+ function createService() {
2415
+ return cloudmapService.apply(
2416
+ (cloudmapService) =>
2417
+ new ecs.Service(
2418
+ ...transform(
2419
+ args.transform?.service,
2420
+ `${name}Service`,
2421
+ {
2422
+ name,
2423
+ cluster: clusterArn,
2424
+ taskDefinition: taskDefinition.arn,
2425
+ desiredCount: scaling.min,
2426
+ ...(capacity
2427
+ ? {
2428
+ // setting `forceNewDeployment` ensures that the service is not recreated
2429
+ // when the capacity provider config changes.
2430
+ forceNewDeployment: true,
2431
+ capacityProviderStrategies: capacity.apply((v) => [
2432
+ ...(v.fargate
2433
+ ? [
2434
+ {
2435
+ capacityProvider: "FARGATE",
2436
+ base: v.fargate?.base,
2437
+ weight: v.fargate?.weight,
2438
+ },
2439
+ ]
2440
+ : []),
2441
+ ...(v.spot
2442
+ ? [
2443
+ {
2444
+ capacityProvider: "FARGATE_SPOT",
2445
+ base: v.spot?.base,
2446
+ weight: v.spot?.weight,
2447
+ },
2448
+ ]
2449
+ : []),
2450
+ ]),
2451
+ }
2452
+ : // @deprecated do not use `launchType`, set `capacityProviderStrategies`
2453
+ // to `[{ capacityProvider: "FARGATE", weight: 1 }]` instead
2454
+ {
2455
+ launchType: "FARGATE",
2456
+ }),
2457
+ networkConfiguration: {
2458
+ // If the vpc is an SST vpc, services are automatically deployed to the public
2459
+ // subnets. So we need to assign a public IP for the service to be accessible.
2460
+ assignPublicIp: vpc.isSstVpc,
2461
+ subnets: vpc.containerSubnets,
2462
+ securityGroups: vpc.securityGroups,
2463
+ },
2464
+ deploymentCircuitBreaker: {
2465
+ enable: true,
2466
+ rollback: true,
2467
+ },
2468
+ loadBalancers: targetEntries.apply((entries) =>
2469
+ entries.map((e) => ({
2470
+ targetGroupArn: e.targetGroup.arn,
2471
+ containerName: e.containerName,
2472
+ containerPort: e.containerPort,
2473
+ })),
2474
+ ),
2475
+ enableExecuteCommand: true,
2476
+ serviceRegistries: cloudmapService && {
2477
+ registryArn: cloudmapService.arn,
2478
+ port: args.serviceRegistry
2479
+ ? output(args.serviceRegistry).port
2480
+ : undefined,
2481
+ },
2482
+ waitForSteadyState: wait,
2483
+ },
2484
+ { parent: self },
2485
+ ),
2486
+ ),
2487
+ );
2488
+ }
2489
+
2490
+ function createAutoScaling() {
2491
+ const target = new appautoscaling.Target(
2492
+ ...transform(
2493
+ args.transform?.autoScalingTarget,
2494
+ `${name}AutoScalingTarget`,
2495
+ {
2496
+ serviceNamespace: "ecs",
2497
+ scalableDimension: "ecs:service:DesiredCount",
2498
+ resourceId: interpolate`service/${clusterName}/${service.name}`,
2499
+ maxCapacity: scaling.max,
2500
+ minCapacity: scaling.min,
2501
+ },
2502
+ { parent: self },
2503
+ ),
2504
+ );
2505
+
2506
+ all([scaling.cpuUtilization, scaling.scaleInCooldown, scaling.scaleOutCooldown]).apply(
2507
+ ([cpuUtilization, scaleInCooldown, scaleOutCooldown]) => {
2508
+ if (cpuUtilization === false) return;
2509
+ new appautoscaling.Policy(
2510
+ `${name}AutoScalingCpuPolicy`,
2511
+ {
2512
+ serviceNamespace: target.serviceNamespace,
2513
+ scalableDimension: target.scalableDimension,
2514
+ resourceId: target.resourceId,
2515
+ policyType: "TargetTrackingScaling",
2516
+ targetTrackingScalingPolicyConfiguration: {
2517
+ predefinedMetricSpecification: {
2518
+ predefinedMetricType: "ECSServiceAverageCPUUtilization",
2519
+ },
2520
+ targetValue: cpuUtilization,
2521
+ scaleInCooldown,
2522
+ scaleOutCooldown,
2523
+ },
2524
+ },
2525
+ { parent: self },
2526
+ );
2527
+ }
2528
+ );
2529
+
2530
+ all([scaling.memoryUtilization, scaling.scaleInCooldown, scaling.scaleOutCooldown]).apply(
2531
+ ([memoryUtilization, scaleInCooldown, scaleOutCooldown]) => {
2532
+ if (memoryUtilization === false) return;
2533
+ new appautoscaling.Policy(
2534
+ `${name}AutoScalingMemoryPolicy`,
2535
+ {
2536
+ serviceNamespace: target.serviceNamespace,
2537
+ scalableDimension: target.scalableDimension,
2538
+ resourceId: target.resourceId,
2539
+ policyType: "TargetTrackingScaling",
2540
+ targetTrackingScalingPolicyConfiguration: {
2541
+ predefinedMetricSpecification: {
2542
+ predefinedMetricType: "ECSServiceAverageMemoryUtilization",
2543
+ },
2544
+ targetValue: memoryUtilization,
2545
+ scaleInCooldown,
2546
+ scaleOutCooldown,
2547
+ },
2548
+ },
2549
+ { parent: self },
2550
+ );
2551
+ }
2552
+ );
2553
+
2554
+ all([scaling.requestCount, scaling.scaleInCooldown, scaling.scaleOutCooldown, targetGroups]).apply(
2555
+ ([requestCount, scaleInCooldown, scaleOutCooldown, targetGroups]) => {
2556
+ if (requestCount === false) return;
2557
+ if (!targetGroups) return;
2558
+
2559
+ const targetGroup = Object.values(targetGroups)[0];
2560
+
2561
+ new appautoscaling.Policy(
2562
+ `${name}AutoScalingRequestCountPolicy`,
2563
+ {
2564
+ serviceNamespace: target.serviceNamespace,
2565
+ scalableDimension: target.scalableDimension,
2566
+ resourceId: target.resourceId,
2567
+ policyType: "TargetTrackingScaling",
2568
+ targetTrackingScalingPolicyConfiguration: {
2569
+ predefinedMetricSpecification: {
2570
+ predefinedMetricType: "ALBRequestCountPerTarget",
2571
+ resourceLabel: all([effectiveLbArn!, targetGroup.arn]).apply(
2572
+ ([lbArn, targetGroupArn]) => {
2573
+ // arn:...:loadbalancer/app/frank-MyServiceLoadBalan/005af2ad12da1e52
2574
+ // => app/frank-MyServiceLoadBalan/005af2ad12da1e52
2575
+ const lbPart = lbArn
2576
+ .split(":")
2577
+ .pop()
2578
+ ?.split("/")
2579
+ .slice(1)
2580
+ .join("/");
2581
+ // arn:...:targetgroup/HTTP20250103004618450100000001/e0811b8cf3a60762
2582
+ // => targetgroup/HTTP20250103004618450100000001
2583
+ const tgPart = targetGroupArn.split(":").pop();
2584
+ return `${lbPart}/${tgPart}`;
2585
+ },
2586
+ ),
2587
+ },
2588
+ targetValue: requestCount,
2589
+ scaleInCooldown,
2590
+ scaleOutCooldown,
2591
+ },
2592
+ },
2593
+ { parent: self },
2594
+ );
2595
+ },
2596
+ );
2597
+
2598
+ return target;
2599
+ }
2600
+
2601
+ function createDnsRecords() {
2602
+ if (!lbArgs) return;
2603
+
2604
+ lbArgs.domain.apply((domain) => {
2605
+ if (!domain?.dns) return;
2606
+
2607
+ for (const recordName of [domain.name, ...domain.aliases]) {
2608
+ const namePrefix =
2609
+ recordName === domain.name ? name : `${name}${recordName}`;
2610
+ domain.dns.createAlias(
2611
+ namePrefix,
2612
+ {
2613
+ name: recordName,
2614
+ aliasName: loadBalancer!.dnsName,
2615
+ aliasZone: loadBalancer!.zoneId,
2616
+ },
2617
+ { parent: self },
2618
+ );
2619
+ }
2620
+ });
2621
+ }
2622
+
2623
+ function detectAlbAttachment() {
2624
+ const loadBalancer = args.loadBalancer;
2625
+ if (
2626
+ !loadBalancer ||
2627
+ typeof loadBalancer !== "object" ||
2628
+ !("instance" in loadBalancer) ||
2629
+ !(loadBalancer.instance instanceof Alb)
2630
+ ) {
2631
+ return undefined;
2632
+ }
2633
+ return loadBalancer;
2634
+ }
2635
+
2636
+ function createAlbTargetsAndEntries(
2637
+ attachment: NonNullable<typeof albAttachment>,
2638
+ ) {
2639
+ const rules = attachment.rules;
2640
+ const health = attachment.health ?? {};
2641
+
2642
+ if (rules.length === 0) {
2643
+ throw new VisibleError(
2644
+ `You must provide at least one rule in "loadBalancer.rules" when using an external ALB in Service "${name}".`,
2645
+ );
2646
+ }
2647
+
2648
+ // Validate container names (no resources created here)
2649
+ containers.apply((ctrs) => {
2650
+ const containerNames = new Set(ctrs.map((c) => c.name));
2651
+ if (ctrs.length > 1) {
2652
+ for (const rule of rules) {
2653
+ if (!rule.container) {
2654
+ throw new VisibleError(
2655
+ `You must provide a "container" name in each rule when there is more than one container in Service "${name}".`,
2656
+ );
2657
+ }
2658
+ }
2659
+ }
2660
+ for (const rule of rules) {
2661
+ const cn = rule.container ?? ctrs[0].name;
2662
+ if (!containerNames.has(cn)) {
2663
+ throw new VisibleError(
2664
+ `Container "${cn}" in "loadBalancer.rules" does not match any container in Service "${name}". Available: ${[...containerNames].join(", ")}.`,
2665
+ );
2666
+ }
2667
+ }
2668
+ });
2669
+
2670
+ // Create target groups in a plain loop (no apply)
2671
+ const targets: Record<string, lb.TargetGroup> = {};
2672
+ const rawEntries: {
2673
+ targetGroup: lb.TargetGroup;
2674
+ explicitContainer: string | undefined;
2675
+ containerPort: number;
2676
+ }[] = [];
2677
+
2678
+ for (const rule of rules) {
2679
+ const parts = rule.forward.split("/");
2680
+ const forwardPort = parseInt(parts[0]);
2681
+ const forwardProtocol = parts[1].toUpperCase();
2682
+ // Use explicit container or component name for keying/naming
2683
+ const containerNameForKey = rule.container ?? name;
2684
+ const tgtId = targetKey(containerNameForKey, forwardProtocol, forwardPort);
2685
+
2686
+ if (!targets[tgtId]) {
2687
+ const healthKey = `${forwardPort}/${parts[1]}` as AlbPort;
2688
+ const healthCheck = health[healthKey];
2689
+ const normalizedHealth = healthCheck
2690
+ ? output(healthCheck).apply((h) => ({
2691
+ path: h.path ?? "/",
2692
+ interval: h.interval ? toSeconds(h.interval) : 30,
2693
+ timeout: h.timeout ? toSeconds(h.timeout) : 5,
2694
+ healthyThreshold: h.healthyThreshold ?? 5,
2695
+ unhealthyThreshold: h.unhealthyThreshold ?? 2,
2696
+ matcher: h.successCodes ?? "200",
2697
+ }))
2698
+ : {
2699
+ path: "/",
2700
+ interval: 30,
2701
+ timeout: 5,
2702
+ healthyThreshold: 5,
2703
+ unhealthyThreshold: 2,
2704
+ matcher: "200",
2705
+ };
2706
+
2707
+ const tg = new lb.TargetGroup(
2708
+ ...transform(
2709
+ args.transform?.target,
2710
+ `${name}Target${tgtId}`,
2711
+ {
2712
+ namePrefix: forwardProtocol,
2713
+ port: forwardPort,
2714
+ protocol: forwardProtocol,
2715
+ targetType: "ip",
2716
+ vpcId: attachment.instance._vpc,
2717
+ healthCheck: normalizedHealth,
2718
+ },
2719
+ { parent: self },
2720
+ ),
2721
+ );
2722
+ targets[tgtId] = tg;
2723
+ rawEntries.push({
2724
+ targetGroup: tg,
2725
+ explicitContainer: rule.container,
2726
+ containerPort: forwardPort,
2727
+ });
2728
+ }
2729
+ }
2730
+
2731
+ // Resolve actual container names for ECS registration
2732
+ const entries = containers.apply((ctrs) =>
2733
+ rawEntries.map((e) => ({
2734
+ targetGroup: e.targetGroup,
2735
+ containerName: e.explicitContainer ?? ctrs[0].name,
2736
+ containerPort: e.containerPort,
2737
+ })),
2738
+ );
2739
+
2740
+ return { targets, entries };
2741
+ }
2742
+
2743
+ function createAlbListenerRules(
2744
+ attachment: NonNullable<typeof albAttachment>,
2745
+ albTargets: Record<string, lb.TargetGroup>,
2746
+ ) {
2747
+ const rules = attachment.rules;
2748
+ const prioritiesByListener = new Map<string, Set<number>>();
2749
+
2750
+ for (const rule of rules) {
2751
+ if (rule.priority < 1 || rule.priority > 50000) {
2752
+ throw new VisibleError(
2753
+ `Priority ${rule.priority} must be between 1 and 50000 in Service "${name}". When sharing an ALB, ensure non-overlapping priority ranges across services.`,
2754
+ );
2755
+ }
2756
+
2757
+ const seen =
2758
+ prioritiesByListener.get(rule.listen) ?? new Set();
2759
+ if (seen.has(rule.priority)) {
2760
+ throw new VisibleError(
2761
+ `Duplicate priority ${rule.priority} on listener "${rule.listen}" in Service "${name}".`,
2762
+ );
2763
+ }
2764
+ seen.add(rule.priority);
2765
+ prioritiesByListener.set(rule.listen, seen);
2766
+
2767
+ if (
2768
+ !rule.conditions?.path &&
2769
+ !rule.conditions?.query &&
2770
+ !rule.conditions?.header
2771
+ ) {
2772
+ throw new VisibleError(
2773
+ `At least one condition (path, query, or header) must be set for rules on an external ALB in Service "${name}".`,
2774
+ );
2775
+ }
2776
+
2777
+ const listenerParts = rule.listen.split("/");
2778
+ const listenerPort = parseInt(listenerParts[0]);
2779
+ const listenerProtocol = listenerParts[1];
2780
+
2781
+ const forwardParts = rule.forward.split("/");
2782
+ const forwardPort = parseInt(forwardParts[0]);
2783
+ const forwardProtocol = forwardParts[1].toUpperCase();
2784
+ const containerNameForKey = rule.container ?? name;
2785
+ const tgtId = targetKey(containerNameForKey, forwardProtocol, forwardPort);
2786
+
2787
+ const targetGroup = albTargets[tgtId];
2788
+ if (!targetGroup) {
2789
+ throw new VisibleError(
2790
+ `Target group "${tgtId}" not found. Ensure the forward port matches in Service "${name}".`,
2791
+ );
2792
+ }
2793
+
2794
+ const listenerResource =
2795
+ attachment.instance.getListener(listenerProtocol, listenerPort);
2796
+
2797
+ new lb.ListenerRule(
2798
+ ...transform(
2799
+ args.transform?.listenerRule,
2800
+ `${name}AlbRule${listenerProtocol.toUpperCase()}${listenerPort}P${rule.priority}`,
2801
+ {
2802
+ listenerArn: listenerResource.arn,
2803
+ priority: rule.priority,
2804
+ actions: [
2805
+ {
2806
+ type: "forward",
2807
+ targetGroupArn: targetGroup.arn,
2808
+ },
2809
+ ],
2810
+ conditions: [
2811
+ {
2812
+ pathPattern: rule.conditions.path
2813
+ ? { values: [rule.conditions.path] }
2814
+ : undefined,
2815
+ queryStrings: rule.conditions.query,
2816
+ httpHeader: rule.conditions.header
2817
+ ? output(rule.conditions.header).apply((h) => ({
2818
+ httpHeaderName: h.name,
2819
+ values: h.values,
2820
+ }))
2821
+ : undefined,
2822
+ },
2823
+ ],
2824
+ },
2825
+ { parent: self },
2826
+ ),
2827
+ );
2828
+ }
2829
+ }
2830
+
2831
+ function registerReceiver() {
2832
+ all([containers]).apply(([val]) => {
2833
+ for (const container of val) {
2834
+ const title = val.length == 1 ? name : `${name}${container.name}`;
2835
+ new DevCommand(`${title}Dev`, {
2836
+ link: args.link,
2837
+ dev: {
2838
+ title,
2839
+ autostart: true,
2840
+ directory: (() => {
2841
+ if (!container.image) return "";
2842
+ if (typeof container.image === "string") return "";
2843
+ if (container.image.context) return container.image.context;
2844
+ return "";
2845
+ })(),
2846
+ ...container.dev,
2847
+ },
2848
+ environment: {
2849
+ ...container.environment,
2850
+ AWS_REGION: region,
2851
+ },
2852
+ aws: {
2853
+ role: taskRole.arn,
2854
+ },
2855
+ });
2856
+ }
2857
+ });
2858
+ }
2859
+ }
2860
+
2861
+ /**
2862
+ * The URL of the service.
2863
+ *
2864
+ * If `public.domain` is set, this is the URL with the custom domain.
2865
+ * Otherwise, it's the auto-generated load balancer URL.
2866
+ */
2867
+ public get url() {
2868
+ const errorMessage =
2869
+ "Cannot access the URL because no public ports are exposed.";
2870
+ if (this.dev) {
2871
+ if (!this.devUrl) throw new VisibleError(errorMessage);
2872
+ return this.devUrl;
2873
+ }
2874
+
2875
+ if (!this._url) throw new VisibleError(errorMessage);
2876
+ return this._url;
2877
+ }
2878
+
2879
+ /**
2880
+ * The name of the Cloud Map service. This is useful for service discovery.
2881
+ */
2882
+ public get service() {
2883
+ return all([this.cloudmapNamespace, this.cloudmapService]).apply(
2884
+ ([namespace, service]) => {
2885
+ if (!namespace)
2886
+ throw new VisibleError(
2887
+ `Cannot access the AWS Cloud Map service name for the "${this._name}" Service. Cloud Map is not configured for the cluster.`,
2888
+ );
2889
+
2890
+ return this.dev
2891
+ ? interpolate`dev.${namespace}`
2892
+ : interpolate`${service!.name}.${namespace}`;
2893
+ },
2894
+ );
2895
+ }
2896
+
2897
+ /**
2898
+ * The underlying [resources](/docs/components/#nodes) this component creates.
2899
+ */
2900
+ public get nodes() {
2901
+ const self = this;
2902
+ return {
2903
+ /**
2904
+ * The Amazon ECS Service.
2905
+ */
2906
+ get service() {
2907
+ if (self.dev)
2908
+ throw new VisibleError("Cannot access `nodes.service` in dev mode.");
2909
+ return self._service!;
2910
+ },
2911
+ /**
2912
+ * The Amazon ECS Execution Role.
2913
+ */
2914
+ executionRole: this.executionRole,
2915
+ /**
2916
+ * The Amazon ECS Task Role.
2917
+ */
2918
+ taskRole: this.taskRole,
2919
+ /**
2920
+ * The Amazon ECS Task Definition.
2921
+ */
2922
+ get taskDefinition() {
2923
+ if (self.dev)
2924
+ throw new VisibleError(
2925
+ "Cannot access `nodes.taskDefinition` in dev mode.",
2926
+ );
2927
+ return self.taskDefinition!;
2928
+ },
2929
+ /**
2930
+ * The Amazon Elastic Load Balancer.
2931
+ */
2932
+ get loadBalancer() {
2933
+ if (self.dev)
2934
+ throw new VisibleError(
2935
+ "Cannot access `nodes.loadBalancer` in dev mode.",
2936
+ );
2937
+ if (!self.loadBalancer)
2938
+ throw new VisibleError(
2939
+ "Cannot access `nodes.loadBalancer` when no public ports are exposed.",
2940
+ );
2941
+ return self.loadBalancer;
2942
+ },
2943
+ /**
2944
+ * The Amazon Application Auto Scaling target.
2945
+ */
2946
+ get autoScalingTarget() {
2947
+ if (self.dev)
2948
+ throw new VisibleError(
2949
+ "Cannot access `nodes.autoScalingTarget` in dev mode.",
2950
+ );
2951
+ return self.autoScalingTarget!;
2952
+ },
2953
+ /**
2954
+ * The Amazon Cloud Map service.
2955
+ */
2956
+ get cloudmapService() {
2957
+ if (self.dev)
2958
+ throw new VisibleError(
2959
+ "Cannot access `nodes.cloudmapService` in dev mode.",
2960
+ );
2961
+
2962
+ return output(self.cloudmapService).apply((service) => {
2963
+ if (!service)
2964
+ throw new VisibleError(
2965
+ `Cannot access "nodes.cloudmapService" for the "${self._name}" Service. Cloud Map is not configured for the cluster.`,
2966
+ );
2967
+ return service;
2968
+ });
2969
+ },
2970
+ };
2971
+ }
2972
+
2973
+ /** @internal */
2974
+ public getSSTLink() {
2975
+ return {
2976
+ properties: {
2977
+ url: this.dev ? this.devUrl : this._url,
2978
+ service: output(this.cloudmapNamespace).apply((namespace) =>
2979
+ namespace ? this.service : undefined,
2980
+ ),
2981
+ },
2982
+ };
2983
+ }
2984
+ }
2985
+
2986
+ function protocolType(protocol: string) {
2987
+ return ["http", "https"].includes(protocol)
2988
+ ? ("application" as const)
2989
+ : ("network" as const);
2990
+ }
2991
+
2992
+ const __pulumiType = "sst:aws:Service";
2993
+ // @ts-expect-error
2994
+ Service.__pulumiType = __pulumiType;