🐕

既存のDatadogの設定をTerraform管理下に追加する

2022/08/10に公開

Terraform では provider 経由で様々なクラウドサービスの設定を管理することができます。
AWS や Azure などがよく知られていますが、監視サービスとして有名な Datadog についても設定を terraform で管理することができます。

そして、イチから Terraform の設定を記述する以外の方法として、Datadog に設定済みの内容を terraform の設定ファイルに取り込む、という事もできます。
Datadog はサイトの GUI 上から duck typing 的に設定を色々試して動作確認しながら設定するほうが楽なケースも多いため、先に Datadog で色々設定をしてみて、その内容を terraform に取り込む、という方法が取れると便利なケースもあると思います。

ただ、terraform に取り込む手順は少し複雑になります。

terraform import に関する大まかな手順については、以下は AWS を例にしてはいますが以下の Qiita などが参考になります。
https://qiita.com/moaikids/items/d11dee96c8d68262098b

ここでは datadog_monitor の import の手順について記載します。

datadog_monitor import

1.backend を一時的に local に切り替える

terraform の実行結果は、tfstate というファイルに管理されます。
現在は S3 上に保存するようにしていますが、import処理については即時反映されると少し面倒なことになることもあるため、いったん local で作業を閉じられるように、backend の設定を変更します。
(以下をコメントアウト)

#  backend "s3" {
#    bucket = "openlogi-terraform"
#    key    = "datadog/terraform.tfstate"
#    region = "ap-northeast-1"
#  }

2.terraform init

backend を切り替えた後に terraform init コマンドを実行すると、切り替え先の backend に現在の tfstate をコピーするか否かを尋ねるメッセージが表示されます。

% terraform init -migrate-state
Initializing the backend...
Terraform has detected you're unconfiguring your previously set "s3" backend.
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "s3" backend to the
  newly configured "local" backend. No existing state was found in the newly
  configured "local" backend. Do you want to copy this state to the new "local"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: yes

こちらに対して yes とタイプすると、切り替え先の backend (local) に tfstate ファイルがコピーされます。
これを踏まえて、ローカルで imprt 作業を進めていきます。

3. monitor の id を控える

dog コマンドを使用して、登録されている monitor の id を含む様々な情報を取得できます。

$ dog --raw monitor show_all | jq . | head -n 10
[
  {
    "restricted_roles": null,
    "tags": [],
    "deleted": null,
    "query": "\"ntp.in_sync\".over(\"*\").last(2).count_by_status()",
    "message": "Triggers if any host's clock goes out of sync with the time given by NTP. The offset threshold is configured in the Agent's `ntp.yaml` file.\n\nPlease read the [KB article](https://docs.datadoghq.com/agent/faq/network-time-protocol-ntp-offset-issues) on NTP Offset issues for more details on cause and resolution.",
    "matching_downtimes": [],
    "id": 25224802,
    "multi": true,

datadog monitor の import には id の情報が必要なので、こちらを控えておきます。
設定ファイルの定義の際に id に紐づく名前の設定も必要なので、id に対応してどのような名前付けをするかもあわせて控えておきます。

4. terraform import (1回目)

以下のコマンドで、既存の設定の import を試みます。

# terraform import datadog_monitor.(name) (id)
% terraform import datadog_monitor.sada 25224802

ただし一回目は以下のようなエラーが表示されます。

Error: resource address "datadog_monitor.sada" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "datadog_monitor" "sada" {
  # (resource arguments)
}

terraform import を行うためには、手元の tf ファイルに、当該リソースの設定が含まれている必要があります。
なので上記で sample として表示される構文を、次のステップで設定ファイルに記述します。

5. resource の定義を tf ファイルに記述

任意の tf ファイルに、上記で表示されたサンプルの内容を記述します。

resource "datadog_monitor" "sada" {
  # (resource arguments)
}

6. terraform import (2回目)

再度 terraform import を実施すると、tfstate に Datadog の情報がインポートされます。

% terraform import datadog_monitor.sada 25224802
datadog_monitor.sada: Importing from ID "25224802"...
datadog_monitor.sada: Import prepared!
  Prepared datadog_monitor for import
datadog_monitor.sada: Refreshing state... [id=25224802]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

7. terraform state show

tfstate に import した設定情報は、 terraform state show コマンドを実行することで 、 tfstate に import した情報を tf ファイル形式に変換して表示してくれます。
ここで表示された内容を、 5. で記述した設定を上書きして保存します。

% terraform state show datadog_monitor.sada
# datadog_monitor.sada:
resource "datadog_monitor" "sada" {
    evaluation_delay     = 0
    id                   = "25224802"
(snip.)

    monitor_thresholds {
        critical = "1"
        ok       = "1"
        warning  = "1"
    }
}

ただ、一部の値は read only であったり、deprecated であったりするので、 terraform plan を実行しながら修正をしていきます。

8. terraform plan

Datadog と tf ファイルの差分があるかないかを確認するために terraform plan で確認を行います。

% terraform plan
╷
│ Warning: Argument is deprecated
│ 
│   with datadog_monitor.sada,
│   on sada.tf line 5, in resource "datadog_monitor" "sada":
│    5:     locked               = false
│ 
│ Use `restricted_roles`.
╵
╷
│ Error: Invalid or unknown key
│ 
│   with datadog_monitor.sada,
│   on sada.tf line 3, in resource "datadog_monitor" "sada":
│    3:     id                   = "25224802"
│ 
╵

上記のように Error が発生する場合は、その箇所を直していきます。
これらの作業を、 terraform plan の実行結果で差分がなくなるまで行っていきます。

9.backend を S3 に戻す

1.でコメントアウトした設定を元に戻します。

10.terraform init

S3 に backend を戻した上で terraform init を実行すると、S3 にローカルの tfstate ファイルをコピーするかどうか尋ねられますので、yes を入力します。

Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "local" backend to the
  newly configured "s3" backend. An existing non-empty state already exists in
  the new backend. The two states have been saved to temporary files that will be
  removed after responding to this query.
  
  Previous (type "local"): /var/folders/x8/tb2512ds4832j6m84d03fvq80000gp/T/terraform1436965977/1-local.tfstate
  New      (type "s3"): /var/folders/x8/tb2512ds4832j6m84d03fvq80000gp/T/terraform1436965977/2-s3.tfstate
  
  Do you want to overwrite the state in the new backend with the previous state?
  Enter "yes" to copy and "no" to start with the existing state in the newly
  configured "s3" backend.

  Enter a value: yes
(snip.)

11.terraform plan

念の為、backend を S3 に戻した後も意図した差分になっているか、 terraform plan で確認します。

以上で import 作業は完了ですが、結構面倒くさいですね。

Terraform による Datadog 管理も運用が回るようになれば既存の設定ファイルを参考にコピペ的に対応できることもできると思います。そこにたどり着くまでは、上記のような手段を用いて、既存の Datadog の設定を Terraform に取り込む、という手段も一つの選択肢にあると良いかなとは思います。

Discussion