"github.com/volcengine/volcengine-go-sdk/service/cbr"
"github.com/volcengine/volcengine-go-sdk/volcengine"
"github.com/volcengine/volcengine-go-sdk/volcengine/credentials"
"github.com/volcengine/volcengine-go-sdk/volcengine/session"
type EcsRecoveryPointMeta struct {
SnapshotList []Snapshot
type EcsRestoreConfiguration struct {
AutoStartUpAfterRecovery bool
RestoreToNewInstance bool
config *volcengine.Config
ak = os.Getenv("VOLCENGINE_ACCESS_KEY_ID")
sk = os.Getenv("VOLCENGINE_ACCESS_KEY_SECRET")
recoveryPointId := "your_recovery_point_id"
restoreName := "manualrecovery_test"
config = volcengine.NewConfig().
WithCredentials(credentials.NewStaticCredentials(ak, sk, "")).
sess, err = session.NewSession(config)
describeRecoveryPointInput := &cbr.DescribeRecoveryPointsInput{
Filters: &cbr.FiltersForDescribeRecoveryPointsInput{
RecoveryPointId: volcengine.String(recoveryPointId),
describeRecoveryPointOutput, err := client.DescribeRecoveryPoints(describeRecoveryPointInput)
if len(describeRecoveryPointOutput.RecoveryPoints) == 0 {
panic("recovery point not found")
recoveryPoint := describeRecoveryPointOutput.RecoveryPoints[0]
extraMetadata := recoveryPoint.ExtraMetadata
meta := &EcsRecoveryPointMeta{}
err = json.Unmarshal([]byte(*extraMetadata), meta)
if len(meta.SnapshotList) == 0 {
panic("snapshot not found")
restoreConfiguration := &EcsRestoreConfiguration{
SnapshotIdList: []string{},
SnapshotGroupId: meta.SnapshotGroupId,
AutoStartUpAfterRecovery: true,
RestoreToNewInstance: false,
restoreConfigurationStr, err := json.Marshal(restoreConfiguration)
createRestoreJobInput := &cbr.CreateRestoreJobInput{
Name: volcengine.String(restoreName),
RecoveryPointId: volcengine.String(recoveryPointId),
ExtraRestoreConfiguration: volcengine.String(string(restoreConfigurationStr)),
createRestoreJobOutput, err := client.CreateRestoreJob(createRestoreJobInput)
jobId := *createRestoreJobOutput.JobId
fmt.Printf("restore job created, job id:%s\n", jobId)
describeRestoreJobInput := &cbr.DescribeRestoreJobsInput{
Filters: &cbr.FiltersForDescribeRestoreJobsInput{
RestoreJobId: volcengine.String(jobId),
describeRestoreJobOutput, err := client.DescribeRestoreJobs(describeRestoreJobInput)
if len(describeRestoreJobOutput.Jobs) == 0 {
panic("restore job not found")
job := describeRestoreJobOutput.Jobs[0]
if *job.Status == cbr.EnumOfStatusForDescribeRestoreJobsOutputCompleted {
fmt.Println("restore job success")
if *job.Status == cbr.EnumOfStatusForDescribeRestoreJobsOutputError {
panic("restore job failed")
fmt.Printf("restore job status:%s\n", *job.Status)
time.Sleep(5 * time.Second)