要約
- PipeCDのpipedをサクッと動かしたいユーザ向けに、App Runner上でpipedを動かすサンプルをTerraformで作りました。(PipeCD公式ではないです)
- App Runnerでpipedを動かせるようにするために、PipeCDに少し機能追加しました。
- 注: App Runnerの本来の使い方ではないと思います。
PipeCDの前提知識(ざっくり)
- PipeCDとは
-
OSSのGitOpsツール
-
現時点でKubernetes/Cloud Run/ECS/Lambda/Terraformへのデプロイが可能
-
- 大まかなアーキテクチャ Concepts | PipeCD
背景
- サーバレスワークロードのユーザにとって、pipedを管理するためだけにECSを構築・管理するのはtoo much
- 特にVPC、セキュリティグループ、タスク定義あたり
- -> サーバレスアプリと同様にpipedもサーバレスでサクッと動かしたい!
- -> しかしpipedは常駐稼働が必要*1であるため、Lambdaでは動かせない
- -> App Runnerで動かせたら楽では??
構成
- 下記の構成にしました。
- 下記のREADMEに構築手順を記載しています。Terraformです。
- ※ 上記サンプルではpipedではなくlauncher*2を使用していますが、本記事ではあまり重要な違いではないです。
主な設定値
注: 本記事で触れるApp Runnerの仕様は今後変更される可能性があります。
- ヘルスチェック
- pipedはHTTPのヘルスチェック用エンドポイントを公開しているので、そのポート・パスを利用しています。 *3
- 下記に比べると凡庸なやり方です。
- Auto Scaling Configuration
- min=1,max=1に指定しています。
- pipedは1台で十分であり、スケールインもスケールアウトもしてほしくないため。
- min=1,max=1に指定しています。
- ネットワーク
- 開始コマンド(StartCommand)
- pipedの起動オプションで、Secrets Managerからpipedのconfigを取得するようにしています。
- 一番苦労した点です。次の節参照。
- pipedの起動オプションで、Secrets Managerからpipedのconfigを取得するようにしています。
実現にあたって必要となった追加機能
- PipeCDのv0.46.0時点では、App Runnerでpipedを動かすには下記の通り課題がありました。
- pipedのconfigはクレデンシャルを含むため、config全体をGitで管理するのはセキュアではありません。
- そのため、ECSでpipedを動かす場合には下記のようになります。(
- しかしApp Runnerでは、ECSと同様の方式では成功しませんでした。
- 理由: StartCommand内で環境変数が展開されないため。
- ちなみに
StartCommand
はCMD
の上書きに相当するため、App Runnerのサービス起動時にENTRYPOINTを含む上書きは不可能な模様でした。- ECSではタスク定義側で
entryPoint
とcommand
の両方を上書き可能
- ECSではタスク定義側で
- 対応として、piped起動時に、pipedのconfigをSecrets Managerから取得できるようにしました。
- 実装は極めてシンプルなので、特筆事項はありません。
おわりに
- CDKでもつくりたい
- Control PlaneをTerraformで構築するサンプルは既にあります。GitHub - pipe-cd/control-plane-aws-ecs-terraform-demo
*1:piped自体はステートレスであることもあり、絶対に落ちてはいけないということではないです
*2:launcherを使うと、PipeCDのWeb Consoleからpipedのバージョン更新が可能になります。参照: https://pipecd.dev/docs/user-guide/managing-piped/remote-upgrade-remote-config/
*3:現時点でヘルスチェックのdocはないです... https://github.com/pipe-cd/pipecd/issues/4797