diff --git a/.changelog/3618.txt b/.changelog/3618.txt new file mode 100644 index 0000000000..397a072caa --- /dev/null +++ b/.changelog/3618.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_cynosdb_audit_service +``` \ No newline at end of file diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index fd113e940e..232e06c8a6 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1807,6 +1807,9 @@ func Provider() *schema.Provider { "tencentcloud_cynosdb_upgrade_proxy_version": cynosdb.ResourceTencentCloudCynosdbUpgradeProxyVersion(), "tencentcloud_cynosdb_backup_config": cynosdb.ResourceTencentCloudCynosdbBackupConfig(), "tencentcloud_cynosdb_ssl": cynosdb.ResourceTencentCloudCynosdbSsl(), + "tencentcloud_cynosdb_audit_log_file": cynosdb.ResourceTencentCloudCynosdbAuditLogFile(), + "tencentcloud_cynosdb_security_group": cynosdb.ResourceTencentCloudCynosdbSecurityGroup(), + "tencentcloud_cynosdb_audit_service": cynosdb.ResourceTencentCloudCynosdbAuditService(), "tencentcloud_vod_adaptive_dynamic_streaming_template": vod.ResourceTencentCloudVodAdaptiveDynamicStreamingTemplate(), "tencentcloud_vod_image_sprite_template": vod.ResourceTencentCloudVodImageSpriteTemplate(), "tencentcloud_vod_procedure_template": vod.ResourceTencentCloudVodProcedureTemplate(), @@ -2161,8 +2164,6 @@ func Provider() *schema.Provider { "tencentcloud_ci_media_speech_recognition_template": ci.ResourceTencentCloudCiMediaSpeechRecognitionTemplate(), "tencentcloud_ci_guetzli": ci.ResourceTencentCloudCIGuetzli(), "tencentcloud_ci_original_image_protection": ci.ResourceTencentCloudCIOriginalImageProtection(), - "tencentcloud_cynosdb_audit_log_file": cynosdb.ResourceTencentCloudCynosdbAuditLogFile(), - "tencentcloud_cynosdb_security_group": cynosdb.ResourceTencentCloudCynosdbSecurityGroup(), "tencentcloud_dayu_ddos_ip_attachment_v2": dayuv2.ResourceTencentCloudDayuDDosIpAttachmentV2(), "tencentcloud_antiddos_ddos_black_white_ip": dayuv2.ResourceTencentCloudAntiddosDdosBlackWhiteIp(), "tencentcloud_antiddos_ddos_geo_ip_block_config": dayuv2.ResourceTencentCloudAntiddosDdosGeoIpBlockConfig(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index d575c1345e..3db4e2e29b 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -546,6 +546,7 @@ tencentcloud_cynosdb_proxy_end_point tencentcloud_cynosdb_upgrade_proxy_version tencentcloud_cynosdb_backup_config tencentcloud_cynosdb_ssl +tencentcloud_cynosdb_audit_service Direct Connect(DC) Data Source diff --git a/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service.go b/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service.go new file mode 100644 index 0000000000..9b73cd91a5 --- /dev/null +++ b/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service.go @@ -0,0 +1,338 @@ +package cynosdb + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + cynosdbv20190107 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudCynosdbAuditService() *schema.Resource { + return &schema.Resource{ + Create: ResourceTencentCloudCynosdbAuditServiceCreate, + Read: ResourceTencentCloudCynosdbAuditServiceRead, + Update: ResourceTencentCloudCynosdbAuditServiceUpdate, + Delete: ResourceTencentCloudCynosdbAuditServiceDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "instance_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Instance ID.", + }, + + "log_expire_day": { + Type: schema.TypeInt, + Required: true, + Description: "Log retention period.", + }, + + "high_log_expire_day": { + Type: schema.TypeInt, + Optional: true, + Description: "Frequent log retention period.", + }, + + "rule_template_ids": { + Type: schema.TypeSet, + Optional: true, + Description: "Rule template ID set.", + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + + "audit_all": { + Type: schema.TypeBool, + Optional: true, + Description: "Audit type. true - full audit; default false - rule-based audit.", + }, + }, + } +} + +func ResourceTencentCloudCynosdbAuditServiceCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_audit_service.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = cynosdbv20190107.NewOpenAuditServiceRequest() + instanceId string + ) + + if v, ok := d.GetOk("instance_id"); ok { + request.InstanceId = helper.String(v.(string)) + instanceId = v.(string) + } + + if v, ok := d.GetOkExists("log_expire_day"); ok { + request.LogExpireDay = helper.IntUint64(v.(int)) + } + + if v, ok := d.GetOkExists("high_log_expire_day"); ok { + request.HighLogExpireDay = helper.IntUint64(v.(int)) + } + + if v, ok := d.GetOk("rule_template_ids"); ok { + ruleTemplateIdsSet := v.(*schema.Set).List() + for i := range ruleTemplateIdsSet { + ruleTemplateIds := ruleTemplateIdsSet[i].(string) + request.RuleTemplateIds = append(request.RuleTemplateIds, helper.String(ruleTemplateIds)) + } + } + + if v, ok := d.GetOkExists("audit_all"); ok { + request.AuditAll = helper.Bool(v.(bool)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().OpenAuditServiceWithContext(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 create cynosdb audit service failed, reason:%+v", logId, reqErr) + return reqErr + } + + d.SetId(instanceId) + + // wait + waitReq := cynosdbv20190107.NewDescribeAuditInstanceListRequest() + waitReq.Offset = helper.Uint64(0) + waitReq.Limit = helper.Uint64(1) + waitReq.Filters = []*cynosdbv20190107.AuditInstanceFilters{ + { + Name: helper.String("InstanceId"), + ExactMatch: helper.Bool(true), + Values: helper.Strings([]string{instanceId}), + }, + } + + reqErr = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeAuditInstanceListWithContext(ctx, waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.Items == nil || len(result.Response.Items) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe cynosdb audit service failed, Response is nil.")) + } + + item := result.Response.Items[0] + if item.AuditStatus == nil { + return resource.NonRetryableError(fmt.Errorf("AuditStatus is nil.")) + } + + if *item.AuditStatus == "ON" { + return nil + } + + return resource.RetryableError(fmt.Errorf("cynosdb audit service is still running, audit status is %s.", *item.AuditStatus)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create cynosdb audit service failed, reason:%+v", logId, reqErr) + return reqErr + } + + return ResourceTencentCloudCynosdbAuditServiceRead(d, meta) +} + +func ResourceTencentCloudCynosdbAuditServiceRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_audit_service.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = CynosdbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceId = d.Id() + ) + + respData, err := service.DescribeCynosdbAuditServiceById(ctx, instanceId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_cynosdb_audit_service` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + if respData.InstanceId != nil { + _ = d.Set("instance_id", respData.InstanceId) + } + + if respData.LogExpireDay != nil { + _ = d.Set("log_expire_day", respData.LogExpireDay) + } + + if respData.HighLogExpireDay != nil { + _ = d.Set("high_log_expire_day", respData.HighLogExpireDay) + } + + if respData.RuleTemplateIds != nil { + _ = d.Set("rule_template_ids", respData.RuleTemplateIds) + } + + if respData.AuditAll != nil { + _ = d.Set("audit_all", respData.AuditAll) + } + + return nil +} + +func ResourceTencentCloudCynosdbAuditServiceUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_audit_service.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + instanceId = d.Id() + ) + + needChange := false + mutableArgs := []string{"log_expire_day", "high_log_expire_day", "rule_template_ids", "audit_all"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := cynosdbv20190107.NewModifyAuditServiceRequest() + if v, ok := d.GetOkExists("log_expire_day"); ok { + request.LogExpireDay = helper.IntUint64(v.(int)) + } + + if v, ok := d.GetOkExists("high_log_expire_day"); ok { + request.HighLogExpireDay = helper.IntUint64(v.(int)) + } + + if v, ok := d.GetOk("rule_template_ids"); ok { + ruleTemplateIdsSet := v.(*schema.Set).List() + for i := range ruleTemplateIdsSet { + ruleTemplateIds := ruleTemplateIdsSet[i].(string) + request.RuleTemplateIds = append(request.RuleTemplateIds, helper.String(ruleTemplateIds)) + } + } + + if v, ok := d.GetOkExists("audit_all"); ok { + request.AuditAll = helper.Bool(v.(bool)) + } + + request.InstanceId = &instanceId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().ModifyAuditServiceWithContext(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 cynosdb audit service failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + return ResourceTencentCloudCynosdbAuditServiceRead(d, meta) +} + +func ResourceTencentCloudCynosdbAuditServiceDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_audit_service.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = cynosdbv20190107.NewCloseAuditServiceRequest() + instanceId = d.Id() + ) + + request.InstanceId = &instanceId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().CloseAuditServiceWithContext(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 cynosdb audit service failed, reason:%+v", logId, reqErr) + return reqErr + } + + // wait + waitReq := cynosdbv20190107.NewDescribeAuditInstanceListRequest() + waitReq.Offset = helper.Uint64(0) + waitReq.Limit = helper.Uint64(1) + waitReq.Filters = []*cynosdbv20190107.AuditInstanceFilters{ + { + Name: helper.String("InstanceId"), + ExactMatch: helper.Bool(true), + Values: helper.Strings([]string{instanceId}), + }, + } + + reqErr = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeAuditInstanceListWithContext(ctx, waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.Items == nil || len(result.Response.Items) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe cynosdb audit service failed, Response is nil.")) + } + + item := result.Response.Items[0] + if item.AuditStatus == nil { + return resource.NonRetryableError(fmt.Errorf("AuditStatus is nil.")) + } + + if *item.AuditStatus == "OFF" { + return nil + } + + return resource.RetryableError(fmt.Errorf("cynosdb audit service is still running, audit status is %s.", *item.AuditStatus)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete cynosdb audit service failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service.md b/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service.md new file mode 100644 index 0000000000..ae5d1b1a5c --- /dev/null +++ b/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service.md @@ -0,0 +1,34 @@ +Provides a resource to create a CynosDB audit service + +Example Usage + +If audit_all is true + +```hcl +resource "tencentcloud_cynosdb_audit_service" "example" { + instance_id = "cynosdbmysql-ins-f9j6sopi" + log_expire_day = 30 + high_log_expire_day = 7 + audit_all = true +} +``` + +If audit_all is false + +```hcl +resource "tencentcloud_cynosdb_audit_service" "example" { + instance_id = "cynosdbmysql-ins-f9j6sopi" + log_expire_day = 30 + high_log_expire_day = 7 + rule_template_ids = ["cynosdb-art-riwq2vx0"] + audit_all = false +} +``` + +Import + +CynosDB audit service can be imported using the id, e.g. + +``` +terraform import tencentcloud_cynosdb_audit_service.example cynosdbmysql-ins-f9j6sopi +``` diff --git a/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service_test.go b/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service_test.go new file mode 100644 index 0000000000..b997088afb --- /dev/null +++ b/tencentcloud/services/cynosdb/resource_tc_cynosdb_audit_service_test.go @@ -0,0 +1,66 @@ +package cynosdb_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudCynosdbAuditServiceResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCynosdbAuditService, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "instance_id"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "log_expire_day"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "high_log_expire_day"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "audit_all"), + ), + }, + { + Config: testAccCynosdbAuditServiceUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "instance_id"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "log_expire_day"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "high_log_expire_day"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "rule_template_ids"), + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_audit_service.example", "audit_all"), + ), + }, + { + ResourceName: "tencentcloud_cynosdb_audit_service.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccCynosdbAuditService = ` +resource "tencentcloud_cynosdb_audit_service" "example" { + instance_id = "cynosdbmysql-31zv4ii1" + log_expire_day = 30 + high_log_expire_day = 7 + audit_all = true +} +` + +const testAccCynosdbAuditServiceUpdate = ` +resource "tencentcloud_cynosdb_audit_service" "example" { + instance_id = "cynosdbmysql-31zv4ii1" + log_expire_day = 30 + high_log_expire_day = 7 + rule_template_ids = ["cynosdb-art-riwq2vx0"] + audit_all = false +} +` diff --git a/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go b/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go index a06a5c0151..adfef4185a 100644 --- a/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go +++ b/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" cynosdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107" + cynosdbv20190107 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/connectivity" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" @@ -3009,3 +3010,47 @@ func (me *CynosdbService) taskStateRefreshFunc(taskId string, failStates []strin return object, *object.Response.TaskList[0].Status, nil } } + +func (me *CynosdbService) DescribeCynosdbAuditServiceById(ctx context.Context, instanceId string) (ret *cynosdb.InstanceAuditStatus, errRet error) { + logId := tccommon.GetLogId(ctx) + request := cynosdb.NewDescribeAuditInstanceListRequest() + response := cynosdb.NewDescribeAuditInstanceListResponse() + request.Offset = helper.Uint64(0) + request.Limit = helper.Uint64(1) + request.Filters = []*cynosdbv20190107.AuditInstanceFilters{ + { + Name: helper.String("InstanceId"), + ExactMatch: helper.Bool(true), + Values: helper.Strings([]string{instanceId}), + }, + } + + 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.UseCynosdbClient().DescribeAuditInstanceList(request) + if e != nil { + return tccommon.RetryError(e) + } + + if result == nil || result.Response == nil || result.Response.Items == nil || len(result.Response.Items) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe audit instance list failed, Response is nil.")) + } + + response = result + return nil + }) + + if err != nil { + errRet = err + return + } + + ret = response.Response.Items[0] + return +} diff --git a/website/docs/r/cynosdb_audit_service.html.markdown b/website/docs/r/cynosdb_audit_service.html.markdown new file mode 100644 index 0000000000..7c1b24b66a --- /dev/null +++ b/website/docs/r/cynosdb_audit_service.html.markdown @@ -0,0 +1,64 @@ +--- +subcategory: "TDSQL-C MySQL(CynosDB)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_cynosdb_audit_service" +sidebar_current: "docs-tencentcloud-resource-cynosdb_audit_service" +description: |- + Provides a resource to create a CynosDB audit service +--- + +# tencentcloud_cynosdb_audit_service + +Provides a resource to create a CynosDB audit service + +## Example Usage + +### If audit_all is true + +```hcl +resource "tencentcloud_cynosdb_audit_service" "example" { + instance_id = "cynosdbmysql-ins-f9j6sopi" + log_expire_day = 30 + high_log_expire_day = 7 + audit_all = true +} +``` + +### If audit_all is false + +```hcl +resource "tencentcloud_cynosdb_audit_service" "example" { + instance_id = "cynosdbmysql-ins-f9j6sopi" + log_expire_day = 30 + high_log_expire_day = 7 + rule_template_ids = ["cynosdb-art-riwq2vx0"] + audit_all = false +} +``` + +## Argument Reference + +The following arguments are supported: + +* `instance_id` - (Required, String, ForceNew) Instance ID. +* `log_expire_day` - (Required, Int) Log retention period. +* `audit_all` - (Optional, Bool) Audit type. true - full audit; default false - rule-based audit. +* `high_log_expire_day` - (Optional, Int) Frequent log retention period. +* `rule_template_ids` - (Optional, Set: [`String`]) Rule template ID set. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + +## Import + +CynosDB audit service can be imported using the id, e.g. + +``` +terraform import tencentcloud_cynosdb_audit_service.example cynosdbmysql-ins-f9j6sopi +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 7e4d1d06fa..cd10641dce 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -4574,6 +4574,9 @@