ecs-pf
Version:
CLI for port-forwarding to RDS via AWS ECS
84 lines (83 loc) • 3.24 kB
JavaScript
import { safeParse } from "valibot";
import { TaskArnSchema, } from "../types.js";
import { messages } from "../utils/messages.js";
import { VERSION } from "../version.js";
import { generateReproducibleCommand } from "./command-generation.js";
export function displayDryRunResult(result) {
messages.dryRun.header();
messages.dryRun.awsCommand(result.awsCommand);
messages.dryRun.reproducibleCommand(result.reproducibleCommand);
messages.dryRun.sessionInfo({
...result.sessionInfo,
region: result.sessionInfo.region,
cluster: result.sessionInfo.cluster,
task: result.sessionInfo.task,
rds: result.sessionInfo.rds ? result.sessionInfo.rds : undefined,
rdsPort: result.sessionInfo.rdsPort
? String(result.sessionInfo.rdsPort)
: undefined,
localPort: result.sessionInfo.localPort
? String(result.sessionInfo.localPort)
: undefined,
container: result.sessionInfo.container
? String(result.sessionInfo.container)
: undefined,
command: result.sessionInfo.command,
});
}
export function generateConnectDryRun(params) {
const { region, cluster, task, rdsInstance, rdsPort, localPort } = params;
const taskArnStr = `ecs:${cluster}_${task}_${task}`;
const { output: taskArn, success } = safeParse(TaskArnSchema, taskArnStr);
if (!success) {
throw new Error(`Invalid TaskId format: ${task}. Expected format: ecs:<cluster>_<task>_<task>`);
}
const parameters = {
host: [rdsInstance.endpoint],
portNumber: [String(rdsPort)],
localPortNumber: [String(localPort)],
};
const parametersJson = JSON.stringify(parameters);
const awsCommand = `aws ssm start-session --target ${taskArn} --parameters '${parametersJson}' --document-name AWS-StartPortForwardingSessionToRemoteHost`;
const reproducibleCommand = generateReproducibleCommand({
region,
cluster,
task: taskArn,
rds: rdsInstance.dbInstanceIdentifier,
rdsPort,
localPort,
});
return {
awsCommand,
reproducibleCommand,
sessionInfo: {
region,
cluster,
task: taskArn,
rds: rdsInstance.dbInstanceIdentifier,
rdsPort,
localPort,
},
};
}
export function generateExecDryRun(params) {
const { region, cluster, task, container, command } = params;
const taskArnResult = safeParse(TaskArnSchema, task);
if (!taskArnResult.success) {
throw new Error(`Invalid TaskId format: ${task}`);
}
const taskArnForECS = taskArnResult.output;
const awsCommand = `aws ecs execute-command --region ${region} --cluster ${cluster} --task ${task} --container ${container} --command "${command}" --interactive`;
const reproducibleCommand = `npx ecs-pf@${VERSION} exec-task --region ${region} --cluster ${cluster} --task ${task} --container ${container} --command "${command}"`;
return {
awsCommand,
reproducibleCommand,
sessionInfo: {
region,
cluster,
task: taskArnForECS,
container,
command,
},
};
}