使用Terraform批量删除OCI资源
首先
使用Terraform批量删除在OCI上创建的资源。
想要做的是按照区域删除在专用区创建的资源。
我根据以下内容进行了参考。
Terraform OCI提供者的安装
本次使用已安装Terraform的Oracle Linux服务器。
在该服务器上安装Terraform OCI提供程序。
在这里确认并下载Terraform OCI Provider的最新版本(本次是v5.20)。
$ wget https://releases.hashicorp.com/terraform-provider-oci/5.20.0/terraform-provider-oci_5.20.0_linux_amd64.zip
--2023-11-09 05:39:37-- https://releases.hashicorp.com/terraform-provider-oci/5.20.0/terraform-provider-oci_5.20.0_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 13.35.147.43, 13.35.147.59, 13.35.147.41, ...
Connecting to releases.hashicorp.com (releases.hashicorp.com)|13.35.147.43|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 46637041 (44M) [application/zip]
Saving to: ‘terraform-provider-oci_5.20.0_linux_amd64.zip’
terraform-provider-oci_5.20.0_linux_amd64.z 100%[==========================================================================================>] 44.48M 47.0MB/s in 0.9s
2023-11-09 05:39:38 (47.0 MB/s) - ‘terraform-provider-oci_5.20.0_linux_amd64.zip’ saved [46637041/46637041]
我會解凍並確認它。
$ unzip -q terraform-provider-oci_5.20.0_linux_amd64.zip
$ ls -l
total 220952
-rw-r--r--. 1 opc opc 133427 Nov 8 03:54 CHANGELOG.md
-rw-r--r--. 1 opc opc 16725 Nov 8 03:54 LICENSE.txt
-rw-r--r--. 1 opc opc 2967 Nov 8 03:54 README.md
-rw-rw-r--. 1 opc opc 46637041 Nov 8 05:07 terraform-provider-oci_5.20.0_linux_amd64.zip
-rwxr-xr-x. 1 opc opc 179458048 Nov 8 02:30 terraform-provider-oci_v5.20.0
将二进制文件移动到可通过PATH访问的目录,并创建一个符号链接。
$ sudo mv terraform-provider-oci_v5.20.0 /usr/local/bin/
$ cd /usr/local/bin
$ sudo ln -s terraform-provider-oci_v5.20.0 terraform-provider-oci
确认版本。
$ terraform-provider-oci
2023/11/13 05:00:44 [INFO] terraform-provider-oci 5.20.0
2023/11/13 05:00:44 Executable runs in Terraform plugin mode by default. For additional usage options, please run with the '-help' flag.
This binary is a plugin. These are not meant to be executed directly.
Please execute the program that consumes these plugins, which will
load any plugins automatically
設定認證資訊
我会在任意路径下创建一个包含身份验证信息的脚本。
$ cd ~/bin
$ touch provider-oci.sh
$ chmod 755 provider-oci.sh
(每个值均已记录)
#!/bin/bash
export TF_VAR_tenancy_ocid=
export TF_VAR_user_ocid=
export TF_VAR_fingerprint=
export TF_VAR_private_key_path=
export TF_VAR_region=
运行此脚本以启用环境变量,并追加到.bashrc文件中。
(虽然按照手册上的步骤进行,但我认为直接写入.bashrc文件也可以。)
$ source provider-oci.sh
$ echo "source ~/bin/provider-oci.sh" >> ~/.bashrc
资源检测和状态文件的创建
使用Terraform OCI Provider执行,并检测使用provider-oci.sh中设置的区域的资源,然后创建tf文件和状态文件。
-
- -command=export
検出したリソースをtfファイルとして出力
-compartment_name=コンパートメント名
リソース検出するコンパートメント
-generate_state
Stateファイルを出力
これを指定しない場合、tfファイルのみ作成する
-output_path=$HOME/iad
指定したディレクトリに各ファイルを保存
$ terraform-provider-oci -command=export -compartment_name=コンパートメント名 -generate_state -output_path=$HOME/iad
・・・
INFO 2023/11/14 01:37:18.672046 ========= PERFORMANCE SUMMARY New Branch==========
INFO 2023/11/14 01:37:18.672053 Total resources: 62
INFO 2023/11/14 01:37:18.672061 Total time taken for discovering all services: 2m39.645891985s
INFO 2023/11/14 01:37:18.672068 Total time taken for generating state of all services: 2m41.474913831s
INFO 2023/11/14 01:37:18.672075 Total time taken by entire export: 5m21.151042363s
根据执行结果,可以得知指定的区域有62个资源。
确认已创建的文件。
$ ls -l iad/
total 608
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 adm.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 ai_anomaly_detection.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 ai_document.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 ai_language.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 ai_vision.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 analytics.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 announcements_service.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 apigateway.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 apm_config.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 apm_synthetics.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 apm.tf
-rw-rw-r--. 1 opc opc 668 Nov 14 01:37 artifacts.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 auto_scaling.tf
-rw-rw-r--. 1 opc opc 615 Nov 14 01:37 availability_domain.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 bastion.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 bds.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 blockchain.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 certificates_management.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 cloud_bridge.tf
-rw-rw-r--. 1 opc opc 4181 Nov 14 01:37 cloud_guard.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 cloud_migrations.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 compute_cloud_at_customer.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 containerengine.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 container_instances.tf
-rw-rw-r--. 1 opc opc 21556 Nov 14 01:37 core.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 database_migration.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 database.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 database_tools.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 datacatalog.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 dataflow.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 dataintegration.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 data_labeling_service.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 data_safe.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 datascience.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 devops.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 disaster_recovery.tf
-rw-rw-r--. 1 opc opc 6407 Nov 14 01:37 dns.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 email.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 em_warehouse.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 events.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 file_storage.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 functions.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 fusion_apps.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 golden_gate.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 health_checks.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 identity_data_plane.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 integration.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 jms.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 kms.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 license_manager.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 load_balancer.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 log_analytics.tf
-rw-rw-r--. 1 opc opc 2996 Nov 14 01:37 logging.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 management_agent.tf
-rw-rw-r--. 1 opc opc 2011 Nov 14 01:37 marketplace.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 media_services.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 monitoring.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 mysql.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 network_firewall.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 network_load_balancer.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 nosql.tf
-rw-rw-r--. 1 opc opc 3254 Nov 14 01:37 object_storage.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 oce.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 ocvp.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 oda.tf
-rw-rw-r--. 1 opc opc 785 Nov 14 01:37 ons.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 opa.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 opensearch.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 operator_access_control.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 opsi.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 os_management_hub.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 osmanagement.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 osp_gateway.tf
-rw-rw-r--. 1 opc opc 38 Nov 14 01:37 provider.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 queue.tf
-rw-rw-r--. 1 opc opc 2543 Nov 14 01:37 recovery.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 redis.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 resourcemanager.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 sch.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 service_mesh.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 stack_monitoring.tf
-rw-rw-r--. 1 opc opc 1045 Nov 14 01:37 streaming.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 tagging.tf
-rw-rw-r--. 1 opc opc 109662 Nov 14 01:37 terraform.tfstate
-rw-rw-r--. 1 opc opc 107755 Nov 14 01:37 terraform.tfstate.tmp.backup
-rw-rw-r--. 1 opc opc 171 Nov 14 01:37 vars.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 vault.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 visual_builder.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 vn_monitoring.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 vulnerability_scanning.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 waas.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 waa.tf
-rw-rw-r--. 1 opc opc 51 Nov 14 01:34 waf.tf
即使没有资源,也创建了tf文件。
该文件只有注释,内容为空。
## This is tmp config to run import for resources
资源中有一个文件,其内容如下。
## This configuration was generated by terraform-provider-oci
resource oci_ons_subscription export_subscription {
compartment_id = oci_artifacts_container_configuration.export_container_configuration.id
defined_tags = {
}
delivery_policy = "{\"backoffRetryPolicy\":{\"maxRetryDuration\":7200000,\"policyType\":\"EXPONENTIAL\"}}"
endpoint = "xxxxxxxx@oracle.com"
freeform_tags = {
}
protocol = "EMAIL"
topic_id = oci_ons_notification_topic.export_devops-handson.id
}
resource oci_ons_notification_topic export_devops-handson {
compartment_id = oci_artifacts_container_configuration.export_container_configuration.id
defined_tags = {
}
#description = <<Optional value not found in discovery>>
freeform_tags = {
}
name = "devops-handson"
}
删除资源
使用已创建的文件,在Terraform中执行删除操作。
$ cd iad
$ terraform destroy
・・・
Plan: 0 to add, 0 to change, 58 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
・・・
Terraform OCI Provider 检测到的资源总共有62个,但将被删除的只有58个。
虽然我无法确认日志,但我认为定义在数据源中的可用区域(3个)和对象存储命名空间(1个)被排除在外。
确认错误
有5个错误发生了,我来确认一下。
│ Error: 405-MethodNotAllowed, Cannot delete an Oracle Predefined resource
│ Suggestion: Please retry or contact support for help with service: Recovery Protection Policy
│ Documentation: https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/recovery_protection_policy
│ API Reference: https://docs.oracle.com/iaas/api/#/en/recovery-service/20210216/ProtectionPolicy/DeleteProtectionPolicy
│ Request Target: DELETE https://recovery.us-ashburn-1.oci.oraclecloud.com/20210216/protectionPolicies/ocid1.recoveryservicepolicy.region1..aaaaaaaam22xkw32t524xvst7dbxz4qsxtwetmfnnxfsgslbq664vya5jbkq
│ Provider version: 5.20.0, released on 2023-11-08.
│ Service: Recovery Protection Policy
│ Operation Name: DeleteProtectionPolicy
│ OPC request ID: b25e72902d793960ec1133593919bf27/73A25D7046FFF2A0055AA9FB58B0677B/E092D0F0D31E787CB4A083E66463E15F
这是数据库服务备份保护策略。我们遇到了四个相似的错误。
您可以从区块中引用它,但由于这是Oracle定义的策略,所以您没有删除权限,因此导致了错误。
╷
│ Error: 400-InvalidParameter, compartmentId is not available
│ Suggestion: Please update the parameter(s) in the Terraform config as per error message compartmentId is not available
│ Documentation: https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/cloud_guard_security_recipe
│ API Reference: https://docs.oracle.com/iaas/api/#/en/cloud-guard/20200131/SecurityRecipe/DeleteSecurityRecipe
│ Request Target: DELETE https://cloudguard-cp-api.us-ashburn-1.oci.oraclecloud.com/20200131/securityRecipes/ocid1.securityzonessecurityrecipe.oc1..aaaaaaaath2pdgqo7ufq4kuseqitcst2nzlihh3ux67o5uqeu2247dvvexia
│ Provider version: 5.20.0, released on 2023-11-08.
│ Service: Cloud Guard Security Recipe
│ Operation Name: DeleteSecurityRecipe
│ OPC request ID: 71c5566eb233d273570f820facbd4e03/F31A880302C17173BC18BC146EE981DE/B71A7F7B72E26122E9FE0173A94CCFE8
这个错误是关于安全区域的配方。由于这个配方是由Oracle定义的,所以您没有删除它的权限。
(但是,由于错误消息指出区域ID无效,所以可能不太清楚。)
我执行了Terraform destroy后,检查了环境,除了上述错误之外,确认所有资源都已被删除。由于Terraform OCI Provider会扫描区块中的资源,即使是我自己不知道何时创建的资源,也能够被检测到并成功删除,没有遗漏。