diff --git a/.changelog/3454.txt b/.changelog/3454.txt
new file mode 100644
index 0000000000..c22413156a
--- /dev/null
+++ b/.changelog/3454.txt
@@ -0,0 +1,3 @@
+```release-note:new-resource
+tencentcloud_teo_customize_error_page
+```
\ No newline at end of file
diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go
index 9f1eb91c22..25aa6d31c1 100644
--- a/tencentcloud/provider.go
+++ b/tencentcloud/provider.go
@@ -1892,6 +1892,7 @@ func Provider() *schema.Provider {
"tencentcloud_teo_bind_security_template": teo.ResourceTencentCloudTeoBindSecurityTemplate(),
"tencentcloud_teo_plan": teo.ResourceTencentCloudTeoPlan(),
"tencentcloud_teo_content_identifier": teo.ResourceTencentCloudTeoContentIdentifier(),
+ "tencentcloud_teo_customize_error_page": teo.ResourceTencentCloudTeoCustomizeErrorPage(),
"tencentcloud_tcm_mesh": tcm.ResourceTencentCloudTcmMesh(),
"tencentcloud_tcm_cluster_attachment": tcm.ResourceTencentCloudTcmClusterAttachment(),
"tencentcloud_tcm_prometheus_attachment": tcm.ResourceTencentCloudTcmPrometheusAttachment(),
diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md
index 69b7ccc8f8..186400d2c9 100644
--- a/tencentcloud/provider.md
+++ b/tencentcloud/provider.md
@@ -1514,6 +1514,7 @@ tencentcloud_teo_security_policy_config
tencentcloud_teo_dns_record
tencentcloud_teo_bind_security_template
tencentcloud_teo_content_identifier
+tencentcloud_teo_customize_error_page
TencentCloud ServiceMesh(TCM)
Data Source
diff --git a/tencentcloud/services/teo/resource_tc_teo_customize_error_page.go b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.go
new file mode 100644
index 0000000000..d2fc286745
--- /dev/null
+++ b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.go
@@ -0,0 +1,286 @@
+package teo
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ teov20220901 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo/v20220901"
+
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+)
+
+func ResourceTencentCloudTeoCustomizeErrorPage() *schema.Resource {
+ return &schema.Resource{
+ Create: resourceTencentCloudTeoCustomizeErrorPageCreate,
+ Read: resourceTencentCloudTeoCustomizeErrorPageRead,
+ Update: resourceTencentCloudTeoCustomizeErrorPageUpdate,
+ Delete: resourceTencentCloudTeoCustomizeErrorPageDelete,
+ Importer: &schema.ResourceImporter{
+ State: schema.ImportStatePassthrough,
+ },
+ Schema: map[string]*schema.Schema{
+ "zone_id": {
+ Type: schema.TypeString,
+ Required: true,
+ ForceNew: true,
+ Description: "Zone ID.",
+ },
+
+ "name": {
+ Type: schema.TypeString,
+ Required: true,
+ Description: "Custom error page name. The name must be 2-30 characters long.",
+ },
+
+ "content_type": {
+ Type: schema.TypeString,
+ Required: true,
+ Description: "Custom error page type, with values:
text/html; application/json;text/plain;text/xml..",
+ },
+
+ "description": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Custom error page description, not exceeding 60 characters.",
+ },
+
+ "content": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Custom error page content, not exceeding 2 KB.",
+ },
+
+ // computed
+ "page_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Page ID.",
+ },
+ },
+ }
+}
+
+func resourceTencentCloudTeoCustomizeErrorPageCreate(d *schema.ResourceData, meta interface{}) error {
+ defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.create")()
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ var (
+ logId = tccommon.GetLogId(tccommon.ContextNil)
+ ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ request = teov20220901.NewCreateCustomizeErrorPageRequest()
+ response = teov20220901.NewCreateCustomizeErrorPageResponse()
+ zoneId string
+ pageId string
+ )
+
+ if v, ok := d.GetOk("zone_id"); ok {
+ request.ZoneId = helper.String(v.(string))
+ zoneId = v.(string)
+ }
+
+ if v, ok := d.GetOk("name"); ok {
+ request.Name = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("content_type"); ok {
+ request.ContentType = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("description"); ok {
+ request.Description = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("content"); ok {
+ request.Content = helper.String(v.(string))
+ }
+
+ reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTeoV20220901Client().CreateCustomizeErrorPageWithContext(ctx, request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+ }
+
+ if result == nil || result.Response == nil {
+ return resource.NonRetryableError(fmt.Errorf("Create teo customize error page failed, Response is nil."))
+ }
+
+ response = result
+ return nil
+ })
+
+ if reqErr != nil {
+ log.Printf("[CRITAL]%s create teo customize error page failed, reason:%+v", logId, reqErr)
+ return reqErr
+ }
+
+ if response.Response.PageId == nil {
+ return fmt.Errorf("PageId is nil.")
+ }
+
+ pageId = *response.Response.PageId
+ d.SetId(strings.Join([]string{zoneId, pageId}, tccommon.FILED_SP))
+ return resourceTencentCloudTeoCustomizeErrorPageRead(d, meta)
+}
+
+func resourceTencentCloudTeoCustomizeErrorPageRead(d *schema.ResourceData, meta interface{}) error {
+ defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.read")()
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ var (
+ logId = tccommon.GetLogId(tccommon.ContextNil)
+ ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ service = TeoService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+ )
+
+ idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
+ if len(idSplit) != 2 {
+ return fmt.Errorf("id is broken,%s", d.Id())
+ }
+
+ zoneId := idSplit[0]
+ pageId := idSplit[1]
+
+ respData, err := service.DescribeTeoCustomizeErrorPageById(ctx, zoneId, pageId)
+ if err != nil {
+ return err
+ }
+
+ if respData == nil {
+ log.Printf("[WARN]%s resource `teo_customize_error_page` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
+ d.SetId("")
+ return nil
+ }
+
+ _ = d.Set("zone_id", zoneId)
+ _ = d.Set("page_id", pageId)
+
+ if respData.Name != nil {
+ _ = d.Set("name", respData.Name)
+ }
+
+ if respData.ContentType != nil {
+ _ = d.Set("content_type", respData.ContentType)
+ }
+
+ if respData.Description != nil {
+ _ = d.Set("description", respData.Description)
+ }
+
+ if respData.Content != nil {
+ _ = d.Set("content", respData.Content)
+ }
+
+ return nil
+}
+
+func resourceTencentCloudTeoCustomizeErrorPageUpdate(d *schema.ResourceData, meta interface{}) error {
+ defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.update")()
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ var (
+ logId = tccommon.GetLogId(tccommon.ContextNil)
+ ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ )
+
+ idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
+ if len(idSplit) != 2 {
+ return fmt.Errorf("id is broken,%s", d.Id())
+ }
+
+ zoneId := idSplit[0]
+ pageId := idSplit[1]
+
+ needChange := false
+ mutableArgs := []string{"name", "description", "content_type", "content"}
+ for _, v := range mutableArgs {
+ if d.HasChange(v) {
+ needChange = true
+ break
+ }
+ }
+
+ if needChange {
+ request := teov20220901.NewModifyCustomErrorPageRequest()
+ if v, ok := d.GetOk("name"); ok {
+ request.Name = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("description"); ok {
+ request.Description = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("content_type"); ok {
+ request.ContentType = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("content"); ok {
+ request.Content = helper.String(v.(string))
+ }
+
+ request.ZoneId = &zoneId
+ request.PageId = &pageId
+ reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTeoV20220901Client().ModifyCustomErrorPageWithContext(ctx, request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+ }
+
+ return nil
+ })
+
+ if reqErr != nil {
+ log.Printf("[CRITAL]%s update teo customize error page failed, reason:%+v", logId, reqErr)
+ return reqErr
+ }
+ }
+
+ return resourceTencentCloudTeoCustomizeErrorPageRead(d, meta)
+}
+
+func resourceTencentCloudTeoCustomizeErrorPageDelete(d *schema.ResourceData, meta interface{}) error {
+ defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.delete")()
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ var (
+ logId = tccommon.GetLogId(tccommon.ContextNil)
+ ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ request = teov20220901.NewDeleteCustomErrorPageRequest()
+ )
+
+ idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
+ if len(idSplit) != 2 {
+ return fmt.Errorf("id is broken,%s", d.Id())
+ }
+
+ zoneId := idSplit[0]
+ pageId := idSplit[1]
+
+ request.ZoneId = &zoneId
+ request.PageId = &pageId
+ reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTeoV20220901Client().DeleteCustomErrorPageWithContext(ctx, request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+ }
+
+ return nil
+ })
+
+ if reqErr != nil {
+ log.Printf("[CRITAL]%s delete teo customize error page failed, reason:%+v", logId, reqErr)
+ return reqErr
+ }
+
+ return nil
+}
diff --git a/tencentcloud/services/teo/resource_tc_teo_customize_error_page.md b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.md
new file mode 100644
index 0000000000..26cd43b49d
--- /dev/null
+++ b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.md
@@ -0,0 +1,78 @@
+Provides a resource to create a TEO customize error page
+
+Example Usage
+
+If content_type is application/json
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "application/json"
+ description = "description."
+ content = jsonencode({
+ "key" : "value",
+ })
+}
+```
+
+If content_type is text/html
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/html"
+ description = "description."
+ content = <<-EOF
+
+
+
+
+ Error Page
+
+
+ customize error page
+
+
+ EOF
+}
+```
+
+If content_type is text/plain
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/plain"
+ description = "description."
+ content = "customize error page"
+}
+```
+
+If content_type is text/xml
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/xml"
+ description = "description."
+ content = <<-EOF
+
+
+
+ customize error page
+
+ EOF
+}
+```
+
+Import
+
+TEO customize error page can be imported using the id, e.g.
+
+```
+terraform import tencentcloud_teo_customize_error_page.example zone-3edjdliiw3he#p-3egexy9b4426
+```
diff --git a/tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go b/tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go
new file mode 100644
index 0000000000..d7f4b928df
--- /dev/null
+++ b/tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go
@@ -0,0 +1,70 @@
+package teo_test
+
+import (
+ "testing"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
+
+ tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
+)
+
+func TestAccTencentCloudTeoCustomizeErrorPageResource_basic(t *testing.T) {
+ t.Parallel()
+ resource.Test(t, resource.TestCase{
+ PreCheck: func() {
+ tcacctest.AccPreCheck(t)
+ },
+ Providers: tcacctest.AccProviders,
+ Steps: []resource.TestStep{
+ {
+ Config: testAccTeoCustomizeErrorPage,
+ Check: resource.ComposeTestCheckFunc(
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "id"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "zone_id"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "name"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content_type"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "description"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content"),
+ ),
+ },
+ {
+ Config: testAccTeoCustomizeErrorPageUpdate,
+ Check: resource.ComposeTestCheckFunc(
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "id"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "zone_id"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "name"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content_type"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "description"),
+ resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content"),
+ ),
+ },
+ {
+ ResourceName: "tencentcloud_teo_customize_error_page.example",
+ ImportState: true,
+ ImportStateVerify: true,
+ },
+ },
+ })
+}
+
+const testAccTeoCustomizeErrorPage = `
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/plain"
+ description = "description."
+ content = "customize error page"
+}
+`
+
+const testAccTeoCustomizeErrorPageUpdate = `
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example-update"
+ content_type = "application/json"
+ description = "description update."
+ content = jsonencode({
+ "key" : "value",
+ })
+}
+`
diff --git a/tencentcloud/services/teo/service_tencentcloud_teo.go b/tencentcloud/services/teo/service_tencentcloud_teo.go
index 5554680ca1..d02eeb5c4a 100644
--- a/tencentcloud/services/teo/service_tencentcloud_teo.go
+++ b/tencentcloud/services/teo/service_tencentcloud_teo.go
@@ -2021,3 +2021,54 @@ func (me *TeoService) DescribeTeoContentIdentifierById(ctx context.Context, cont
ret = response.Response.ContentIdentifiers[0]
return
}
+
+func (me *TeoService) DescribeTeoCustomizeErrorPageById(ctx context.Context, zoneId, pageId string) (ret *teo.CustomErrorPage, errRet error) {
+ logId := tccommon.GetLogId(ctx)
+
+ request := teo.NewDescribeCustomErrorPagesRequest()
+ response := teo.NewDescribeCustomErrorPagesResponse()
+ request.ZoneId = &zoneId
+ request.Filters = []*teo.AdvancedFilter{
+ {
+ Name: helper.String("page-id"),
+ Values: helper.Strings([]string{pageId}),
+ Fuzzy: helper.Bool(false),
+ },
+ }
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ ratelimit.Check(request.GetAction())
+ result, e := me.client.UseTeoV20220901Client().DescribeCustomErrorPages(request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+ }
+
+ if result == nil || result.Response == nil || len(result.Response.ErrorPages) == 0 {
+ return resource.NonRetryableError(fmt.Errorf("Describe teo custom error pages failed, Response is nil."))
+ }
+
+ response = result
+ return nil
+ })
+
+ if err != nil {
+ errRet = err
+ return
+ }
+
+ if len(response.Response.ErrorPages) != 1 {
+ errRet = fmt.Errorf("`ErrorPages` returning multiple values, Should be one.")
+ return
+ }
+
+ ret = response.Response.ErrorPages[0]
+ return
+}
diff --git a/website/docs/r/teo_customize_error_page.html.markdown b/website/docs/r/teo_customize_error_page.html.markdown
new file mode 100644
index 0000000000..308a8bb28b
--- /dev/null
+++ b/website/docs/r/teo_customize_error_page.html.markdown
@@ -0,0 +1,108 @@
+---
+subcategory: "TencentCloud EdgeOne(TEO)"
+layout: "tencentcloud"
+page_title: "TencentCloud: tencentcloud_teo_customize_error_page"
+sidebar_current: "docs-tencentcloud-resource-teo_customize_error_page"
+description: |-
+ Provides a resource to create a TEO customize error page
+---
+
+# tencentcloud_teo_customize_error_page
+
+Provides a resource to create a TEO customize error page
+
+## Example Usage
+
+### If content_type is application/json
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "application/json"
+ description = "description."
+ content = jsonencode({
+ "key" : "value",
+ })
+}
+```
+
+### If content_type is text/html
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/html"
+ description = "description."
+ content = <<-EOF
+
+
+
+
+ Error Page
+
+
+ customize error page
+
+
+ EOF
+}
+```
+
+### If content_type is text/plain
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/plain"
+ description = "description."
+ content = "customize error page"
+}
+```
+
+### If content_type is text/xml
+
+```hcl
+resource "tencentcloud_teo_customize_error_page" "example" {
+ zone_id = "zone-3edjdliiw3he"
+ name = "tf-example"
+ content_type = "text/xml"
+ description = "description."
+ content = <<-EOF
+
+
+
+ customize error page
+
+ EOF
+}
+```
+
+## Argument Reference
+
+The following arguments are supported:
+
+* `content_type` - (Required, String) Custom error page type, with values:text/html; application/json;text/plain;text/xml..
+* `name` - (Required, String) Custom error page name. The name must be 2-30 characters long.
+* `zone_id` - (Required, String, ForceNew) Zone ID.
+* `content` - (Optional, String) Custom error page content, not exceeding 2 KB.
+* `description` - (Optional, String) Custom error page description, not exceeding 60 characters.
+
+## Attributes Reference
+
+In addition to all arguments above, the following attributes are exported:
+
+* `id` - ID of the resource.
+* `page_id` - Page ID.
+
+
+## Import
+
+TEO customize error page can be imported using the id, e.g.
+
+```
+terraform import tencentcloud_teo_customize_error_page.example zone-3edjdliiw3he#p-3egexy9b4426
+```
+
diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb
index ba50abce7a..50b59e2b9e 100644
--- a/website/tencentcloud.erb
+++ b/website/tencentcloud.erb
@@ -5339,6 +5339,9 @@
tencentcloud_teo_content_identifier
+
+ tencentcloud_teo_customize_error_page
+
tencentcloud_teo_dns_record