-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
connect.js
74 lines (59 loc) · 2.91 KB
/
connect.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env node
import { spawn } from 'child_process'
import inquirer from 'inquirer'
import fs from 'fs'
import os from 'os'
import path from 'path'
import { envPortMapping, REGION, DOMAIN_NAME } from './envPortMapping.js'
const awsConfigPath = path.join(os.homedir(), '.aws', 'config')
const awsConfig = fs.readFileSync(awsConfigPath, 'utf-8')
const ENVS = awsConfig.split('\n').filter(line => line.startsWith('[') && line.endsWith(']'))
.map(line => line.slice(1, -1).replace('profile ', ''))
inquirer.prompt([
{
type: 'list',
name: 'ENV',
message: 'Please select the environment:',
choices: ENVS
}
]).then((answers) => {
const ENV = answers.ENV
console.log(`You selected: ${ENV}`)
const matchedSuffix = Object.keys(envPortMapping).sort((a, b) => b.length - a.length).find(suffix => ENV.endsWith(suffix))
const portNumber = envPortMapping[matchedSuffix] || '9200'
const awsVaultExecCommand = `aws-vault exec ${ENV} --`
const opensearchEndpointCommand = `aws opensearch describe-domain --region ${REGION} --domain-name ${DOMAIN_NAME} --query 'DomainStatus.Endpoints.vpc' --output text`
const command = `${awsVaultExecCommand} ${opensearchEndpointCommand}`
const process = spawn('sh', ['-c', command])
process.stdout.on('data', (data) => {
const endpoint = data.toString().trim()
const instanceIdCommand = `aws ec2 describe-instances --region ${REGION} --filters "Name=tag:Name,Values='*bastion*'" "Name=instance-state-name,Values=running" --query "Reservations[].Instances[].[InstanceId]" --output text`
const instanceIdProcess = spawn('sh', ['-c', `${awsVaultExecCommand} ${instanceIdCommand}`])
instanceIdProcess.stdout.on('data', (data) => {
const INSTANCE_ID = data.toString().trim()
if (!INSTANCE_ID) {
console.error('Failed to find a running instance with tag Name=*bastion*.')
return
}
const portForwardingCommand = `aws ssm start-session --target ${INSTANCE_ID} --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters "host=${endpoint},portNumber='443',localPortNumber='${portNumber}'" --cli-connect-timeout 0`
const portForwardingProcess = spawn('sh', ['-c', `${awsVaultExecCommand} ${portForwardingCommand}`])
portForwardingProcess.stdout.on('data', (data) => {
console.log(`Port Forwarding Output: ${data.toString().trim()}`)
})
portForwardingProcess.stderr.on('data', (data) => {
console.error(`Port Forwarding Error: ${data.toString()}`)
})
})
instanceIdProcess.stderr.on('data', (data) => {
console.error(`Instance ID Error: ${data.toString()}`)
})
})
process.stderr.on('data', (data) => {
console.error(`Error: ${data.toString()}`)
})
process.on('close', () => {
console.log(`You can access Kibana Dashboards by the link https://localhost:${portNumber}/_dashboards/`)
console.log('Login: admin')
console.log('Password: Supersecret1!')
})
})