最近作ったGoのプロダクト

自己紹介

  • @snowcrush
  • お仕事はgoでAPI書いたりしてます
  • イカはじめました

最近作ったGoのプロダクトを紹介します

toml2json

https://github.com/minoritea/toml2json

  • TOMLからJSONへのコンバータ
  • node, python製の同名ツールはあったがgoはなかったので作ってみた

実装

func tomlToJson(data []byte) ([]byte, error) {
	tree, err := toml.LoadBytes(data)
	if err != nil {
		return []byte{}, err
	}
	json, err := json.Marshal(tree.ToMap())
	if err != nil {
		return []byte{}, err
	}
	return json, nil
}
  • ほぼgithub.com/pelletier/go-tomlencoding/jsonの間で値を受け渡しているだけ

  • go-tomlのToMapメソッドでmapをそのまま出力できるので便利

    • depで採用されてるけど、これまでイマイチメリットが分からんかった

    • ドキュメントをバインドせずにそのまま扱うには便利

つかいかた

$ cat foo.toml | toml2json | jq . # jqで整形して出力

tunneler

https://github.com/minoritea/tunneler

  • 多段SSHプロキシサーバ
  • まだ未完成(基本機能は完成)

想定用途

  • 踏み台サーバ経由でしか接続を許可していない環境でローカルから内部のサーバに接続するケース
    • ローカルから開発環境ネットワーク内のDBに直接アクセス
  • さらに対象ホストがネットワーク内の特定のサーバからの接続しか許可していない場合
    • AWSでのVPCなど
  • 上記のような場合にSSHで多段プロキシ接続を行いたい
    • 設定管理を楽に行いたい
  • OpenSSHでトンネルを張るのは管理が面倒だった
  • TOMLなどのファイルフォーマットで管理したい

tunnelerの使い方

$ tunneler -c forwarding.toml

あとは起動しっぱなしになる

設定ファイル

  • TOML形式

例えば、以下のような多段プロキシを貼りたい場合

localhost => bastion (192.168.100.1)
              +=> app-server (192.168.100.2)
                    +=> db server (192.168.101.10) port 5432

設定ファイル

[bastion-dev]
host = "192.168.100.1"
port = "22"
user = "bastion-user"
cert_path = "/Users/minori.tokuda/.ssh/bastion-dev.pem"
# 続く

設定ファイル

[bastion-dev.cascades.app-server]
host = "192.168.100.2"
port = "22"
user = "appuser"
cert_path = "/Users/minori.tokuda/.ssh/bastion-dev.pem"

# 続く

設定ファイル

[bastion-dev.cascades.app-server.tunnels.postgres]
local_port = "15432"
remote_host = "192.168.101.10"
remote_port = "5432"

JSONで書くと

{
  "bastion-dev": {
    "host":"192.168.100.1",
    "port":"22",
    "user":"bastion-user",
    "cert_path":"/Users/minori.tokuda/.ssh/bastion-dev.pem",
    "cascades": {
      "app-server": {
        "host":"192.168.100.2",
        "port":"22",
        "user":"appuser",
        "cert_path":"/Users/minori.tokuda/.ssh/bastion-dev.pem",
        "tunnels": {
          "postgres": {
            "local_port":"15432",
            "remote_host":"192.168.101.10",
            "remote_port":"5432"
          }
        }
      }
    }
}

※ 設定ファイルフォーマットはTOMLのみです

今後サポートしたい機能

  • パスワード接続(現在はpem形式の証明書による認証のみサポート)
  • 踏み台での名前解決
  • 踏み台上の証明書利用