【IBM Cloud】 Log AnalysisからCloud Logsへのマイグレーションの流れ

## はじめに
2024年6月頃、IBM Cloudでは既存の監視ツールであるLog AnalysisとActivity Trackerの後継サービスであるIBM Cloud LogsをFrankfurtとMadridリージョンにGAし、2024年9月にはTokyoとOsakaリージョンでGAされました。
そのため、既存のLog AnalysisとActivity Trackerのインスタンスを後継のCloud Logsに移行する検証を行いました。

今回はLog AnalysisからCloud Logsへのマイグレーションの流れを整理しています。
参考としてCloud Logs Routingを設定する流れを整理した[こちらの記事](https://qiita.com/Sungyun_Moon/private/1a51879fd2fd478ec84d)もご確認ください。

:::note warn
Log AnalysisとActivity Trackerは2025年3月30日でEOSされる予定です。
そのため、EOSまでに既存インスタンスのマイグレーションが必要となりますので、ご注意ください。
:::

Log AnalysisやActivity TrackerからCloud Logsへのマイグレーションには、以下の項目の移行が可能です。

- カテゴリ（リソースグループ）の移行
- ビューとアラートの移行
- ダッシュボードと画面の移行
- 除外ルールの移行
- 解析ルールの移行
- データ使用量の移行
- アーカイブ設定の移行

また、今回の内容にはIBM Cloudの[アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts)（無料利用可能）が前提となっています。


## マイグレーションの流れ
### IBM Cloudへログイン
後述しますが、マイグレーションはコマンドベースの`Migration Tool`を使って行います。
そのため、まずはターミナルにてIBM Cloudにログインします。ログインはCLIを使用したログインが便利です。
右上のプロフィールアイコンにて`CLIとAPIにログイン`をクリックし、IBM Cloud CLIをコピーします。その後、IBM Cloud CLIをターミナルに入力します。
また、検証の時点ではまだ国内リージョンがGAされる前だったため、今回はリージョンをCloud LogsインスタンスのFrankfurt（eu-de）に設定しました。
![スクリーンショット 2023-01-27 14.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/85389613-4b70-eda8-43d4-a0da1211064c.png)
![スクリーンショット 2023-01-27 14.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/04c3ad3e-31da-6abc-804c-506a5536429d.png)

```shell:結果
moonsy@moon ~ % ibmcloud login -a https://cloud.ibm.com -u passcode -p xxxxxxxxxx
API エンドポイント: https://cloud.ibm.com
認証中です...
OK

ターゲットのアカウント xxxxxxxx (xxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx


リージョンを選択します (または Enter キーを押してスキップします):
1. au-syd
2. in-che
3. jp-osa
4. jp-tok
5. eu-de
6. eu-es
7. eu-gb
8. ca-tor
9. us-south
10. us-south-test
11. us-east
12. br-sao
数値を入力してください> 5
ターゲットのリージョン eu-de

                      
API エンドポイント:   https://cloud.ibm.com
Region:               eu-de
ユーザー:             xxxxxxxxx@ibm.com
アカウント:           xxxxxxxx (xxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx
リソース・グループ:   リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
```

### Logging CLIのインストール
上記の通り、今回Log AnalysisやActivity TrackerからCloud Logsへのマイグレーションは`logging`コマンドにて実行したためインストールが必要となります。
もし`logging`コマンドがインストールされていない場合は、Cloud Logのコマンドを使用するために以下のコマンドにてLogging CLIをインストールします。
```shell:Logging CLIのインストール
ibmcloud plugin install logging
```
```shell:結果
moonsy@moon ~ % ibmcloud plugin install logging
リポジトリー 'IBM Cloud' から 'logging' を検索しています...
プラグイン 'logging 0.1.11' がリポジトリー 'IBM Cloud' 内で見つかりました
バイナリー・ファイルをダウンロードしようとしています...
 17.65 MiB / 17.65 MiB [===========================================================================================================] 100.00% 0s
18507186 バイトがダウンロードされました
バイナリーをインストールしています...
OK
プラグイン 'logging 0.1.11' は /Users/moonsungyun/.bluemix/plugins/logging に正常にインストールされました。 'ibmcloud plugin show logging' を使用して詳細を表示してください。
```

### 既存インスタンスのCRN確認とアプリケーションログ+操作ログを収集するインスタンスの移行手順
まずTerraformスクリプトを適用するには、 IBM Cloud Logsのインスタンスを作成および管理する権限を持つAPIキーを使用してキーをExportする必要があります。そのため、IBM CloudのAPIキーを作成します。
ダッシュボードにて`管理`→`アクセス（IAM）`をクリックします。
![スクリーンショット 2024-09-13 15.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/78d49985-f58c-48e1-35fb-6b7fe35820a0.png)
`APIキー`カテゴリーにて`作成`をクリックします。
![スクリーンショット 2024-09-13 15.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8c7a70d9-e90c-8245-eb36-3509f90e2166.png)
APIの設定を行い、`作成`をクリックします。
![スクリーンショット 2024-09-13 15.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/1eb150c5-e8e9-e81c-1cb2-5d29a2748f20.png)
APIが作成されたら`コピー`ボタンにて書き置きします。
![スクリーンショット 2024-09-13 15.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8baf5b55-3ee4-b997-571a-ac77650d768a.png)

その後、上記の通りTerraformスクリプトを適用するために、ターミナルにてAPIキーをexportします。
```
export IC_API_KEY="作成したAPIキー"
```
:::note warn

APIは有効期限があまり長くなく、都度生成して利用する必要があるため、もし以下のようにAPI関連のエラーが出た場合には、新たにAPIを作成してください。
```
ibm_resource_instance.cloud_logs_instance: Creating...

│ Error: [ERROR] Error occured while configuring Resource Catalog service: "Request failed with status code: 400, BXNIM0415E: Transaction-Id:[xxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] Provided API key could not be found"
```
:::

次は、インスタンスCRNを確認しますが、`logging`コマンドにて実施するマイグレーション作業には既存のLog Analysisインスタンスと新規のCloud LogsのインスタンスCRNを入力して行うため、確認が必要となります。
既存のLog Analysisインスタンスに入り、CRNをコピーし書き置きします。
![スクリーンショット 2024-07-11 18.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/46599860-0566-3a65-0f70-6f39c2b8b892.png)
![スクリーンショット 2024-07-11 18.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/a63d8efd-659e-51e0-090c-2b2843988fe8.png)

 
ターミナルにて以下のコマンドを入力します。こちらのコマンドは、移行ツールを使用してインスタンスを移行し、後でカスタマイズして適用できる Terraform スクリプトを生成するコマンドです。[CRN]部分に上記でコピーしたCRNを置き換えます。

```
ibmcloud logging migrate create-resources --scope instance --instance-crn [CRN] --terraform -f
```

```shell:結果
moonsy@moon ~ % ibmcloud logging migrate create-resources --scope instance --instance-crn xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --terraform -f

プラグイン 'logging 0.1.12' が現在使用可能です (0.1.11 をご利用中です)。
'ibmcloud plugin update logging' を使用してプラグインをアップグレードしてください。
更新チェックを無効にするには 'ibmcloud config --check-version=false' を使用してください。

Do you want to continue the creation of cloud logs instances now.(enter yes/y to procceed or enter no/n to ignore)> yes
OK
t_output_migration_collection_successfully
%!(EXTRA string=/Users/moonsungyun)% 
```

また、上記のコマンド以外にも、必要に応じて以下のコマンドを使って移行を実施することも可能です。

・移行ツールを使用してインスタンスを自動的に移行できるコマンド
```
ibmcloud logging migrate create-resources --scope instance --instance-crn [CRN] --api
```
・移行ツールを使用して Terraform スクリプトを生成および適用することでインスタンスを移行するコマンド
```
ibmcloud logging migrate create-resources --scope instance --instance-crn [CRN] --terraform -f
```
また、今までのコマンドでのマイグレーションが失敗した場合、以下のコマンドにてマイグレーションを実施することができました。

:::note warn
```shell:上記のコマンドで失敗した例
moonsy@moon ~ % ibmcloud logging migrate create-resources --scope instance --instance-crn crn:v1:bluemix:public:xxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxx:xxxxxxxxxx --api
FAILED
t_output_migrate_failed t_get_instance_failed%!(EXTRA *errors.errorString=t_archive_not_found)
```
:::

・Terraform を生成して、アカウント内のすべての IBM Log Analysis および IBM Cloud Activity Tracker インスタンスをマイグレーションし、DIRECTORY で指定されたディレクトリーにマイグレーション・ファイルを書き込むコマンド
```
ibmcloud logging migrate generate-terraform --scope account --directory DIRECTORY
```
```shell:結果
moonsy@moon ~ % ibmcloud logging migrate generate-terraform --scope account --directory xxxxxxxxxx_xxxxxxx_xxxxxxx
OK
t_output_migration_collection_successfully
%!(EXTRA string=IBM)%   
```
・Terraform を生成して、アカウント内のすべての IBM Log Analysis および IBM Cloud Activity Tracker インスタンスをマイグレーションするコマンド
```
ibmcloud logging migrate generate-terraform --scope account
```
```shell:結果
moonsy@moon ~ % ibmcloud logging migrate generate-terraform --scope account
t_migration_path_exists ()> xxxxxxx@ibm.com
OK
t_output_migration_collection_successfully
%!(EXTRA string=/Users/moonsungyun)%   
```

コマンドが成功したら、`/migration-tool/cl/accountID/instanceID/service-type/terraform/tf-directory/`に既存Log Analysisのデータがexportされています。
![スクリーンショット 2024-09-13 16.00.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/014db1dc-5c95-8d80-e792-5afdd62d954c.png)

:::note alert
2024年9月13日現在、上記設定データのexportは可能なものの、migration toolでの設定importがまだできないと確認しました。いつmigration toolが使えるようになるかは未定のため、確認できましたら追記します。
:::
上記の通り、現在Migration Toolが利用できないため、今回のインスタンス作成には、Exportされたjsonファイルを開き、手作業でリージョンを書き換えるなどで実施しました。
```shell:例
[
  {
    "controlled_by": "",
    "id": "xxxxxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxxxxxx",
    "locked": false,
    "name": "IBM Log Analysis - Osaka Platform",
    "parameters": {
      "default_receiver": true
    },
    "region": "jp-tok" → "eu-de", ＜ここ
    "resource_group": "6370a14a3d1a40078c42c9408193ee9e",
    "service_instance_crn": "crn:v1:bluemix:public:logdna:jp-tok:a/6a31b82b4f93471f96e9ed0afc261057:af3553fd-dca2-48f7-b287-002c35d6ff2a::",
    "service_tags": [
      "schematics::offering_id:xxxxxxxxxxx-ea90-4ebe-8d3b-xxxxxxxxxxx.xxxxxxxxxxx-4266-4a41-bb8f-xxxxxxxxxxx",
      "schematics::offering_name:iks-integration",
      "schematics::offering_version:1.4.4",
      "schematics:terraform_v1.1",
      "schematics:us-south.workspace.iks_-_cluster_integrations.xxxxxxxxxxx",
      "schematics:us-south.workspace.iks_-_cluster_integrations.xxxxxxxxxxx",
      "schematics:us-south.workspace.iks_-_cluster_integrations.xxxxxxxxxxx"
    ],
    "tags": [
      "common"
    ],
    "type": "service_instance"
  }
]
```

## Terraformを使ったCloud Logsのインスタンス作成
Cloud LogsではTerraformに基づいてインスタンスを作成することも可能です。現時点では設定のマイグレーションが完全に適用されないため、インスタンス作成自体はコンソールUI上で行った方が効率的ですが、今後Migration Toolが完成されたらインスタンス作成と設定移行が同時に行われる楽なコマンドですので、ご参考にしていただければと思います。

ターミナルにて、
ワークスペースを初期化するコマンドである、
```
terraform init
```
Terraform による実行計画を参照するコマンドである、
```
terraform plan
```
planで参照したリソースやインスタンスを作成するコマンドである、
```
terraform apply
```
のコマンドを順番に入力します。

```shell:init
moonsy@moon la-IBM Log Analysis-Osaka-1-jp-osa % terraform init
```
```shell:init結果
Initializing the backend...

Initializing provider plugins...
- Finding ibm-cloud/ibm versions matching "1.67.1"...
- Installing ibm-cloud/ibm v1.67.1...
- Installed ibm-cloud/ibm v1.67.1 (self-signed, key ID XXXXXXXXXXXXXX)

Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```
```shell:plan
moonsy@moon la-IBM Log Analysis-Osaka-1-jp-osa % terraform plan
```
```shell:plan結果
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # ibm_iam_authorization_policy.policy-1722498751568646 will be created
  + resource "ibm_iam_authorization_policy" "policy-1722498751568646" {
      + description                 = "created by migration-tool"
      + id                          = (known after apply)
      + roles                       = [
          + "Sender",
        ]
      + source_resource_group_id    = (known after apply)
      + source_resource_instance_id = (known after apply)
      + source_resource_type        = (known after apply)
      + source_service_account      = (known after apply)
      + source_service_name         = "logs-router"
      + target_resource_group_id    = (known after apply)
      + target_resource_instance_id = (known after apply)
      + target_resource_type        = (known after apply)
      + target_service_name         = "logs"
      + transaction_id              = (known after apply)
      + version                     = (known after apply)
    }

  # ibm_resource_instance.cloud_logs_instance will be created
  + resource "ibm_resource_instance" "cloud_logs_instance" {
      + account_id              = (known after apply)
      + allow_cleanup           = (known after apply)
      + created_at              = (known after apply)
      + created_by              = (known after apply)
      + crn                     = (known after apply)
      + dashboard_url           = (known after apply)
      + deleted_at              = (known after apply)
      + deleted_by              = (known after apply)
      + extensions              = (known after apply)
      + guid                    = (known after apply)
      + id                      = (known after apply)
      + last_operation          = (known after apply)
      + location                = "jp-osa"
      + locked                  = (known after apply)
      + name                    = "IBM Log Analysis-Osaka-1"
      + plan                    = "standard"
      + plan_history            = (known after apply)
      + resource_aliases_url    = (known after apply)
      + resource_bindings_url   = (known after apply)
      + resource_controller_url = (known after apply)
      + resource_crn            = (known after apply)
      + resource_group_crn      = (known after apply)
      + resource_group_id       = "6370a14a3d1a40078c42c9408193ee9e"
      + resource_group_name     = (known after apply)
      + resource_id             = (known after apply)
      + resource_keys_url       = (known after apply)
      + resource_name           = (known after apply)
      + resource_plan_id        = (known after apply)
      + resource_status         = (known after apply)
      + restored_at             = (known after apply)
      + restored_by             = (known after apply)
      + scheduled_reclaim_at    = (known after apply)
      + scheduled_reclaim_by    = (known after apply)
      + service                 = "logs"
      + service_endpoints       = (known after apply)
      + state                   = (known after apply)
      + status                  = (known after apply)
      + sub_type                = (known after apply)
      + tags                    = [
          + "24fae5ab-1721-4669-a1fb-756d2585d2ca",
          + "common",
        ]
      + target_crn              = (known after apply)
      + type                    = (known after apply)
      + update_at               = (known after apply)
      + update_by               = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
```
```shell:apply
moonsy@moon la-IBM Log Analysis-Osaka-1-jp-osa % terraform apply
```
```shell:apply結果
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # ibm_iam_authorization_policy.policy-1722498751568646 will be created
  + resource "ibm_iam_authorization_policy" "policy-1722498751568646" {
      + description                 = "created by migration-tool"
      + id                          = (known after apply)
      + roles                       = [
          + "Sender",
        ]
      + source_resource_group_id    = (known after apply)
      + source_resource_instance_id = (known after apply)
      + source_resource_type        = (known after apply)
      + source_service_account      = (known after apply)
      + source_service_name         = "logs-router"
      + target_resource_group_id    = (known after apply)
      + target_resource_instance_id = (known after apply)
      + target_resource_type        = (known after apply)
      + target_service_name         = "logs"
      + transaction_id              = (known after apply)
      + version                     = (known after apply)
    }

  # ibm_resource_instance.cloud_logs_instance will be created
  + resource "ibm_resource_instance" "cloud_logs_instance" {
      + account_id              = (known after apply)
      + allow_cleanup           = (known after apply)
      + created_at              = (known after apply)
      + created_by              = (known after apply)
      + crn                     = (known after apply)
      + dashboard_url           = (known after apply)
      + deleted_at              = (known after apply)
      + deleted_by              = (known after apply)
      + extensions              = (known after apply)
      + guid                    = (known after apply)
      + id                      = (known after apply)
      + last_operation          = (known after apply)
      + location                = "eu-de"
      + locked                  = (known after apply)
      + name                    = "IBM Cloud Logs eu-de-test"
      + plan                    = "standard"
      + plan_history            = (known after apply)
      + resource_aliases_url    = (known after apply)
      + resource_bindings_url   = (known after apply)
      + resource_controller_url = (known after apply)
      + resource_crn            = (known after apply)
      + resource_group_crn      = (known after apply)
      + resource_group_id       = "6370a14a3d1a40078c42c9408193ee9e"
      + resource_group_name     = (known after apply)
      + resource_id             = (known after apply)
      + resource_keys_url       = (known after apply)
      + resource_name           = (known after apply)
      + resource_plan_id        = (known after apply)
      + resource_status         = (known after apply)
      + restored_at             = (known after apply)
      + restored_by             = (known after apply)
      + scheduled_reclaim_at    = (known after apply)
      + scheduled_reclaim_by    = (known after apply)
      + service                 = "logs"
      + service_endpoints       = (known after apply)
      + state                   = (known after apply)
      + status                  = (known after apply)
      + sub_type                = (known after apply)
      + tags                    = [
          + "24fae5ab-1721-4669-a1fb-756d2585d2ca",
          + "common",
        ]
      + target_crn              = (known after apply)
      + type                    = (known after apply)
      + update_at               = (known after apply)
      + update_by               = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

ibm_resource_instance.cloud_logs_instance: Creating...
ibm_resource_instance.cloud_logs_instance: Still creating... [10s elapsed]
ibm_resource_instance.cloud_logs_instance: Still creating... [20s elapsed]
ibm_resource_instance.cloud_logs_instance: Still creating... [30s elapsed]
ibm_resource_instance.cloud_logs_instance: Still creating... [40s elapsed]
ibm_resource_instance.cloud_logs_instance: Still creating... [50s elapsed]
ibm_resource_instance.cloud_logs_instance: Creation complete after 55s [id=crn:v1:bluemix:public:logs:eu-de:a/6a31b82b4f93471f96e9ed0afc261057:a559d1d0-ec18-43c7-858b-584064dabb1f::]
ibm_iam_authorization_policy.policy-1722498751568646: Creating...
ibm_iam_authorization_policy.policy-1722498751568646: Creation complete after 4s [id=6b4417f7-90dc-49e2-8311-1a835c70f43b]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```
また、Terraformの楽な点として、Terraformでapplyしたインスタンスはdestroyコマンドで一気に削除することも可能です。
```shell:destroy
moonsy@moon la-IBM Log Analysis-Osaka-1-jp-osa % terraform destory
```
```shell:destroy結果
Terraform has no command named "destory". Did you mean "destroy"?

To see all of Terraform's top-level commands, run:
  terraform -help

moonsy@moon la-IBM Log Analysis-Osaka-1-jp-osa % terraform destroy
ibm_resource_instance.cloud_logs_instance: Refreshing state... [id=crn:v1:bluemix:public:logs:eu-de:a/6a31b82b4f93471f96e9ed0afc261057:a559d1d0-ec18-43c7-858b-584064dabb1f::]
ibm_iam_authorization_policy.policy-1722498751568646: Refreshing state... [id=6b4417f7-90dc-49e2-8311-1a835c70f43b]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # ibm_iam_authorization_policy.policy-1722498751568646 will be destroyed
  - resource "ibm_iam_authorization_policy" "policy-1722498751568646" {
      - description                 = "created by migration-tool" -> null
      - id                          = "6b4417f7-90dc-49e2-8311-1a835c70f43b" -> null
      - roles                       = [
          - "Sender",
        ] -> null
      - source_service_account      = "6a31b82b4f93471f96e9ed0afc261057" -> null
      - source_service_name         = "logs-router" -> null
      - target_resource_instance_id = "a559d1d0-ec18-43c7-858b-584064dabb1f" -> null
      - target_service_name         = "logs" -> null
      - transaction_id              = "39a28e55f604464f825e007a3b083021" -> null

      - resource_attributes {
          - name     = "accountId" -> null
          - operator = "stringEquals" -> null
          - value    = "6a31b82b4f93471f96e9ed0afc261057" -> null
        }
      - resource_attributes {
          - name     = "serviceInstance" -> null
          - operator = "stringEquals" -> null
          - value    = "a559d1d0-ec18-43c7-858b-584064dabb1f" -> null
        }
      - resource_attributes {
          - name     = "serviceName" -> null
          - operator = "stringEquals" -> null
          - value    = "logs" -> null
        }
    }

  # ibm_resource_instance.cloud_logs_instance will be destroyed
  - resource "ibm_resource_instance" "cloud_logs_instance" {
      - account_id              = "6a31b82b4f93471f96e9ed0afc261057" -> null
      - allow_cleanup           = false -> null
      - created_at              = "2024-08-07T07:34:57.431Z" -> null
      - created_by              = "IBMid-665001UVGE" -> null
      - crn                     = "crn:v1:bluemix:public:logs:eu-de:a/6a31b82b4f93471f96e9ed0afc261057:a559d1d0-ec18-43c7-858b-584064dabb1f::" -> null
      - dashboard_url           = "https://cloud.ibm.com/observe/logging/a559d1d0-ec18-43c7-858b-584064dabb1f/overview" -> null
      - extensions              = {
          - "external_api"                                     = "a559d1d0-ec18-43c7-858b-584064dabb1f.api.eu-de.logs.cloud.ibm.com"
          - "external_api_private"                             = "a559d1d0-ec18-43c7-858b-584064dabb1f.api.private.eu-de.logs.cloud.ibm.com"
          - "external_dashboard"                               = "https://dashboard.eu-de.logs.cloud.ibm.com/a559d1d0-ec18-43c7-858b-584064dabb1f/#/dashboard"
          - "external_ingress"                                 = "a559d1d0-ec18-43c7-858b-584064dabb1f.ingress.eu-de.logs.cloud.ibm.com"
          - "external_ingress_private"                         = "a559d1d0-ec18-43c7-858b-584064dabb1f.ingress.private.eu-de.logs.cloud.ibm.com"
          - "retention_period"                                 = "7"
          - "virtual_private_endpoints.dns_domain"             = "private.eu-de.logs.cloud.ibm.com"
          - "virtual_private_endpoints.dns_hosts.#"            = "2"
          - "virtual_private_endpoints.dns_hosts.0"            = "a559d1d0-ec18-43c7-858b-584064dabb1f.ingress"
          - "virtual_private_endpoints.dns_hosts.1"            = "a559d1d0-ec18-43c7-858b-584064dabb1f.api"
          - "virtual_private_endpoints.endpoints.#"            = "3"
          - "virtual_private_endpoints.endpoints.0.ip_address" = "10.12.143.50"
          - "virtual_private_endpoints.endpoints.0.zone"       = "eu-de-1"
          - "virtual_private_endpoints.endpoints.1.ip_address" = "10.12.144.49"
          - "virtual_private_endpoints.endpoints.1.zone"       = "eu-de-2"
          - "virtual_private_endpoints.endpoints.2.ip_address" = "10.12.145.49"
          - "virtual_private_endpoints.endpoints.2.zone"       = "eu-de-3"
          - "virtual_private_endpoints.origin_type"            = "vpc"
          - "virtual_private_endpoints.ports.#"                = "3"
          - "virtual_private_endpoints.ports.0.port_max"       = "443"
          - "virtual_private_endpoints.ports.0.port_min"       = "443"
          - "virtual_private_endpoints.ports.1.port_max"       = "3443"
          - "virtual_private_endpoints.ports.1.port_min"       = "3443"
          - "virtual_private_endpoints.ports.2.port_max"       = "80"
          - "virtual_private_endpoints.ports.2.port_min"       = "80"
        } -> null
      - guid                    = "a559d1d0-ec18-43c7-858b-584064dabb1f" -> null
      - id                      = "crn:v1:bluemix:public:logs:eu-de:a/6a31b82b4f93471f96e9ed0afc261057:a559d1d0-ec18-43c7-858b-584064dabb1f::" -> null
      - last_operation          = {
          - "async"       = "true"
          - "cancelable"  = "false"
          - "description" = "service instance Provision succeeded"
          - "poll"        = "true"
          - "poll_after"  = "10"
          - "state"       = "succeeded"
          - "type"        = "create"
        } -> null
      - location                = "eu-de" -> null
      - locked                  = false -> null
      - name                    = "IBM Cloud Logs eu-de-test" -> null
      - plan                    = "standard" -> null
      - plan_history            = [
          - {
              - resource_plan_id = "3373c949-d1b1-4935-a60a-4e80b15440dd"
              - start_date       = "2024-08-07T07:34:57.431Z"
            },
        ] -> null
      - resource_aliases_url    = "/v2/resource_instances/a559d1d0-ec18-43c7-858b-584064dabb1f/resource_aliases" -> null
      - resource_bindings_url   = "/v2/resource_instances/a559d1d0-ec18-43c7-858b-584064dabb1f/resource_bindings" -> null
      - resource_controller_url = "https://cloud.ibm.com/services/" -> null
      - resource_crn            = "crn:v1:bluemix:public:logs:eu-de:a/6a31b82b4f93471f96e9ed0afc261057:a559d1d0-ec18-43c7-858b-584064dabb1f::" -> null
      - resource_group_crn      = "crn:v1:bluemix:public:resource-controller::a/6a31b82b4f93471f96e9ed0afc261057::resource-group:6370a14a3d1a40078c42c9408193ee9e" -> null
      - resource_group_id       = "6370a14a3d1a40078c42c9408193ee9e" -> null
      - resource_group_name     = "crn:v1:bluemix:public:resource-controller::a/6a31b82b4f93471f96e9ed0afc261057::resource-group:6370a14a3d1a40078c42c9408193ee9e" -> null
      - resource_id             = "cd515180-d78a-11ec-b396-db7d306c4f73" -> null
      - resource_keys_url       = "/v2/resource_instances/a559d1d0-ec18-43c7-858b-584064dabb1f/resource_keys" -> null
      - resource_name           = "IBM Cloud Logs eu-de-test" -> null
      - resource_plan_id        = "3373c949-d1b1-4935-a60a-4e80b15440dd" -> null
      - resource_status         = "active" -> null
      - service                 = "logs" -> null
      - state                   = "active" -> null
      - status                  = "active" -> null
      - tags                    = [
          - "24fae5ab-1721-4669-a1fb-756d2585d2ca",
          - "common",
        ] -> null
      - target_crn              = "crn:v1:bluemix:public:globalcatalog::::deployment:3373c949-d1b1-4935-a60a-4e80b15440dd%3Aeu-de86265" -> null
      - type                    = "service_instance" -> null
      - update_at               = "2024-08-07T07:35:34.858Z" -> null
    }

Plan: 0 to add, 0 to change, 2 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

ibm_iam_authorization_policy.policy-1722498751568646: Destroying... [id=6b4417f7-90dc-49e2-8311-1a835c70f43b]
ibm_iam_authorization_policy.policy-1722498751568646: Destruction complete after 3s
ibm_resource_instance.cloud_logs_instance: Destroying... [id=crn:v1:bluemix:public:logs:eu-de:a/6a31b82b4f93471f96e9ed0afc261057:a559d1d0-ec18-43c7-858b-584064dabb1f::]
ibm_resource_instance.cloud_logs_instance: Still destroying... [id=crn:v1:bluemix:public:logs:eu-de:a/6a31...a559d1d0-ec18-43c7-858b-584064dabb1f::, 10s elapsed]
ibm_resource_instance.cloud_logs_instance: Destruction complete after 12s

Destroy complete! Resources: 2 destroyed.
```

## 最後に
今回はLog AnalysisからCloud Logsへの設定移行の検証を整理しました。
上記の通り、2024年9月13日時点では、まだmigration toolが未完成であることがわかりました。
そのため、既存のLog Analysisインスタンスの設定ファイルをexportすることは可能ですが、新しいCloud Logsインスタンスへマイグレーションするためには、jsonファイルを手作業で修正するなりの工夫が必要であり、非常に大変な作業となるため、提案する際には注意が必要かと感じました。
migration toolを使用できるようになりましたら、こちらの記事も更新して全体公開したいと思います。

```shell:migration tool失敗例
moonsy@moon la-IBM Log Analysis-Osaka-1-jp-osa % ibmcloud logging migrate config --import --crn-origin crn:v1:bluemix:public:logdna:jp-osa:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx:: --crn-destination crn:v1:bluemix:public:logs:eu-de:a/xxxxxxxxxxxxxxxxxx:xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxxxxxxxx::
誤った使用法です。 コマンドの構文を確認し、要求を再試行してください。
名前:
   ibmcloud logging migrate - ibmcloud logging migrate

使用法:
   ibmcloud logging migrate command [arguments...] [options...]

コマンド:
   generate-terraform    t_migrate_generate_command_description
   create-resources      t_migrate_create_command_description
   remove-resources-tf   t_migrate_remove_command_description
```


## 参考
IBM Cloud Docs
- https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-migration-instance
- https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-migration_cli
- https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-migration-instance-resources