AWS App RunnerでPipeCDのpipedを動か(せるように)した

要約

  • PipeCDのpipedをサクッと動かしたいユーザ向けに、App Runner上でpipedを動かすサンプルをTerraformで作りました。(PipeCD公式ではないです

  • App Runnerでpipedを動かせるようにするために、PipeCDに少し機能追加しました。
  • 注: App Runnerの本来の使い方ではないと思います。

PipeCDの前提知識(ざっくり)

PipeCD's architecture overview
    • piped
      • Gitリポジトリを継続監視して、変更があれば資産をデプロイするコンポネント
      • piped自体の設定値は、起動時に指定が必要
    • Control Plane
      • pipedから送られてくるデプロイ状況などを管理するコンポネント
      • UIも提供
      • 本記事ではほとんど関係ありません。

背景

  • サーバレスワークロードのユーザにとって、pipedを管理するためだけにECSを構築・管理するのはtoo much
    • 特にVPC、セキュリティグループ、タスク定義あたり
  • -> サーバレスアプリと同様にpipedもサーバレスでサクッと動かしたい!
  • -> しかしpipedは常駐稼働が必要*1であるため、Lambdaでは動かせない
  • -> App Runnerで動かせたら楽では??

構成

  • 下記の構成にしました。

architecture: piped-on-apprunner
  • 下記のREADMEに構築手順を記載しています。Terraformです。
  • ※ 上記サンプルではpipedではなくlauncher*2を使用していますが、本記事ではあまり重要な違いではないです。

主な設定値

注: 本記事で触れるApp Runnerの仕様は今後変更される可能性があります。

  • ヘルスチェック
  • 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)

      1. Secrets Managerにconfigを保管
      2. ECSタスクの起動時にそのconfigを環境変数として取得
      3. pipedの起動時にその環境変数の値を使用 
    • しかしApp Runnerでは、ECSと同様の方式では成功しませんでした。
      • 理由: StartCommand内で環境変数が展開されないため。
      • ちなみに StartCommandCMDの上書きに相当するため、App Runnerのサービス起動時にENTRYPOINTを含む上書きは不可能な模様でした。
        • ECSではタスク定義側で entryPointcommandの両方を上書き可能
  • 対応として、piped起動時に、pipedのconfigをSecrets Managerから取得できるようにしました。
    • 実装は極めてシンプルなので、特筆事項はありません。
おわりに

*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