[Oracle Cloud]特定コンパートメントのリソース一括削除にTerraformの使用 (2021/12/13)

#はじめに
この記事は [Oracle Cloud Infrastructure Advent Calendar 2021](https://qiita.com/advent-calendar/2021/oci) Day 13の記事として書かれています。
OCIのコンパートメント内のリソースの一括削除をTerraform/OCI Resource Managerを使って実施してみた。

# 既存コンパートメントからスタックを作成
Webコンソールから「開発者サービス」の
「リソース・マネージャ」＞「スタック」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/b8f2bf79-ccb2-38ac-4805-9a9e9f19e96e.png)


コンパートメント内のすべてのリソース用にTerraformプランファイルのセットを新しいスタックを作成します。
「スタックの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/a9457f8f-fcc8-acc4-8bf0-06e35f38678e.png)


「既存のコンパートメント」を選択し、リソースが存在するコンパートメントを選択しスタックを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/68dbf5a8-ee75-ce5f-933d-4d5f3ec65cba.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/bf5fdedb-a8f1-14cf-7a03-ae7a09bdf01e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/558e2b61-0b75-3f8e-68a9-c8fd71c55c79.png)



# Resource Managerでのリソース削除

スタックの作成が完了後 「Destroy/破棄」を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/839e408f-948f-7610-286b-0bfbb52acc02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/3e6024e7-e61d-1161-0330-a791b012779f.png)


# 補足
破棄操作が失敗した場合、OCI Cloud ShellからTerraformコマンドを実行しリソースを削除できます。
OCI Provider Webページ（https://releases.hashicorp.com/terraform-provider-oci/）から最新リリース（Linux 64bit版）のリンクURLをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/20e9f55b-e5e9-cd4d-bf59-d83902bef3cc.png)

コンソールから Cloud Shellを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/7010c73b-7f0d-3b1f-516d-3553a0543c24.png)

ユーザーのルートディレクトリの下に、binというディレクトリを作成
wget <リンク先>を使って、binフォルダにOCI Providerをダウンロードし、ダウンロードしたファイルを解凍

```
@cloudshell:~ (ap-tokyo-1)$ mkdir bin
@cloudshell:~ (ap-tokyo-1)$ cd bin
@cloudshell:bin (ap-tokyo-1)$ wget https://releases.hashicorp.com/terraform-provider-oci/4.55.0/terraform-provider-oci_4.55.0_linux_amd64.zip
--2021-12-05 07:47:07--  https://releases.hashicorp.com/terraform-provider-oci/4.55.0/terraform-provider-oci_4.55.0_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 146.75.37.183, 2a04:4e42:79::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|146.75.37.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25541306 (24M) [application/zip]
Saving to: ‘terraform-provider-oci_4.55.0_linux_amd64.zip’

100%[===============================================================================================================================================================================================================================================================================================================================================>] 25,541,306   150MB/s   in 0.2s   

2021-12-05 07:47:07 (150 MB/s) - ‘terraform-provider-oci_4.55.0_linux_amd64.zip’ saved [25541306/25541306]

@cloudshell:bin (ap-tokyo-1)$ ls
terraform-provider-oci_4.55.0_linux_amd64.zip
@cloudshell:bin (ap-tokyo-1)$ unzip terraform-provider-oci_4.55.0_linux_amd64.zip 
Archive:  terraform-provider-oci_4.55.0_linux_amd64.zip
  inflating: terraform-provider-oci_v4.55.0_x4  
@cloudshell:bin (ap-tokyo-1)$ ls
terraform-provider-oci_4.55.0_linux_amd64.zip  terraform-provider-oci_v4.55.0_x4
@cloudshell:bin (ap-tokyo-1)$ cd 
```


ユーザーのホームディレクトリの下にcleaningディレクトリを作成し、そのディレクトリに移動
クリーンナップするコンパートメントのOCIDを指定して下記exportコマンドを実行 ( ダウンロードした OCI Providerのバージョンに注意してコマンドを実行 )

```
@cloudshell:~ (ap-tokyo-1)$ mkdir cleaning
@cloudshell:~ (ap-tokyo-1)$ cd cleaning/
@cloudshell:cleaning (ap-tokyo-1)$ ~/bin/terraform-provider-oci_v4.55.0_x4 -command=export -compartment_id=ocid1.compartment.oc1..aaaaaaaan -output_path=. -generate_state
2021/12/05 07:51:08 [INFO] terraform-provider-oci 4.55.0

略

INFO 2021/12/XX 07:51:46.315147 === COMPLETED ===
INFO 2021/12/XX 07:51:46.315152 ========= PERFORMANCE SUMMARY ==========
INFO 2021/12/XX 07:51:46.315157 Total resources: 2
INFO 2021/12/XX 07:51:46.315165 Total time taken for discovering all services: 18.93891921s
INFO 2021/12/XX 07:51:46.315175 Total time taken for generating state of all services: 16.43681961s
INFO 2021/12/XX 07:51:46.315183 Total time taken by entire export: 35.380211205s
@cloudshell:cleaning (ap-tokyo-1)$ 
```

コマンドを実行すると、リソースを検査し、Terraformリソースとして定義されたTerraform Planファイル(*.tf)が作成され、Terraformステートファイルにインポートされます。
この*.tfファイルを調べると、削除したいクラウドリソースの定義がわかります。

Terraform Destroy コマンドを実行しリソースの削除を実行します。
破壊される内容を確認し、「yes」と入力してエンターキーを押下し、リソースの削除。

```
@cloudshell:cleaning (ap-tokyo-1)$ ls -l
total 44
-rw-r--r--. 1 kenji_wata oci  6112 Dec  X 07:51 database.tf
-rw-r--r--. 1 kenji_wata oci    38 Dec  X 07:51 provider.tf
-rw-r--r--. 1 kenji_wata oci 15641 Dec  X 07:51 terraform.tfstate
-rw-r--r--. 1 kenji_wata oci  8826 Dec  X 07:51 terraform.tfstate.tmp.backup
-rw-r--r--. 1 kenji_wata oci   171 Dec  X 07:51 vars.tf
@cloudshell:cleaning (ap-tokyo-1)$ terraform destroy
oci_database_db_system.export_DBSystem1: Refreshing state... [id=ocid1.dbsystem.oc1.phx.anyhqljrssl]
oci_database_autonomous_database.export_ADB01: Refreshing state... [id=ocid1.autonomousdatabase.oc1.phx.anyhqljrssl]

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:

略

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
```

注意：ポリシーのようなアイデンティティリソースなどの一部のリソースは、テナントレベルでのみ存在するため別途削除する必要があります。


# おわりに
OCI Resource Managerの リソースディスカバリー機能は、OCI コンパートメント内のリソースを把握するための非常に強力なメカニズムです。結果として得られるTerraformファイルは、コンパートメントからリソースを破壊するために使用することができます - 適切な順序で、すべての基礎となる詳細と子要素を考慮に入れて。時間と手間の節約になります。

OCI Cloud Shellは、Terraformを使いこなすための簡単なアクセスメカニズムを提供します。

## 参考情報

- [Terraform OCI Provider Docs – Resource Discovery](https://registry.terraform.io/providers/hashicorp/oci/latest/docs/guides/resource_discovery)
- [OCI Docs – Resource Discovery](https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/terraformresourcediscovery.htm)
- [Cleaning Out a Compartment on Oracle Cloud using Terraform provider](https://technology.amis.nl/software-development/software-engineering/cleaning-out-a-compartment-on-oracle-cloud-using-terraform-provider/)