🏃‍♀️

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

2024/02/22に公開

まとめ

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

https://github.com/t-kikuc/pipecd-iac/tree/main/piped-on-apprunner

  • App Runnerでpipedを動かせるようにするために、PipeCDに少し機能追加しました。

  • 注: App Runnerの本来の使い方ではないと思います。

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

PipeCDとは

  • OSSのGitOpsツール

  • 現時点でKubernetes/Cloud Run/ECS/Lambda/Terraformへのデプロイが可能

https://pipecd.dev/

大まかなアーキテクチャ

Concepts | PipeCD

PipeCD's architecture overview

  • piped

    • Gitリポジトリを継続監視して、変更があれば資産をデプロイするコンポネント
    • piped自体の設定値は、起動時に指定が必要
    • 例: どのGitリポジトリを監視するか?
  • Control Plane

    • pipedから送られてくるデプロイ状況などを管理するコンポネント
    • UIも提供
    • 本記事ではほとんど関係ありません。

背景

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

構成

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

  • 下記のREADMEに構築手順を記載しています。Terraformです。

https://github.com/t-kikuc/pipecd-iac/blob/main/piped-on-apprunner/README.md

主な設定値

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

ヘルスチェック

  • pipedはHTTPのヘルスチェック用エンドポイントを公開しているので、そのポート・パスを利用しています。

https://pipecd.dev/docs-v0.49.x/user-guide/metrics/#health-checking

  • 下記に比べると凡庸なやり方です。

https://speakerdeck.com/gotok365/run-non-apps-with-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内で環境変数が展開されないため。
    • ちなみに StartCommand は CMDの上書きに相当するため、App Runnerのサービス起動時にENTRYPOINTを含む上書きは不可能な模様でした。
      • ECSではタスク定義側で entryPointと commandの両方を上書き可能

対応

  • 対応として、piped起動時に、pipedのconfigをSecrets Managerから取得できるようにしました。

https://github.com/pipe-cd/pipecd/pull/4785

  • 実装は極めてシンプルなので、特筆事項はありません。

おわりに

  • CDKでもつくりたい
  • Control PlaneをTerraformで構築するサンプルは既にあります。

https://github.com/pipe-cd/control-plane-aws-ecs-terraform-demo

サイバーエージェント Developer Productivity室

Discussion