UNPKG

ecs-pf

Version:

CLI for port-forwarding to RDS via AWS ECS

84 lines (83 loc) 3.24 kB
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, }, }; }