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