mirror of
https://github.com/serverless/serverless.git
synced 2025-12-08 19:46:03 +00:00
120 lines
3.2 KiB
JavaScript
120 lines
3.2 KiB
JavaScript
'use strict'
|
|
|
|
// NOTE: This script requires Node.js > 8 to run since it uses
|
|
// modern Node.js / JavaScript features such as async / await
|
|
|
|
const { logger } = require('./misc')
|
|
const {
|
|
findStacks,
|
|
deleteStack,
|
|
listStackResources,
|
|
} = require('./cloudformation')
|
|
const { findRestApis, deleteRestApi } = require('./api-gateway')
|
|
const { deleteBucket } = require('./s3')
|
|
const { findUserPools, deleteUserPoolById } = require('./cognito')
|
|
|
|
async function findDeploymentBuckets(stacks) {
|
|
const buckets = []
|
|
for (const stack of stacks) {
|
|
const stackResources = await listStackResources(stack.StackId)
|
|
const bucket = stackResources.filter((resource) => {
|
|
return resource.LogicalResourceId === 'ServerlessDeploymentBucket'
|
|
})
|
|
buckets.push(...bucket)
|
|
}
|
|
return buckets
|
|
}
|
|
|
|
async function cleanup() {
|
|
const date = new Date()
|
|
const yesterday = date.setDate(date.getDate() - 1)
|
|
|
|
const status = [
|
|
'CREATE_FAILED',
|
|
'CREATE_COMPLETE',
|
|
'UPDATE_COMPLETE',
|
|
'ROLLBACK_FAILED',
|
|
'ROLLBACK_COMPLETE',
|
|
'DELETE_FAILED',
|
|
'UPDATE_ROLLBACK_FAILED',
|
|
'UPDATE_ROLLBACK_COMPLETE',
|
|
]
|
|
|
|
// find all the resources
|
|
const [stacks, apis, userPools] = await Promise.all([
|
|
findStacks(/^(?:integ-)?test/, status),
|
|
findRestApis(/^dev-(?:integ-)?test/),
|
|
findUserPools(),
|
|
])
|
|
|
|
let bucketsToRemove = []
|
|
const stacksToRemove = stacks.filter(
|
|
(stack) => +new Date(stack.CreationTime) < yesterday,
|
|
)
|
|
const apisToRemove = apis.filter(
|
|
(api) => +new Date(api.createdDate) < yesterday,
|
|
)
|
|
const userPoolsToRemove = userPools.filter(
|
|
(userPool) => userPool.CreationDate < yesterday,
|
|
)
|
|
|
|
if (stacksToRemove) {
|
|
bucketsToRemove = await findDeploymentBuckets(stacksToRemove)
|
|
}
|
|
|
|
logger.log(`${bucketsToRemove.length} Buckets to remove...`)
|
|
logger.log(`${stacksToRemove.length} Stacks to remove...`)
|
|
logger.log(`${apisToRemove.length} APIs to remove...`)
|
|
logger.log(`${userPoolsToRemove.length} User pools to remove...`)
|
|
|
|
if (bucketsToRemove.length) {
|
|
logger.log('Removing Buckets...')
|
|
const promises = bucketsToRemove.map((bucket) =>
|
|
deleteBucket(bucket.PhysicalResourceId),
|
|
)
|
|
try {
|
|
await Promise.all(promises)
|
|
} catch (error) {
|
|
// do nothing... try to continue with cleanup
|
|
}
|
|
}
|
|
|
|
if (stacksToRemove.length) {
|
|
logger.log('Removing Stacks...')
|
|
const promises = stacksToRemove.map((stack) => deleteStack(stack.StackName))
|
|
try {
|
|
await Promise.all(promises)
|
|
} catch (error) {
|
|
// do nothing... try to continue with cleanup
|
|
}
|
|
}
|
|
|
|
if (apisToRemove.length) {
|
|
logger.log('Removing APIs...')
|
|
const promises = apisToRemove.map((api) => deleteRestApi(api.id))
|
|
try {
|
|
await Promise.all(promises)
|
|
} catch (error) {
|
|
// do nothing... try to continue with cleanup
|
|
}
|
|
}
|
|
|
|
if (userPoolsToRemove.length) {
|
|
logger.log('Removing User Pools...')
|
|
const promises = userPoolsToRemove.map((userPool) =>
|
|
deleteUserPoolById(userPool.Id),
|
|
)
|
|
try {
|
|
await Promise.all(promises)
|
|
} catch (error) {
|
|
// do nothing... try to continue with cleanup
|
|
}
|
|
}
|
|
}
|
|
|
|
cleanup().catch((error) => {
|
|
// eslint-disable-next-line no-console
|
|
console.error(error)
|
|
process.exit(1)
|
|
})
|