执行Terraform Apply创建OCI实例时遭遇400-CannotParseRequest错误求助
OCI Terraform实例创建报错400-CannotParseRequest的解决办法
问题描述
在OCI中使用Terraform创建简单实例时,执行terraform apply后始终返回模糊错误:400-CannotParseRequest。
原Terraform脚本
resource "oci_core_instance" "ubuntu_oci_instance" { availability_domain = data.oci_identity_availability_domains.ads.availability_domains.0.id compartment_id = var.compartment_ocid fault_domain = var.default_fault_domain create_vnic_details { assign_private_dns_record = true assign_public_ip = true subnet_id = var.public_subnet_id } display_name = "Ubuntu Instance" shape = "VM.Standard.A1.Flex" shape_config { memory_in_gbs = "6" ocpus = "1" } source_details { source_id = var.os_image_id source_type = "image" } freeform_tags = local.tags }
调试日志
2023-02-27T11:09:25.499-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: {"availabilityDomain":"ocid1.availabilitydomain.oc1..XXXXXX","compartmentId":"ocid1.subnet.oc1.sa-vinhedo-1.XXXXXX","createVnicDetails":{"assignPrivateDnsRecord":true,"assignPublicIp":true,"subnetId":"ocid1.subnet.oc1.sa-vinhedo-1.XXXXX"},"displayName":"Ubuntu Instance","faultDomain":"FAULT-DOMAIN-1","freeformTags":{"environment":"lab","oracle-tutorial":"terraform"},"shape":"VM.Standard.A1.Flex","shapeConfig":{"memoryInGBs":6,"ocpus":1},"sourceDetails":{"bootVolumeVpusPerGB":10,"imageId":"ocid1.image.oc1.sa-vinhedo-1.aaaaaaaaonxtcly7ahfdey62t2omzydh55y4rjf6qge6j2iljh4qiexuso5a","sourceType":"image"}} 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: INFO 2023/02/27 11:09:25.582061 client.go:449: Dump Response HTTP/1.1 400 Bad Request 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: Connection: close 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: Content-Length: 127 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: Content-Type: application/json 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: Date: Mon, 27 Feb 2023 14:09:25 GMT 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: Opc-Request-Id: d5960a2c88b5d6dcf2965b4afd00c6b1/3FF831DB64F0B8B8F9214282CC4BDD1D/E6CA846EBB29D2B8F9E20FD1A4A70572 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: { 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: "code" : "CannotParseRequest", 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: "message" : "Incorrectly formatted request. Please refer to our documentation for help." 2023-02-27T11:09:25.582-0300 [DEBUG] provider.terraform-provider-oci_v4.109.0: }
问题分析与修复
从调试日志的请求体可以发现两个关键错误:
- compartmentId值错误:请求中
compartmentId填的是子网的OCID(ocid1.subnet...),但该字段必须填写compartment的OCID。检查var.compartment_ocid变量,确保其值为正确的compartment标识符。 - shape_config参数类型错误:原脚本中
shape_config的memory_in_gbs和ocpus用了字符串格式(带引号),而VM.Standard.A1.Flex这类弹性实例要求这两个参数为数值类型,字符串会导致OCI服务无法解析请求。
修正后的脚本
resource "oci_core_instance" "ubuntu_oci_instance" { availability_domain = data.oci_identity_availability_domains.ads.availability_domains.0.id compartment_id = var.compartment_ocid # 确保此变量是compartment的OCID而非子网OCID fault_domain = var.default_fault_domain create_vnic_details { assign_private_dns_record = true assign_public_ip = true subnet_id = var.public_subnet_id } display_name = "Ubuntu Instance" shape = "VM.Standard.A1.Flex" shape_config { memory_in_gbs = 6 # 去掉引号,使用数值类型 ocpus = 1 # 去掉引号,使用数值类型 } source_details { source_id = var.os_image_id source_type = "image" } freeform_tags = local.tags }
修复后重新执行terraform apply即可正常创建实例。
内容的提问来源于stack exchange,提问作者André Roggeri Campos
相关产品推荐
相关产品推荐

