👏

DynatraceでMonacoを使って設定をバックアップ・リストア(Configuration as Code)

2024/05/28に公開

概要📝

設定をコード化して管理することを、Configuration as Codeと呼びます
オブザーバビリティツールであるDynatraceで、設定をバックアップ・リストアするオプションとして、MonacoとTerraformがあります
今回はDynatrace純正のツールで、Dynatraceサポートの対象であるMonacoによるバックアップ・リストアの手順について解説します

対象読者🔖

  • Dynatraceの初級者
  • よくわからないけど興味がある方

ゴール🔥

下記を理解している状態

  • Monaco自体のインストール
  • APIを叩くためのDynatrace Accees Tokenの理解
  • MonacoのProjectやManifestなどの基本用語理解
  • Monaco CLI Downloadによるバックアップ
  • Monaco CLI Deployによるリストア

コスト💰

Monacoを使用することによる直接のコストはありません

関連リンク📎

前提🏫

MonacoとTerraformの比較

MonacoとTerraformの比較です
今回はDynatrace純正のツールで、Dynatraceサポートの対象であるMonacoによるバックアップ・リストアの手順について解説します

使用技術 サポート会社 追加課金 メリット デメリット
Monaco Dynatrace - Dynatrace純正でDynatraceのサポート対象
Dynatrace専用なのでシンプルな構造
Dynatrace専用のツール
Terraform HashiCorp ○(プランによる) AWSなど様々なプロバイダーに対応している Dynatrace社からの直接サポートがない

Monacoの主要な用途

  • 誤って設定が失われることを想定して、定期バックアップをとる
  • 上記が実際に起こった際に、リストアして回復する
  • 一時的・実験的に、一部の設定値を変更して、その部分をロールバックする
  • 変更した箇所やリストアしたい箇所の確認作業を行う
    など

新規項目の設定については、MonancoからのデプロイよりもDynatrace画面UIからの設定が推奨されているようです
おそらく、基本的に新規設定や設定変更などは、画面UI上から行う運用が多いと思います

Monaco基本用語

ドキュメント→Monaco基本用語など

とりあえずわかっておくべきなのは、ProjectとManifestです

Project

プロジェクトは、API 構成を論理的にグループ化するために使用されるディレクトリ (フォルダー) です。

Downloadコマンドでバックアップする際は、基本プロジェクトは気にしないです
Deployコマンドでリストアする際には、Projectと呼ばれるディレクトリを指定して、その配下にある設定ファイルをいっぺんにデプロイします

Manifest

デプロイメント マニフェストは、Dynatrace Monaco CLI にどのプロジェクトをデプロイするか、そして正確にどこにデプロイするかを指示する YAML ファイルです。 Dynatrace Monaco CLI が何をデプロイするかを認識するには、マニフェスト ファイルが存在する必要があります。

要するに、下記を指示するためのファイルです

  • どのDynatrace Environmentからダウンロード・デプロイするか
  • どのProjectをデプロイするか

手順 - 初期設定👓

Monacoのインストール

下記ドキュメントに従って、Monacoをインストールしてください
Monacoインストール手順など

インストールしてパスを通したら、下記のコマンドでMonacoが有効化されていることを確認

monaco version

monacoのversionが表示されればOK

Access Tokenの発行

Access token
APIを叩くのに必要な権限など
補足💡Personal Access Tokenを管理者が有効化している場合には使用可能ですので、必要に応じてこちらでもよいと思います

Admin権限を持っているユーザーで、Dynatrace画面からAccess tokenを作成
Dynatrace Top > 検索窓にAccess token > 設定-Integration-Access tokens > To create an access token go to Access tokensのリンクをクリック
新規トークンの生成から、Download・Deploy用のトークンを生成します
権限を分けない場合は、Deploy用のみ生成すればDownloadも可能です

Access token生成に必要な権限

Access token生成にはAdmin権限が必要とドキュメントに記載がありますが、Dynatraceには「Admin」という名前の権限はありません
サポートへ問い合わせたところ、下記の権限を持って入れば良いそうです
これはデフォルトで用意されているすべてのGroupです

Account manager
Account viewer
Confidential data admin
Default group with all users
Deployment admin
Finance admin
Log viewer
Monitoring admin
Monitoring viewer
Security admin

Download用トークンの権限例

Access problem and event feed, metrics, and topology
Read configuration
Read settings
Read network zones
Read SLO

Deploy用トークンの権限例

一度現状の設定を読み込んでから、書き込みを行っているようなので、Read権限も必要です
Access problem and event feed, metrics, and topology
Read configuration
Read settings
Read network zones
Read SLO
Write configuration
Write settings
Write SLO

トークンを生成時にのみトークンシークレットが表示されるので、忘れずにコピーしておいてください

Monaco用ディレクトリの作成

例として下記のように作成してみましょう
manifest.yamlは現状は空で問題ないです

Monaco/
    download/
        manifest.yaml
    restore/
        manifest.yaml

手順 - バックアップ(Downloadコマンド)👓

Download用のManifestファイルを用意する

Monaco/download/manifest.yamlを下記のように記載

manifestVersion: 1.0

projects:

environmentGroups:
- name: dev
  environments:
  - name: dev
    url:
      value: https://your_env_id.live.dynatrace.com
    auth:
      token:
        name: readToken

your_env_idは、DynatraceのあるEnvironmentへアクセスする際のURLです
readTokenはあとで使用する環境変数の名前です

コマンド実行

Manifestファイルのディレクトリへ移動

cd path_to_your/Monaco/download

環境変数に、先ほどコピーしたトークンシークレットを代入
download用のトークンを環境変数に入れます

$env:readToken="YourTokenValue"

downloadコマンドを実行

monaco download -m manifest.yaml -e dev

上記だと、権限の範囲で取得可能なすべてのファイルを、現在のディレクトリ配下にダウンロードします
その他に利用可能なオプションはこちら
実行結果の確認
下記のようにダウンロードされます
project_dev配下に、設定項目ごとのjsonファイルとconfing.yamlがダウンロードされています

Monaco/
    download/
        manifest.yaml
        logs/
        download_yyyy_mm_dd_hhmmss/
            project_dev/
                builtinalerting.plofile/
                    xxx.json
                    config.yaml
                ...
一部バックアップをおすすめしない理由

-a-sの引数を使うと、指定した設定項目のみを一部バックアップすることができます
しかし、これは使いづらくおすすめしません
このあと行うリストアにおいて、たとえばdashboardのリストアを行う場合、依存関係のある別の設定項目と一緒にデプロイする必要があります
依存関係のある設定項目が欠けていると、一部しかリストアされなかったり、リストアができなかったりすることがあります
依存関係をあらかじめ間違いなく把握しておけばいいのですが、全部バックアップのみを行っておく方が無難だと思います

手順 - リストア(deployコマンド)👓

Deploy用のManifestファイルを用意する

Monaco/download/manifest.yamlを下記のように記載

manifestVersion: 1.0

projects:
  - name: restore_dashboard_20240524
    path: ./restore_dashboard_20240524

environmentGroups:
- name: dev
  environments:
  - name: dev
    url:
      value: https://your_env_id.live.dynatrace.com
    auth:
      token:
        name: writeToken

リストア用のProject(ディレクトリ)にリストアしたい設定項目を入れる

今回はあるダッシュボードを誤って削除してしまったという想定でやってみます
同じように行う方は、まず現状のバックアップをとったうえで、ダッシュボードクラシック画面のダッシュボードをひとつ削除してみてください(あとでリストアしますが、テスト用のものだと安全です)

dashboardのconfig.yamlを見ると、下記のように書いてあります
経験則からいくとparameters以下の、configType: calculated-metrics-application-webが依存関係のある設定項目ファイルです

configs:
- id: xxxxxxx-fd41-4392-be2c-f5c95c5042c8
  config:
    name: New dashboard (Jan 19, 2024 17:54:13)
    parameters:
      calculatedmetricsapplicationweb__calcappswebeasytravelbookingsrevenue__id:
        configId: calc:apps.web.easytravel.bookingsrevenue
        configType: calculated-metrics-application-web
        property: id
        type: reference
    ...
    ...

なので、今回は下記のようにリストア用のprojectを構成します
つまり、リストアしたい時点のバックアップからdashboardcalculated-metrics-application-webをコピーしてくるということです
その配下にはもちろん、jsonとconfig.yamlが入っています

Monaco/
    restore/
        manifest.yaml
        restore_dashboard_20240524/
            dashboard/
            calculated-metrics-application-web/

コマンド実行

Manifestファイルのディレクトリへ移動

cd path_to_your/Monaco/restore

環境変数に、先ほどコピーしたトークンシークレットを代入
deploy用のトークンを環境変数に入れます

$env:writeToken="YourTokenValue"

dry runモードでdeployコマンドを実行

monaco deploy manifest.yaml -p restore_dashboard_20240524 -d

logs配下のerrorログを見て、エラーが出ていないことを確認してください
たとえば、依存関係のあるファイルが一緒にデプロイされていない場合、そこに一緒にデプロイすべき項目がエラーとして記載されています
dry runでエラーログが空になってからdeployを実行したほうが、デプロイの失敗や一部だけデプロイされるといった事態を避けることができます

dry runでエラーログが空になってから、deployコマンドを実行

monaco deploy manifest.yaml -p restore_dashboard_20240524

実行結果の確認
今回はあるダッシュボードを誤って削除してしまったという想定でしたので、コマンド実行前にDynatraceのダッシュボードクラシックで削除したダッシュボードが、リストアされていることを確認してください

さいごに

何か気づきがあった場合は、更新いたします

Discussion