Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

PipeCDでデプロイメントが完了したらMackerelのグラフアノテーションに記録する

これは Mackerel Advent Calendar 2024 1日目の記事です。

前置き

こんにちは。サーバー監視・オブザーバビリティプラットフォームであるMackerelの開発者で、「オブザーバビリティの実現」チームでテックリード兼プロダクトオーナーをしております id:arthur-1 と申します。昨年のMackerel Advent Calendar 2023においては25記事書き切ることができましたが、今年は控えめにやっていきます。

さて、先日はCloudNative Days Winter 2024に参加させていただき、多くの方と交流できました。私はプレイベントである船上LT会にて、OpenFeature×AWS AppConfigの話で登壇したほか、OSS展示にOpenTelemetryに関する自作ツールのポスターを出していました。

懇親会/2次会でPipeCDのメンテナの方々とたくさんお話しできたので、今回はMackerel×PipeCDのネタで行こうと思います。昨年の私のエントリを読んでいる方はお気づきかもしれませんが、以下の記事のPipeCD版をやります。

blog.arthur1.dev

本題

PipeCDとは、GitOpsを実現する継続的デリバリーツールです。マルチプラットフォーム対応で統一されたプログレッシブデリバリーを行うことを目指しており、Kubernetesだけでなく、Amazon ECSやTerraformなどに対しても利用できるのが大きな特徴です。manifestが含まれたGitのリモートリポジトリの更新を検知して、自動でさまざまな環境に対してデプロイすることができます。

pipecd.dev

プログレッシブデリバリーを目指しているところが個人的には推しポイントです。先日私がWaroom Meetup #2にて障害対応に関する登壇をした際にも、手札に入れたい技術としてプログレッシブデリバリーを挙げていました。

なんらかのアプリケーションをデプロイしたり(Binary Push)、インフラの設定を変更したり(Configuration push)する行為は、障害を起こす主な要因の一つです*1

監視サービスにおいて、こうしたシステムの変化や障害に関連し得るイベントと、モニタリングシグナルを紐づけて閲覧できるというのは大事な機能です。Mackerelにはグラフアノテーションという機能があり、グラフ上に時刻と紐づけてメモを残すことができます。グラフとは独立してブラウジングすることもできるので、サービスの様子の変化に関連するさまざまなイベントとその時刻を記録しておく場所としてご利用いただけます。

今回はPipeCDでデプロイメントが完了したら、その時刻でグラフアノテーションに書き込み、デプロイイベントとグラフを紐づけて描画できるようなものを作っていきます。

mkrで手軽にグラフアノテーションを作る

グラフアノテーションを手軽に投稿するにはMackerelのCLIであるmkrを利用するのが便利です。mkr annotationsコマンドで以下のようにしてグラフアノテーションを作ることができます。

export MACKEREL_APIKEY="***censored***"
mkr annotations create --title "message" -s mackerel-service-name --from $(date +%s) --to $(date +%s)

Argo CDの場合のおさらい

Argo CDのSync起因でグラフアノテーションを書き込もうとしていた時には、Argo CDのResource Hooksの仕組みを使って、Sync完了後にmkrのコンテナイメージを動かすようなJobを定義していました。

apiVersion: batch/v1
kind: Job
metadata:
  generateName: mackerel-sesame-deploy-annotation-
  annotations:
    argocd.argoproj.io/hook: PostSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
  template:
    spec:
      containers:
        - name: mkr-create-annotation
          image: docker.io/mackerel/mkr:latest
          env:
            - name: MACKEREL_APIKEY
              valueFrom:
                secretKeyRef:
                  name: mackerel-arthur-1
                  key: apikey
          command: ["sh", "-c"]
          args:
            - |
              mkr annotations create --title "synced mackerel-sesame" \
              -s iot-monitor -r mackerel-sesame \
              --from $(date +%s) --to $(date +%s)
      restartPolicy: Never

PipeCDの場合

PipeCDにはv0.46からデプロイメントパイプラインにScript Runという種類のstageが実装されています。エントリ執筆現在(v0.49.4)ではアルファステータスとなっています。

pipecd.dev

デプロイを実行したステージの後にScript Runステージを入れ、そこで何らかの処理を行えばアノテーションを投稿できそうです。しかし、ここで実行できるコマンドは限られています*2。pipedのコンテナイメージにビルトインで入っているコマンドしか呼べず、もちろんここにmkrは入っていません。

そのため、mkrを含んだpipedのコンテナイメージを自前で作る必要があります。以下のようなDockerfileを書くことで、mkrを含んだpipedのコンテナイメージをビルドできます。mkrもpipedもイメージがAlpineベースなので、相性的にもバッチリです。

FROM mackerel/mkr:v0.59.0 AS mkr
FROM ghcr.io/pipe-cd/piped:v0.49.3
COPY --from=mkr /usr/local/bin/mkr /usr/local/bin/mkr

カスタムビルドしたpipedを立てられたら、あとは以下のようにPipeCDのmanifest yamlを編集して、デプロイパイプラインの最後のステージとしてSCRIPT_RUNを追加してあげましょう。

apiVersion: pipecd.dev/v1beta1
kind: TerraformApp
spec:
  name: plan-approval-apply-app
  input:
    terraformVersion: 1.8.3
  pipeline:
    stages:
      - name: TERRAFORM_PLAN
      - name: WAIT_APPROVAL
      - name: TERRAFORM_APPLY
      # ↓↓ここから↓↓
      - name: SCRIPT_RUN
        with:
          # サボってキーをそのまま埋め込んでますが、PipeCDのSecret management機能を使うと良さそうです
          env:
            MACKEREL_APIKEY: "***censored***"
          run: |
            mkr annotations create --title "synced ${SR_APPLICATION_NAME}" --description "${SR_SUMMARY} commit hash:${SR_TRIGGERED_COMMIT_HASH}" -s arthur --from "$SR_TRIGGERED_AT" --to $(date +%s)
  # ↑↑ここまで↑↑
  description: |
    This app demonstrates how to deploy a Terraform resource with a customized pipeline.\
    cf. [adding a new app](https://pipecd.dev/docs/user-guide/managing-application/adding-an-application/), [app configuration](https://pipecd.dev/docs/user-guide/configuration-reference/#terraform-application)

Deploymentが成功しているのを確認したら、Mackerelのサービスページやカスタムダッシュボードページなどで、グラフアノテーションが投稿されているのを眺めましょう。

デプロイメントがトリガーされてから終了するまでの時間や、デプロイしたアプリケーションの名前、commit hashといった情報がアノテーションに含まれていますね。PipeCDがさまざまな環境変数を用意してくれており*3、これを利用するとアノテーションに入れたいテキストや時刻を簡単に組み立てることができます。

メトリックの変化とデプロイイベントを無事視覚的に紐づけることができたところで、今回は以上になります。


明日のMackerel Advent Calendarは id:missasan の記事になります。お楽しみに!