diff --git a/infra/lake-destroy-prep.ts b/infra/lake-destroy-prep.ts new file mode 100644 index 0000000000..842776a157 --- /dev/null +++ b/infra/lake-destroy-prep.ts @@ -0,0 +1,27 @@ +// Temporary destroy prep: keep only non-empty resources declared so SST updates forceDestroy before omission. +new aws.s3tables.TableBucket("LakeTableBucket", { + name: `opencode-${$app.stage}-lake`, + forceDestroy: true, +}) + +const athenaResultsBucket = new aws.s3.Bucket("LakeAthenaResults", { + bucket: `opencode-${$app.stage}-lake-athena-results`, + forceDestroy: true, +}) + +new aws.s3.Bucket("LakeFirehoseErrors", { + bucket: `opencode-${$app.stage}-lake-firehose-errors`, + forceDestroy: true, +}) + +new aws.athena.Workgroup("LakeAthenaWorkgroup", { + name: `opencode-${$app.stage}-lake-workgroup`, + forceDestroy: true, + configuration: { + enforceWorkgroupConfiguration: true, + publishCloudwatchMetricsEnabled: true, + resultConfiguration: { + outputLocation: $interpolate`s3://${athenaResultsBucket.bucket}/`, + }, + }, +}) diff --git a/infra/stage.ts b/infra/stage.ts index e7b7aa0244..18a9d6222a 100644 --- a/infra/stage.ts +++ b/infra/stage.ts @@ -7,9 +7,9 @@ export const domain = (() => { export const zoneID = "430ba34c138cfb5360826c4909f99be8" // Dev owns the shared AWS lake/stats infra for all non-production stages. export const awsStage = $app.stage === "production" ? "production" : "dev" -// TODO temporarily disable AWS infra deployment +export const prepareAwsDestroy = $app.stage === "production" || $app.stage === "dev" +// Temporarily omit AWS infra so SST removes the lake/stats resources. export const deployAws = false -//export const deployAws = $app.stage === awsStage new cloudflare.RegionalHostname("RegionalHostname", { hostname: domain, diff --git a/sst-env.d.ts b/sst-env.d.ts index c8acbde01f..02ba732efd 100644 --- a/sst-env.d.ts +++ b/sst-env.d.ts @@ -344,4 +344,4 @@ declare module "sst" { } import "sst" -export {} \ No newline at end of file +export {} diff --git a/sst.config.ts b/sst.config.ts index 0097201108..86cedb3321 100644 --- a/sst.config.ts +++ b/sst.config.ts @@ -2,30 +2,20 @@ export default $config({ app(input) { - // Dev owns the shared AWS lake/stats infra for all non-production stages. - const awsStage = input.stage === "production" ? "production" : "dev" - // TODO temporarily disable AWS infra deployment + const prepareAwsDestroy = input.stage === "production" || input.stage === "dev" + // Temporarily omit AWS infra so SST removes the lake/stats resources. const deployAws = false - //const deployAws = input.stage === awsStage return { name: "opencode", removal: input?.stage === "production" ? "retain" : "remove", protect: ["production"].includes(input?.stage), home: "cloudflare", providers: { - ...(deployAws - ? { - aws: { - version: "7.30.0", - region: "us-east-1", - profile: process.env.GITHUB_ACTIONS - ? undefined - : input.stage === "production" - ? "opencode-production" - : "opencode-dev", - }, - } - : {}), + aws: { + version: "7.30.0", + region: "us-east-1", + profile: process.env.GITHUB_ACTIONS ? undefined : input.stage === "production" ? "opencode-production" : "opencode-dev", + }, stripe: { version: "0.0.28", apiKey: process.env.STRIPE_SECRET_KEY!, @@ -39,9 +29,12 @@ export default $config({ async run() { const stage = await import("./infra/stage.js") await import("./infra/app.js") + if (stage.prepareAwsDestroy) { + await import("./infra/lake-destroy-prep.js") + } if (stage.deployAws) { - //await import("./infra/lake.js") - //await import("./infra/stats.js") + await import("./infra/lake.js") + await import("./infra/stats.js") } const { stat } = await import("./infra/console.js") await import("./infra/enterprise.js")