Я хочу подключиться к MySQL экземпляру БД, размещенному на AWS, с помощью программы Go на локальном хосте с использованием туннелирования. Мы подключаемся к AWS через экземпляр Bastion. Это правила в файле .ssh / config:
User user1
Host bastion
HostName {ipaddress}
User user1
ForwardAgent yes
....
Host *.amazonaws.com
ProxyCommand ssh -qax bastion nc %h %p
Я использую команду ниже для перенаправления портов, и я могу подключиться к экземпляру mysql на 127.0.0.1:3307, используя локальный mysql клиент или даже с помощью программ в Go.
ssh -f user1@aws-instance1.amazonaws.com -L 3307:127.0.0.1:3306 -N
Однако возможно ли достичь полной функциональности использования сервера перехода и последующего подключения к удаленному экземпляру базы данных в Go? Я нашел этот ответ: { ссылка } Однако я не могу понять, как перенаправить на экземпляр mysql на узле aws, который прослушивает 127.0.0.1:3306. Я считаю, что могу подключиться к экземпляру aws, поскольку все подключения и клиентские объекты были успешно созданы в программе ниже, но я не знаю, как перенаправить на сервер mysql.
func main() {
config := &ssh.ClientConfig{
User: "user1", // replace this
Auth: []ssh.AuthMethod{
ssh.KeyboardInteractive(func(user, instruction string, questions []string, echos []bool) ([]string, error) {
// Just send the password back for all questions
answers := make([]string, len(questions))
for n, q := range questions {
a, err := getAnswer(q)
if err != nil {
log.Fatal(err)
}
answers[n] = a
}
return answers, nil
}),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
bastionHost := "bastion-ip:22"
awsDBNode := "aws-instance1.amazonaws.com:22"
bClient, err := ssh.Dial("tcp", bastionHost, config)
if err != nil {
log.Fatal(err)
}
fmt.Printf("client: %v", bClient)
defer bClient.Close()
// Dial a connection to the service host, from the bastion
conn, err := bClient.Dial("tcp", awsDBNode)
if err != nil {
log.Fatal(err)
}
fmt.Printf("conn: %v", conn)
defer conn.Close()
}
func getAnswer(quest string) (string, error) {
fmt.Printf("please enter %s: ", quest)
reader := bufio.NewReader(os.Stdin)
name, err := reader.ReadString('\n')
if err != nil {
return name, err
}
return clean.ReplaceAllString(name, ""), nil
}
var clean = regexp.MustCompile("[\r\n,]")