shared/database/local/getDatabaseJumpHost.ts (59 lines of code) (raw):
import { AutoScaling } from "@aws-sdk/client-auto-scaling";
import {
EC2,
waitUntilInstanceRunning,
waitUntilInstanceStatusOk,
} from "@aws-sdk/client-ec2";
import { standardAwsConfig } from "../../awsIntegration";
import { Stage } from "../../types/stage";
import { getDatabaseJumpHostAsgName } from "../database";
import { APP } from "../../constants";
export const getDatabaseJumpHost = async (stage: Stage) => {
const AutoScalingGroupName = getDatabaseJumpHostAsgName(stage);
const autoscaling = new AutoScaling(standardAwsConfig);
const ec2 = new EC2(standardAwsConfig);
console.log(
"Requesting a database 'jump host' (by ensuring desired count of the ASG is 1)"
);
// set the desired capacity to 1 (even if it's already at 1)
await autoscaling.setDesiredCapacity({
DesiredCapacity: 1,
AutoScalingGroupName,
HonorCooldown: false,
});
console.log("Waiting for instance to be 'running'...");
const instanceRunningResult = await waitUntilInstanceRunning(
{
client: ec2,
maxWaitTime: 300,
},
{
Filters: [
{ Name: "tag:App", Values: [APP] },
{ Name: "tag:Stage", Values: [stage] },
{
Name: "tag:aws:autoscaling:groupName",
Values: [getDatabaseJumpHostAsgName(stage)],
},
{ Name: "instance-state-name", Values: ["running"] },
],
}
);
const maybeInstanceId =
instanceRunningResult.reason?.Reservations?.[0]?.Instances?.[0]?.InstanceId;
if (!maybeInstanceId) {
throw "EC2 waiter suggested instance was running, but then doesn't have an instance for us 😢";
}
console.log(`Instance ${maybeInstanceId} is running 🎉`);
console.log("Waiting for instance to have 'OK' status...");
await waitUntilInstanceStatusOk(
{
client: ec2,
maxWaitTime: 300,
},
{
InstanceIds: [maybeInstanceId],
}
);
console.log(`Instance ${maybeInstanceId} has OK status 🎉`);
return maybeInstanceId;
};