OCI CLIで◯◯をできるだけワンライナーで一括削除する


cloud shell でbash環境で作業します。
（cloud shell の初期のシェルクスクリプトは bash）

本当にワンライナーにすることもできたのですが、中間ファイル毎に区切ったほうが現実的だったので
実際は2・3回のコマンドで出来るようにしてます。

# CLIで「コンパートメント」を削除

コンパートメントを削除するためには、全てのリソースを削除する必要があります。

https://docs.oracle.com/ja-jp/iaas/Content/Identity/compartments/To_delete_a_compartment.htm

> コンパートメントを削除するには、すべてのリソースが空である必要があります。コンパートメントの削除を開始する前に、そのすべてのリソース(コンパートメントにアタッチされたポリシーを含む)を移動、削除または終了していることを確認してください。

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# 全てのコンパートメントを削除、引数で削除対象のコンパートメントのOCIDリスト（compartment_id.list）を指定
while read line; do oci iam compartment delete -c $line --force; done < ./compartment_id.list
```

## CLIで「ユーザー」を削除

まず、削除するユーザーの、OCIDのリストを作成し、
作成したリストを利用して一括削除しす。

管理者ユーザーだけ除外したリストが作れないため、一旦OCIDのとユーザーが記載されたリストを作成し、（手動で）viなどでユーザー名を削除する必要があります。

```bash
# OCIDとユーザーが記載されたリストを作成
oci iam user list --all | egrep '"id"|"name"' | sed 's/^.*: "//' | sed 's/",$//' > user_ocid.list

# viエディタ等で、必要なユーザーの取捨選択
vi user_ocid.list

# 引数でOCIDのリスト（user_ocid.list）を指定
while read line; do oci iam user delete --user-id $line --force; done < ./user_ocid.list 
```

## CLIで「Compute」を削除

まず、コンパートメント一覧を作成します。
その後、Compartmentリストをもとに、インスタンスリストを作成します。

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# インスタンスリストを作成、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci compute instance list -c $line | grep '"id"'; done < ./compartment_id.list | sed 's/",$//' | sed 's/.*"//' > compute_ocid.list

# 全てのComputeを削除、引数で削除対象のインスタンスのOCIDリスト(compute_ocid.list）を指定
while read line; do oci compute instance terminate --instance-id $line --force; done < ./compute_ocid.list
```

## CLIで「Object Storage」を削除

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# Object Storage名を一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci os bucket list -c $line; done < ./compartment_id.list | grep '"name"' | sed 's/",$//' | sed 's/.*"//' > os_name.list

# 全てのObject Storageを削除、引数で削除対象のバケット名リスト（os_name.list）を指定
while read line; do oci os bucket delete --bucket-name $line --empty --force; done < os_name.list 
```

## CLIで「VCN」を削除

VCNを削除するためには関連する全てのリソースを削除する必要があります。

https://docs.oracle.com/ja-jp/iaas/Content/Network/Troubleshoot/subnetdelete.htm

> VCNを削除するためには、まずそれが空であること、またそれに関連付けられたリソースまたはゲートウェイがない(例: インターネット・ゲートウェイ、動的ルーティング・ゲートウェイなどがない)ことが必要です。

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# VCNを一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network vcn list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > vcn_id.list

# 全てのInternet Gatewayを削除、引数で削除対象のInternet GatewayのOCIDリスト（servicegw_id.list）を指定
while read line; do oci network vcn delete --vcn-id $line --force; done < ./vcn_id.list
```

### CLIで「サブネット」を削除
```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# サブネットを一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network subnet list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > subnet_id.list

# 全てのサブネットを削除、引数で削除対象のサブネットのOCIDリスト（subnet_id.list）を指定
while read line; do oci network subnet delete --subnet-id $line --force; done < ./subnet_id.list 
```

### CLIで「ルート表」を削除
```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# ルート表を一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network route-table list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > route_id.list

# 全てのルート表を削除、引数で削除対象のNat GatewayのOCIDリスト（natgw_id.list）を指定
while read line; do oci network route-table delete --rt-id $line --force; done < ./route_id.list 
```

### CLIで「Nat Gateway」を削除

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# Nat Gatewayを一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network nat-gateway list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > natgw_id.list

# 全てのNat Gatewayを削除、引数で削除対象のNat GatewayのOCIDリスト（natgw_id.list）を指定
while read line; do oci network nat-gateway delete --nat-gateway-id $line --force; done < ./natgw_id.list 
```

### CLIで「サービスゲートウェイ」を削除

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# サービスゲートウェイを一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network service-gateway list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > servicegw_id.list

# 全てのサービスゲートウェイを削除、引数で削除対象のサービスゲートウェイのOCIDリスト（servicegw_id.list）を指定
while read line; do oci network service-gateway delete --service-gateway-id $line --force; done < ./servicegw_id.list 
```

### CLIで「Internet Gateway」を削除

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# Internet Gatewayを一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network internet-gateway list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > internetgw_id.list

# 全てのInternet Gatewayを削除、引数で削除対象のInternet GatewayのOCIDリスト（servicegw_id.list）を指定
while read line; do oci network internet-gateway delete --ig-id $line --force; done < ./internetgw_id.list
```

### CLIで「Internet Gateway」を削除

```bash
# rootを含め全コンパートメントのIDを取得
oci iam compartment list --include-root | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list
# ↑もしくは、rootを含め「ない」全コンパートメントのIDを取得
oci iam compartment list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > compartment_id.list

# セキュリティリストを一括取得、引数でコンパートメント一覧リスト(compartment_id.list）を指定
while read line; do oci network security-list list -c $line; done < ./compartment_id.list | grep '"id"' | sed 's/",$//' | sed 's/.*"//' > securitylist_id.list

# 全てのセキュリティリストを削除、引数で削除対象のセキュリティリストのOCIDリスト（securitylist_id.list）を指定
while read line; do oci network security-list delete --security-list-id $line --force; done < ./securitylist_id.list
```

# 最後に
ルート以外の中身をほぼ全部削除する事がありましたので、その時の作業コマンドをまとめました。
少しでもお役にたっていただければ幸いです。

# 参考
- OCI CLI コマンドリファレンス

https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.36.2/oci_cli_docs/oci.html