unity-builder/src/model/cloud-runner/providers/aws/commands/aws-cli-commands.ts

134 lines
5.3 KiB
TypeScript
Raw Normal View History

2022-04-07 00:45:15 +00:00
import AWS from 'aws-sdk';
2022-04-07 19:29:26 +00:00
import { CliFunction } from '../../../../cli/cli-functions-repository';
2022-04-07 00:45:15 +00:00
import Input from '../../../../input';
import CloudRunnerLogger from '../../../services/cloud-runner-logger';
2022-04-10 22:01:03 +00:00
export class AwsCliCommands {
2022-04-20 22:38:32 +00:00
@CliFunction(`aws-list-stacks`, `List stacks`)
static async awsListStacks() {
process.env.AWS_REGION = Input.region;
const CF = new AWS.CloudFormation();
const stacks =
(await CF.listStacks().promise()).StackSummaries?.filter((_x) => _x.StackStatus !== 'DELETE_COMPLETE') || [];
for (const element of stacks) {
CloudRunnerLogger.log(JSON.stringify(element, undefined, 4));
if (element.StackName === 'game-ci' || element.TemplateDescription === 'Game-CI base stack') {
CloudRunnerLogger.log(`Skipping ${element.StackName} ignore list`);
continue;
}
CloudRunnerLogger.log(`${element.StackName}`);
}
if (stacks === undefined) {
return;
}
}
@CliFunction(`aws-list-tasks`, `List tasks`)
static async awsListTasks() {
process.env.AWS_REGION = Input.region;
CloudRunnerLogger.log(`ECS Clusters`);
const ecs = new AWS.ECS();
const clusters = (await ecs.listClusters().promise()).clusterArns || [];
for (const element of clusters) {
const input: AWS.ECS.ListTasksRequest = {
cluster: element,
};
const list = (await ecs.listTasks(input).promise()).taskArns || [];
if (list.length > 0) {
CloudRunnerLogger.log(`DescribeTasksRequest`);
CloudRunnerLogger.log(JSON.stringify(list, undefined, 4));
const describeInput: AWS.ECS.DescribeTasksRequest = { tasks: list, cluster: element };
const describeList = (await ecs.describeTasks(describeInput).promise()).tasks || [];
if (describeList === []) {
continue;
}
for (const taskElement of describeList) {
if (taskElement === undefined) {
continue;
}
taskElement.overrides = {};
taskElement.attachments = [];
CloudRunnerLogger.log(JSON.stringify(taskElement, undefined, 4));
if (taskElement.createdAt === undefined) {
CloudRunnerLogger.log(`Skipping ${taskElement.taskDefinitionArn} no createdAt date`);
continue;
}
}
}
}
}
2022-04-09 13:10:26 +00:00
@CliFunction(`aws-garbage-collect`, `garbage collect aws`)
2022-04-07 00:45:15 +00:00
static async garbageCollectAws() {
2022-04-16 18:26:00 +00:00
await AwsCliCommands.cleanup(false);
2022-04-07 00:45:15 +00:00
}
2022-04-16 18:13:13 +00:00
@CliFunction(`aws-garbage-collect-all`, `garbage collect aws`)
static async garbageCollectAwsAll() {
2022-04-16 18:26:00 +00:00
await AwsCliCommands.cleanup(true);
}
@CliFunction(`aws-garbage-collect-all-1d-older`, `garbage collect aws`)
static async garbageCollectAwsAllOlderThanOneDay() {
await AwsCliCommands.cleanup(true, 24);
}
2022-04-16 18:26:00 +00:00
private static async cleanup(deleteResources = false, olderThanAgeInHours = 0) {
2022-04-16 18:13:13 +00:00
process.env.AWS_REGION = Input.region;
CloudRunnerLogger.log(`Cloud Formation stacks`);
const CF = new AWS.CloudFormation();
CloudRunnerLogger.log(`ECS Clusters`);
const ecs = new AWS.ECS();
const clusters = (await ecs.listClusters().promise()).clusterArns || [];
for (const element of clusters) {
const input: AWS.ECS.ListTasksRequest = {
cluster: element,
};
const list = (await ecs.listTasks(input).promise()).taskArns || [];
if (list.length > 0) {
CloudRunnerLogger.log(`DescribeTasksRequest`);
CloudRunnerLogger.log(JSON.stringify(list, undefined, 4));
const describeInput: AWS.ECS.DescribeTasksRequest = { tasks: list, cluster: element };
const describeList = (await ecs.describeTasks(describeInput).promise()).tasks || [];
if (describeList === []) {
continue;
}
for (const taskElement of describeList) {
if (taskElement === undefined) {
continue;
}
taskElement.overrides = {};
taskElement.attachments = [];
CloudRunnerLogger.log(JSON.stringify(taskElement, undefined, 4));
if (taskElement.createdAt === undefined) {
CloudRunnerLogger.log(`Skipping ${taskElement.taskDefinitionArn} no createdAt date`);
continue;
}
if (
deleteResources &&
new Date(Date.now()).getUTCMilliseconds() - taskElement.createdAt.getUTCMilliseconds() > olderThanAgeInHours
) {
2022-04-16 18:26:00 +00:00
await ecs.stopTask({ task: taskElement.taskArn || '', cluster: element }).promise();
}
2022-04-16 18:13:13 +00:00
}
}
}
const stacks =
(await CF.listStacks().promise()).StackSummaries?.filter((_x) => _x.StackStatus !== 'DELETE_COMPLETE') || [];
for (const element of stacks) {
CloudRunnerLogger.log(JSON.stringify(element, undefined, 4));
const deleteStackInput: AWS.CloudFormation.DeleteStackInput = { StackName: element.StackName };
if (element.StackName === 'game-ci' || element.TemplateDescription === 'Game-CI base stack') {
CloudRunnerLogger.log(`Skipping ${element.StackName} ignore list`);
continue;
}
if (
deleteResources &&
new Date(Date.now()).getUTCMilliseconds() - element.CreationTime.getUTCMilliseconds() > olderThanAgeInHours
) {
2022-04-16 18:26:00 +00:00
await CF.deleteStack(deleteStackInput).promise();
}
2022-04-16 18:13:13 +00:00
}
if (stacks === undefined) {
return;
}
}
2022-04-07 00:45:15 +00:00
}