New RelicのリソースをTerraformにインポートするときの注意点

# はじめに
こちらは[New Relic 使ってみた情報をシェアしよう！ by New Relic Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newrelic)の13日目の記事になります。

# 概要
* タイトル通り、TerraformでNew Relicのリソースをインポートする時の注意点について記載いたします。

# 基礎
* [terraform import]というコマンドを実行すると、対象のITリソースの情報をTerraformの管理下におく事が可能です。 参考：[公式サイト](https://developer.hashicorp.com/terraform/cli/import)
* import時に必要な情報は[TerraformのNew Relicプロバイダ](https://registry.terraform.io/providers/newrelic/newrelic/latest/docs)のページに記載されています。
    * 例えば[アラートポリシー](https://registry.terraform.io/providers/newrelic/newrelic/latest/docs/resources/alert_policy#import)の場合は、アラートポリシーのIDとNew RelicアカウントIDが必要と記載されています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/b1455eb1-035a-886a-3347-edf425be49b5.png)

# ※対象New RelicプロバイダのVer.について
* 2024/12/13時点での最新Ver.である[v3.53.0](https://github.com/newrelic/terraform-provider-newrelic/releases/tag/v3.53.0)になります。
    * 本稿では一つ前のVer.のv3.52.1で発生した事象も解説します。
# 注意！
以下のリソースをインポートする際には注意が必要

* ①インポートした値が変。そのままterraform plan (or apply)を実行すると失敗する
    * 対象リソース
        * newrelic_alert_muting_rule
        * [最新Ver.では解消済み]newrelic_synthetics_monitor、newrelic_synthetics_script_monitor
* ②importする時に必要な情報がNew RelicのUI上から取得出来ない
    * 対象リソース
        * newrelic_workload
        * newrelic_service_level
## ①インポートした値が変。そのままterraform plan (or apply)を実行すると失敗する
### ・newrelic_alert_muting_rule
- リソースについて：[MutingRule](https://registry.terraform.io/providers/newrelic/newrelic/latest/docs/resources/alert_muting_rule)
- 事象
    - repeat_countが0と定義されているため、terraform planを実行するとエラーが返ってくる。
        - repeat_countはUI上だと[end repeat]の中のAfter部にあたる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/69b563b3-5bd4-08a9-fef8-f936b030c25f.png)
         - 実際の定義では、Repeatで[Never]を指定しているため、そもそも選択できない項目であるため項目自体が無い or nullが定義されているが正しいと思うが「0」がなぜか入ってきている。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/d3c692c8-9266-f4cc-ee0d-5ae1a653e2c3.png)
- 対応
    - [end repeat]部をコメントアウトするか、値を0からnullに変更するとエラーが回避出来ます。
        - どちらもOKであることは確認していますが、後者が美しいような気がします。

### ・[最新Ver.では解消済み]newrelic_synthetics_monitor、newrelic_synthetics_script_monitor
<details><summary>※v3.52.1で発生した事象で、現最新Ver.[v3.53.0]では解消している事象のため、折りたたみで表示します。</summary>
- 対象：SynetheticsのMonitorリソース(PingMonitor、ScriptAPIなど）
- 原因：冒頭のIssueにも記載されている通り、[locations_public]の値がnullであるため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/e49090e2-add1-15ab-22bf-d955b9c99165.png)
- 対応：
    - 適切なロケーションを手動で定義
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/670eb4a4-d669-d76c-cdc2-078ed0ef0988.png)
</details>

## ②importする時に必要な情報がNew RelicのUI上から取得出来ない
前述の[基礎]部分でも例としてアラートポリシーのインポート方法を記載しておりますが、インポート時の必要な情報はNew RelicのUI上から取得可能です。
ただ、以下のリソースに関しては現状、NerdGraphからじゃないと取得が出来ない様です。。（なんで！？）
NerdGraphの使用方法については[New Relicの公式ドキュメント](https://docs.newrelic.com/jp/docs/apis/nerdgraph/get-started/nerdgraph-explorer/)をご参照ください。

### newrelic_workload
- 対象：[Workloads](https://registry.terraform.io/providers/newrelic/newrelic/latest/docs/resources/workload)
- 公式ドキュメントよりインポートに必要なのは、<アカウントID>:<ワークロードid>:<GUID>との事だが、ワークロードIDは見当たらず・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/960475a0-ad9f-dee9-3518-97507552c600.png)
- 対応
    - NerdGraphにて以下コマンドを実行し、対象のワークロードIDが特定できます。
    
```nerdgraph:Workload IDの特定
        {
        actor {
        account(id: <アカウントID>) {
        workload {
        collection(guid: "<対象ワークロードのGUID>") {
            account {
                id
                }
                id
                name
                guid
                }
            }
        }
    }
}
``` 


- 結果として以下のように[id]部分にてワークロードIDが確認できます。 （値はマスクしてますが実際は数字が表示されます。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/0a975c8b-133d-78e0-800c-e33820d5ee66.png)


### newrelic_service_level
- 対象：[Service Level](https://registry.terraform.io/providers/newrelic/newrelic/latest/docs/resources/service_level)
- 公式ドキュメントよりインポートに必要なのは、<アカウントID>:<サービスレベルid>:<GUID>との事だが、ワークロードと同様にUIからは見つけられず・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/b64e0b94-acf6-cca8-fc52-d582eb974f72.png)

- 対応
    - ワークロードと同様でNerdGraphにて以下コマンドを実行すると、対象のサービスレベルIDが特定できます。
    
```nerdgraph:Service Level IDの特定
{
  actor {
    entity(guid: "<対象サービスレベルのGUID>") {
      serviceLevel {
        indicators {
          guid
          id
          name
        }
      }
    }
  }
}
``` 


- 結果として以下のように[id]部分にてサービスレベルIDが確認できます。 （値はマスクしてますが実際は数字が表示されます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774397/da87f179-7e65-43a4-9836-ca5ce61d628b.png)

# まとめ（という名の感想）
- 基本的には何事もなくimport出来るリソースが多いですが、上記の通り一部「アレ？」と思う事象がある。
    - [Synetheticsの事象もGithubのIssueに挙がっていた内容](https://github.com/newrelic/terraform-provider-newrelic/issues/2768)で今回の最新Ver.で修正されましたので、問題については見つけ次第開発者に共有することが大事だなぁと思いました。（私も後であげておこうと思います。）
- 一部のNewRelicのリソースIDがUIから見えない件は・・何かあるんですかね？[APIキーがUIからコピー出来なくなった](https://newrelic.com/jp/blog/nerdlog/api-key-ui-eol)件と関係ある・・？
- 他、未確認の事象もあるとは思いますが自分自身が把握している内容を共有させていただきました。<br>本稿の内容が皆様のお役に立つ機会があれば幸いです。