概要
久しぶりに人様のための個人開発をしてみました。
AWS Fargateにデプロイする際、環境ごとに異なる値をECSのタスク定義に埋め込む必要がありますよね。最初はシェルスクリプトで環境変数を埋め込んでいたのですが、シェルって意外と繊細でエラーも出やすい。少し書き間違えただけで動かない…なんてことも多く、もっと簡単に管理できないかと考えた結果、ECSタスク定義ジェネレーターをGoで作ってみることにしました。
Goならシェルスクリプトよりも読みやすく、go installで簡単にインストールして使うことができます。Go CLIアプリとして、このツールを導入することで、効率的で安定したタスク定義の生成が可能になりました。
作ったもの
使い方
- 必要なファイルの用意
- タスク定義のテンプレートファイル
- .envファイル
- インストール
-
go install github.com/rendaman0215/ECSbuilder
-
- 実行
-
ECSbuilder -i INPUT_FILES_DIR -t TEMPLATE_FILE -e ENV_VILE -o OUTPUT_FILE_NAME
-
技術スタック
このジェネレーターは、Go言語で実装され、必要な各種ライブラリを用いて簡単な操作でタスク定義が作成できるよう工夫しています。以下が主な技術スタックです。
-
Go言語
: シンプルで速い。CLIツールの開発に最適 -
cobra
: CLIのフラグや引数処理に使用。GoのCLIツール定番のライブラリです -
promptui
: ユーザーからの入力が必要なときに使います。インタラクティブに操作できるので、入力がなかった場合でもスムーズにサポートしてくれます
実装
1. ファイル構造
プロジェクトはクリーンアーキテクチャとDDDをベースに整理されています。これにより、役割ごとにファイルが分けられ、拡張や変更があってもコード全体の見通しが良くなるように工夫しています。
.
├── cmd
│ ├── root.go # コマンドエントリーポイント
├── internal
│ ├── app # タスク定義生成のメインロジック
│ └── config # 環境変数の読み込みロジック
└── pkg
└── template_parser # テンプレート置換ロジック
2. 動作の流れ
このジェネレーターは、3つのファイルを使用してタスク定義を生成します。
-
テンプレートファイルと.envファイル: まず、テンプレートファイルにプレースホルダー(
${VAR_NAME}
形式)を設定しておきます。次に、.env
ファイルに実際の値をセット -
CLI実行でタスク定義を生成: プログラムを実行すると、環境変数をテンプレート内のプレースホルダーに置換して
taskdef.json
を生成します -
エラーハンドリング:
promptui
でファイルパスなどをインタラクティブに入力できるようになっているため、入力不足やエラーもスムーズに処理できます
3. コード例
このジェネレーターのメイン処理は、テンプレート内のプレースホルダーを環境変数で置き換えることです。以下のように、環境変数を読み込み、テンプレートのプレースホルダーと置換しています。
// テンプレートのプレースホルダーを置換
content := string(templateData)
for key, value := range envVars {
placeholder := fmt.Sprintf("${%s}", key)
content = strings.ReplaceAll(content, placeholder, value)
}
シンプルですが、これでプレースホルダーが一気に環境変数に置き換わります。テンプレート内での変数が多くなっても、容易に管理可能です。
まとめ
このツールのおかげで、シェルスクリプトで苦労していたタスク定義の生成が楽になりました。Goのシンプルさを活かしつつ、手作業から解放され、ミスも減少しました。もしあなたもシェルスクリプトでタスク定義を管理しているなら、ぜひこのツールを使って、タスク定義生成を簡単にしてみてください。