カヤック発OSSカタログ

SREチームの長田です。

今回は、カヤックのメンバーが業務で使うために開発・公開しているOSSなプロダクトをまとめて紹介しようという企画です。 KAYAC organization以下にあるものだけでなく、在籍中のメンバーが作ったものもひっくるめて、実際に業務で使用しているものを中心に 紹介しています。

以下の3つのカテゴリに分けて記載しています。 各カテゴリ内はアルファベット順です。

  • ツール編
    • 人間が手動で実行するもの
  • アプリケーション編
    • どこかに常駐して、イベントを受け取ると動作するもの
  • ライブラリ編
    • ツールやアプリケーションから参照されるもの

集めてみたらそこそこの量になったので、本記事では詳細な説明は省いています。 GitHubリポジトリのURLや関連記事のリンクを併記していますので、より詳しく知りたい場合はそちらを参照ください。

(...) 内はそのプロダクトで使用している主なプログラミング言語です。

ツール編

aws-secrets-dumper (Go)

AWS Secrets Manager / AWS Systems Manager Parameter Store の値を、Terraformで管理するためのツールです。 既存のリソースをリストアップし、 .tf ファイルとして出力します。

関連記事:

awslim (Go)

awscliのGo実装です。 Python実装の本家と比べて、数倍〜25倍速程度でコマンドを実行できます。

関連記事:

ecspresso (Go)

Amazon ECSにデプロイするためのコマンドラインツールです。 カヤックが運用するサービスはほぼこのツールでデプロイされています。

関連記事:

ecsta (Go)

Amazon ECSのタスクに関する様々な操作を行うためのコマンドラインツールです。 もともとは ecspresso にあった機能を、責務分離のために単一のツールとして切り出したもの、という経緯があります。 作者の藤原曰く、「マネコンがいらないくらい便利

iam-policy-filder (Go)

AWS Identity & Access Management(IAM)のPolicyから、特定のActionを許可するものを抽出するコマンドラインツールです。 たまにある「あるActionが廃止される」「あるActionの許可が細分化される」場合の対応範囲特定に役立ちます。

関連記事:

lambroll (Go)

AWS Lambda版ecspressoとも言うべきデプロイツール。 ソースコードの圧縮・アップロード・エイリアス登録など、デプロイに必要な一連の操作が1コマンドで完結します。

関連記事:

setddblock (Go)

DynamoDBでロック管理を行う、分散ロックツール。 分散環境での定期実行処理を走らせる場合の排他制御などに力を発揮します。

ssmwrap (Go)

AWS Systems ManagerのParameter Storeに保存された値を環境変数・ファイルにエクスポートした上で任意のコマンドを実行するコマンドラインツールです。 環境変数・ファイルという一般的なインターフェイスを利用し、手軽に・手離れ良くParameter Storeを使用することができます。 Goで書かれたアプリケーションからライブラリとして利用することも可能です。

関連記事:

tracer (Go)

Amazon ECSの1タスクに関連するログを時系列順に表示するコマンドラインツールです。 「異常終了したタスクの最後のログをtracerで取得しSlackに投げる」仕組みを作ると、原因調査のハードルがぐっと下がるのでおすすめです。

アプリケーション編

cognito-gate (Go)

Amazon Cognitoで認証をかける際の、認証前Lambdaトリガーとして使用するアプリケーションです。 ユーザーのメールアドレスを見て、完全一致・ドメイン部一致パターンを設定するだけで手軽に動作させることができます。

gdnotify (Go)

Google Drive内の変更を、Amazon EventBridge経由で受け取るためのアプリケーションで、Lambda functionで動作させることを前提としています。 スプレッドシートの変更をトリガーに、何かしらの自動処理をAWS上で実行する際に利用しています。

katsubushi (Go)

分散環境でユニークなIDを発番するアプリケーションです。 ID発番をデータベースに任せたくない場合、例えば水平分割したデータベースにレコードを挿入する場合などに使用しています。 Goのライブラリとしても使用できます。

関連記事:

lamux (Go)

リクエストに使用したドメインの、サブドメイン部分に対応するLambda functionのエイリアスをinvokeします。 Lambda functionで動かすアプリケーションを開発している際に、異なるバージョンのアプリケーションを並行して動作確認する際に使用しています。 後に紹介するmirage-ecsのAmazon Lambda版とも言えるでしょう。

let-rds-sleep (Go)

Amazon RDSのインスタンス・クラスタを1週間以上止めておくためのLambda functionです。 たまにしか使用しないけど、都度バックアップからリストアするのはめんどくさい・・・ときに使います。

関連記事:

mirage-ecs (Go)

Amazon ECSの 1Task=1環境 としてサクッと結合テスト環境を起動するアプリケーション。 自分専用の環境をサクッと起動できるので、開発体験が大幅に向上します。

prepalert (Go)

サーバ監視サービスMackerelのアラート発報に、関連情報を追加記録するためのアプリケーションです。 きちんと仕込めば、アラート発報時点で障害調査に必要な情報はすでにそろっている状態にできます。

関連記事:

ライブラリ編

他のアプリケーションやツールから利用されるライブラリ類。

ActiveRecord::CursorPager (Ruby)

ActiveRecordで、ページネーションを行うためのライブラリです。 ページ番号ではなく、前後のカーソルを指定することで、ページネーションを実現します。 地域通貨サービスまちのコインで使用されています。

ActiveAdmin::MenuTree (Ruby)

Ruby on Rails用の管理画面フレームワーク ActiveAdmin の、グローバルメニューをカスタマイズするためのRuby gemです。 移住支援サービスSMOUTの運用管理画面で実際に使用されています。

関連記事:

canyon (Go)

Amazon SQSをバックエンドとしたjob queue workerを実装するためのGoライブラリです。 AWS Lambdaで受け付けたリクエストの実処理をバックエンドに回す際などに利用するとよいでしょう。

ecsmeta (Go)

Goで書かれたアプリケーション内から、Amazon ECSメタデータを手軽に利用するためのライブラリです。

fluent plugin各種 (Ruby)

Fluentdのプラグイン群です。 社内でのアプリケーション実行環境として主流であるAmazon ECSでは、設定一つでAmazon CloudWatch Logsにログを送信・集約できますが、ログの量が多い場合はFluentdを採用する事が多いです(主にコストの関係上)。

関連記事:

jsonreplace (Go)

JSON Schemaにマッチした部分だけを置換するGoライブラリです。 「このログ、値としてはintが正しいんだけどstringとして出力されてるんだよなー」という場合に使います。

go-config (Go)

環境変数をyaml/json/toml内から参照する機能を提供するGoライブラリです。 後に紹介するtfstate-lookupの機能も内蔵されています。 CLIインターフェイスもあるので、出力されたyaml/jsonファイルを経由すればGo以外の言語からも利用できます。

カヤックの自社サービスのうち、Goで書かれたもののほとんどで採用されています。

go-genddl (Go)

Goのstructによるテーブル定義からデータベースのスキーマを生成するツールです。 MySQLとSQLite3に対応しています。

関連記事:

go-sqlla (Go)

Go用のクエリビルダです。 スキーマ定義からコード生成されたインターフェイスを用いて、型安全にクエリを組み立てることができます。 こちらもカヤックの自社サービスの多くで採用されています。

関連記事:

slogutils (Go)

Go言語の標準ライブラリである log/slog の、Middlewareとして使用するライブラリで、ログレベルに応じた色付けを行います。 hashicorp/logutilsのように、ログメッセージ中の文字列 [INFO] [WARN] などを元にログレベルを判別する機能もあり、 log から log/slog へ移行する際にも利用できます。

tfstate-lookup (Go)

Terraformの状態管理ファイルであるterraform.tfstateファイルを参照し、管理対象リソースの情報を取得するためのGoライブラリです。 コード中から、Terraform管理の名前でリソース情報を取得することができます。 CLIツールも提供されており、単独でも利用できます。

今回紹介したOSSライブラリの中でも、社内外含めて多くのプロダクトで使われています。

まとめ

社内で「OSSカタログ的なものがあるといいよね〜」という話題があり、今回ブログ記事としてまとめてみた次第です。 もともとは社内ドキュメントに記載していたものですが、オープンソースなプロダクトの話しなので、カタログもオープンでいいだろうということで本ブログにて公開するに至りました。

今回は全部で26のOSSプロダクトを紹介しましたが、ニッチ過ぎて説明に困るものや、すでに退職したメンバーが在職中に公開したものなども含めるとまだまだあります。 紹介したものも私の観測範囲にあったもの+社内からゆるく募集したものだけなので、総数はさらに増えそうです。

ちなみに、本記事で紹介したOSSは、ほとんどが Goで書かれたもの でした。 社内のプロダクトでもGoが頻繁に使われているというのもありますが、ビルドすればポータブルになることがCLIツールを書く際に好まれているようです。

カヤックのエンジニアが解決したかった課題と、またそれらを解決する手段として作ってきたOSSプロダクトにより、カヤックのことを知っていただければ幸いです。

カヤックではOSSが好きなエンジニアを募集しています!