すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Terraform を使用したアプリケーションのバックアップと復元

最終更新日:Aug 27, 2026

Terraform のカスタムリソースを使用して、ACK でバックアップボールト、スケジュール、クロスクラスター復元を管理します。

前提条件

開始する前に、次の条件を満たしていることを確認してください。

使用上の注意

  • kubectl delete を実行してバックアップタスクや復元タスクを削除しないでください。クラウドリソースが完全にクリーンアップされない可能性があります。詳細については、「ステップ5:リソースの削除」をご参照ください。

  • migrate-controller を最新の状態に保ってください。詳細については、「コンポーネントの管理」をご参照ください。

  • 以下のサンプルコードからパラメータを削除しないでください。パラメータが不足すると、バックアップの復元ができなくなる可能性があります。

ステップ1:クラスターへの接続

Terraform Kubernetes プロバイダーを使用して、KubeConfig ファイル経由でクラスターに接続します。

  1. Terraform 作業ディレクトリを作成します。

  2. このディレクトリ内に、csdr.tf という名前のファイルを作成します。

    provider "kubernetes" {
      config_path = "~/.kube/config"
    }
  3. Terraform を初期化します。

    terraform init

    出力を展開して表示

    Initializing the backend...
    
    Initializing provider plugins...
    - Reusing previous version of hashicorp/alicloud from the dependency lock file
    - Reusing previous version of hashicorp/kubernetes from the dependency lock file
    - Using previously-installed hashicorp/alicloud v1.223.1
    - Using previously-installed hashicorp/kubernetes v2.30.0
    
    ╷
    │ Warning: Additional provider information from registry
    │
    │ The remote registry returned warnings for registry.terraform.io/hashicorp/alicloud:
    │ - For users on Terraform 0.13 or greater, this provider has moved to aliyun/alicloud. Please
    │ update your source in required_providers.
    ╵
    
    Terraform has been successfully initialized!

ステップ2:バックアップボールトの作成

バックアップボールト (BackupLocation CR) は、バックアップ用の OSS バケットとアクセス方法を指定します。

  1. csdr.tf に次の内容を追加し、プレースホルダーを置き換えます。

    パラメータ 必須 説明
    name はい バックアップボールトの名前。Kubernetes の命名規則に準拠する必要があります。
    network はい OSS バケットへのアクセスに使用するネットワークモードです。internal:すべてのクラスターがバケットと同じリージョンに存在する必要があります。public:リージョンの制限はありません。
    region はい OSS バケットが配置されているリージョン。
    bucket はい OSS バケット名。cnfs-oss- で始まる必要があります。
    prefix いいえ バックアップを保存する OSS バケット内のサブディレクトリ。
    provider はい クラウドプロバイダー。alibabacloud に設定します。
    resource "kubernetes_manifest" "backuplocation-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "BackupLocation"
        metadata = {
          name      = "<your-backup-vault-name>"   # Kubernetes の命名規則に準拠する必要があります
          namespace = "csdr"
        }
    
        spec = {
          backupSyncPeriod = "0s"
          config = {
            network = "internal"    # "internal": バケットとクラスターは同じリージョンに存在する必要があります
                                    # "public": リージョンの制限はありません
            region  = "cn-beijing"  # OSS バケットが配置されているリージョン
          }
          objectStorage = {
            bucket = "<cnfs-oss-your-bucket-name>"  # cnfs-oss- で始まる必要があります
            prefix = "<sub-directory>"              # オプション: このサブディレクトリにバックアップを保存します
          }
          provider = "alibabacloud"
        }
      }
    
      # バックアップボールトが利用可能になるまで待機します
      wait {
        fields = {
          "status.phase" = "Available"
        }
      }
    
      timeouts {
        create = "10m"
      }
    }
  2. 変更内容をプレビューします。

    terraform plan
  3. バックアップボールトを作成します。

    terraform apply

    レスポンスを展開して表示

    kubernetes_manifest.backuplocation-demo: Creating...
    kubernetes_manifest.backuplocation-demo: Creation complete after 1s
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

ステップ3:バックアップタスクの作成

ACK は 2 つのバックアップモードをサポートしています。即時バックアップ (オンデマンドで 1 回実行) とスケジュールバックアップ (cron スケジュールで実行) です。

即時バックアップタスクの作成

  1. csdr.tf に次の内容を追加し、プレースホルダーを置き換えます。

    ACK クラスターで Velero をご利用の場合、技術サポートについては DingTalk グループ 35532895 にご参加ください。
    パラメータ 必須 説明
    csdr.alibabacloud.com/backuplocations はい バックアップボールトのアノテーション。BackupLocation の設定と完全に一致する必要があります。
    name はい 即時バックアップタスクの名前。
    includedNamespaces はい バックアップする名前空間。
    includedResources いいえ 含めるリソースタイプ。includedResources または excludedResources のいずれか 1 つのみを指定します。両方が空の場合、すべてのリソースタイプがバックアップされます。
    excludedResources いいえ 除外するリソースタイプ。includedResources を参照してください。
    matchLabels いいえ バックアップするリソースのラベル。
    includeClusterResources いいえ クラスター スコープのリソースを制御します。true:すべてのクラスター スコープのリソース。false または未設定:指定された名前空間によって参照されるリソースのみ。ACK コンソールでのデフォルト:false
    defaultPvBackup いいえ true:アプリケーションとボリュームをバックアップします。false:アプリケーションのみをバックアップします。
    storageLocation はい バックアップボールト (BackupLocation) の名前。
    ttl はい バックアップの有効期間。形式:720h0m0s。有効範囲:24h0m0s1572864h0m0s。有効期限が切れたバックアップは復元できません。
    resource "kubernetes_manifest" "applicationbackup-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "ApplicationBackup"
        metadata = {
          name      = "<your-backup-task-name>"
          namespace = "csdr"
          annotations = {
            # バックアップボールトの設定と完全に一致する必要があります
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          includedNamespaces = ["default", "default1"]  # バックアップする名前空間
    
          # includedResources または excludedResources のいずれか 1 つのみを指定します。
          # 両方が空の場合、すべてのリソースタイプがバックアップされます。
          includedResources = ["statefulset"]
          excludedResources = ["excludedResources"]
    
          labelSelector = {
            matchLabels = {
              "app" = "mysql-sts"  # オプション: これらのラベルを持つリソースのみをバックアップします
            }
          }
    
          pvBackup = {
            defaultPvBackup = "false"  # "true": アプリケーションとボリュームをバックアップ、"false": アプリケーションのみ
          }
    
          storageLocation = "<your-backup-vault-name>"  # BackupLocation 名と一致する必要があります
    
          ttl = "720h0m0s"  # バックアップの有効期間。形式:720h0m0s
                            # 有効範囲:24h0m0s ~ 1572864h0m0s
                            # 有効期限が切れたバックアップは復元できません
    
          # includeClusterResources は、クラスター スコープのリソースを含めるかどうかを制御します:
          # "true"  — すべてのクラスター スコープのリソース (StorageClass、CRD、webhook など) を含めます
          # "false" — 指定された名前空間によって参照されるクラスター スコープのリソースのみを含めます
          #           (たとえば、Pod がクラスターロールを持つサービスアカウントを使用している場合、
          #            そのクラスターロールは自動的に含まれます)
          # 未設定  — 名前空間フィルタリングが使用される場合、"false" と同じ動作
          includeClusterResources = "false"
        }
      }
    
      # バックアップの完了を待機するには、コメントを解除します (スクリプト化されたワークフローに推奨)。
      # バックアップ時間は、アプリケーション数とボリュームデータサイズによって異なります。
      #wait {
      #  fields = {
      #    "status.phase" = "Completed"
      #  }
      #}
      #timeouts {
      #  create = "60m"
      #}
    }
  2. 変更内容をプレビューします。

    terraform plan
  3. 即時バックアップタスクを作成します。

    terraform apply

    出力を展開して表示

    kubernetes_manifest.applicationbackup-demo: Creating...
    kubernetes_manifest.applicationbackup-demo: Creation complete after 1s
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

スケジュールバックアップタスクの作成

  1. csdr.tf に次の内容を追加し、プレースホルダーを置き換えます。

    設定ファイルを展開して表示

    resource "kubernetes_manifest" "backupschedule-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "BackupSchedule"
        metadata = {
          name      = "<your-schedule-name>"
          namespace = "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          # バックアップスケジュールの cron 式 (サーバーのタイムゾーン)。
          # 形式:分 時 日 月 曜日
          # 例:"1 4 * * *" は毎日 04:01 に実行されます。
          schedule = "1 4 * * *"
    
          template = {
            includedNamespaces = ["default", "default1"]
            includedResources  = ["statefulset"]
            excludedResources  = ["excludedResources"]
            labelSelector = {
              matchLabels = {
                "app" = "mysql-sts"
              }
            }
            pvBackup = {
              defaultPvBackup = "false"  # BackupSchedule では必須
            }
            storageLocation         = "<your-backup-vault-name>"
            ttl                     = "720h0m0s"
            includeClusterResources = "false"
          }
        }
      }
    
      wait {
        fields = {
          "status.phase" = "Enabled"
        }
      }
    
      timeouts {
        create = "10m"
      }
    }
    パラメータ 必須 説明
    csdr.alibabacloud.com/backuplocations はい バックアップボールトのアノテーション。BackupLocation の設定と完全に一致する必要があります。
    name はい スケジュールバックアップタスクの名前。
    schedule はい cron 式としてのバックアップ頻度。形式:分 時 日 月 曜日。例:"1 4 * * *" は毎日 04:01 に実行されます。
    includedNamespaces はい バックアップする名前空間。
    includedResources いいえ 含めるリソースタイプ。includedResources または excludedResources のいずれか 1 つのみを指定します。両方が空の場合、すべてのリソースタイプがバックアップされます。
    excludedResources いいえ 除外するリソースタイプ。includedResources の注記を参照してください。
    matchLabels いいえ バックアップするリソースのラベル。
    includeClusterResources いいえ クラスター スコープのリソースを制御します。true:すべてのクラスター スコープのリソース。false または未設定:指定された名前空間によって参照されるリソースのみ。
    defaultPvBackup はい true:アプリケーションとボリュームをバックアップします。false:アプリケーションのみをバックアップします。
    storageLocation はい バックアップボールト (BackupLocation) の名前。
    ttl はい バックアップの有効期間。形式:720h0m0s。有効範囲:24h0m0s1572864h0m0s
  2. 変更内容をプレビューします。

    terraform plan
  3. スケジュールバックアップタスクを作成します。

    terraform apply

    出力を展開して表示

    kubernetes_manifest.backupschedule-demo: Creating...
    kubernetes_manifest.backupschedule-demo: Creation complete after 1s
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

スケジュールバックアップタスクの管理

スケジュールによって作成されたバックアップの検索

特定のスケジュールから作成されたバックアップを一覧表示します。

data "kubernetes_resources" "list-applicationbackup" {
  api_version    = "csdr.alibabacloud.com/v1beta1"
  kind           = "ApplicationBackup"
  namespace      = "csdr"
  label_selector = "csdr/schedule-name=<your-schedule-name>"
}

output "applicationbackup-name" {
  value = data.kubernetes_resources.list-applicationbackup.objects
}

スケジュールバックアップタスクの変更

スケジュール頻度などのパラメータを変更するには、次の手順を実行します。

  1. spec.paused"true" に設定してスケジュールを一時停止し、その後パラメータを更新します。例:

    設定ファイルを展開して表示

    resource "kubernetes_manifest" "backupschedule-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "BackupSchedule"
        metadata = {
          name      = "<your-schedule-name>"
          namespace = "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          paused   = "true"        # 変更する前にスケジュールを一時停止します
          schedule = "0 5 * * *"   # 更新されたバックアップ頻度
          template = {
            includedNamespaces      = ["default", "default1"]
            includedResources       = ["statefulset"]
            excludedResources       = ["excludedResources"]
            labelSelector = {
              matchLabels = {
                "app" = "mysql-sts"
              }
            }
            pvBackup = {
              defaultPvBackup = "false"
            }
            storageLocation         = "<your-backup-vault-name>"
            ttl                     = "720h0m0s"
            includeClusterResources = "false"
          }
        }
      }
      wait {
        fields = {
          "status.phase" = "Paused"  # さらに変更を適用する前に、スケジュールが一時停止されていることを確認します
        }
      }
      timeouts {
        create = "10m"
      }
    }
  2. 変更内容をプレビューします。

    terraform plan
  3. 更新された設定を適用します。

    terraform apply

    出力例:

    kubernetes_manifest.backupschedule-demo: Modifying...
    kubernetes_manifest.backupschedule-demo: Modifications complete after 1s
    
    Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

データ保護 (PvBackup)

backupTypePvBackup に設定すると、ボリュームデータのみをバックアップします。pvcList を指定して特定の PVC をバックアップするか、storageClassList を指定して特定のストレージクラスのボリュームをバックアップします。両方を設定した場合、storageClassList は無視されます。どちらも設定しない場合、含まれる名前空間内のすべてのボリュームがバックアップされます。

即時PvBackupタスクの作成

  1. csdr.tf に次の内容を追加し、必要に応じて値を調整します。

    resource "kubernetes_manifest" "applicationbackup-demo" {
      manifest = {
        apiVersion  = "csdr.alibabacloud.com/v1beta1"
        kind        = "ApplicationBackup"
        metadata = {
          name      = "<yourApplicationBackupName>"
          namespace = "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackuplocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          backupType         = "PvBackup"
          includedNamespaces = ["default", "default1"]
          pvBackup = {
            pvcList = [
              { namespace = "default",  name = "pvc-nas" },
              { namespace = "default1", name = "pvc-oss" }
            ]
            storageClassList = ["disk-essd", "disk-ssd"]
          }
          storageLocation = "<yourBackuplocationName>"
          ttl             = "720h0m0s"
        }
      }
    }
  2. リソースプランを生成します。

    terraform plan
  3. 即時バックアップタスクを作成します。

    terraform apply

PvBackupスケジュールの作成

  1. csdr.tf に次の内容を追加し、必要に応じて値を調整します。

    resource "kubernetes_manifest" "backupschedule-demo" {
      manifest = {
        apiVersion  = "csdr.alibabacloud.com/v1beta1"
        kind        = "BackupSchedule"
        metadata = {
          name      = "<yourBackupScheduleName>"
          namespace = "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackuplocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          schedule = "1 4 * * *"
          template = {
            includedNamespaces = ["default", "default1"]
            pvBackup = {
              pvcList = [
                { namespace = "default",  name = "pvc-nas" },
                { namespace = "default1", name = "pvc-oss" }
              ]
              storageClassList = ["disk-essd", "disk-ssd"]
            }
            storageLocation = "<yourBackuplocationName>"
            ttl             = "720h0m0s"
          }
        }
      }
    }
  2. リソースプランを生成して適用します。

    terraform plan
    terraform apply

ステップ4:復元タスクの作成

復元タスク (ApplicationRestore CR) は、バックアップからアプリケーションを復元します。オプションで名前空間マッピングとストレージクラス変換が可能です。

  1. csdr.tf に次の内容を追加し、プレースホルダーを置き換えます。

    パラメータ 必須 説明
    csdr.alibabacloud.com/backuplocations はい バックアップボールトのアノテーション。BackupLocation の設定と一致する必要があります。
    name はい 復元タスクの名前。
    appRestoreOnly いいえ true:アプリケーションのみを復元します (PersistentVolumeClaim (PVC)、PersistentVolume (PV)、またはボリュームデータは復元しません)。復元前に手動で PVC と PV を作成してください。false:アプリケーションとボリュームデータを復元します。デフォルト:false
    preserveNodePorts いいえ true:元の NodePort 値を保持します。false:NodePort をランダムなポートに再割り当てします。両方のクラスターが同じ NodePort を共有している場合は、false に設定してください。
    includedNamespaces はい 復元する名前空間。空の場合、バックアップされたすべての名前空間が復元されます。
    includedResources いいえ 含めるリソースタイプ。includedResources または excludedResources のいずれか 1 つのみを指定します。
    excludedResources いいえ 除外するリソースタイプ。
    backupName はい 復元元のバックアップ名。スケジュールバックアップの場合、ポイントインタイムバックアップ名を指定します (例:<your-schedule-name>-20221205225845)。
    namespaceMapping いいえ <backup-namespace><target-namespace> にマッピングします。存在しないターゲット名前空間は自動的に作成されます。
    convertedarg いいえ FileSystem タイプのボリューム (OSS、NAS、CPFS、ローカル) のストレージクラス変換リスト。各エントリは convertToStorageClassType (ターゲットストレージクラス。ディスクまたは NAS である必要があり、クラスターに存在する必要があります)、 namespace 、および persistentVolumeClaim を指定します。 kubectl -ncsdr describe <backup-name> を実行して、対象となる PVC を特定してください。
    重要

    ReadWriteMany ボリュームはディスクに変換できません。ReadOnlyMany ボリュームの場合、レプリカが複数のノードに同時にマウントされないようにしてください。

    resource "kubernetes_manifest" "applicationrestore-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "ApplicationRestore"
        metadata = {
          name      = "<your-restoration-task-name>"
          namespace = "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          # "false": アプリケーションとボリュームデータを復元します (デフォルト)
          # "true":  アプリケーションのみを復元します。事前に PVC と PV を手動で作成してください
          appRestoreOnly = "false"
    
          # "true":  バックアップから元の NodePort 値を保持します
          # "false": NodePort をランダムなポートに再割り当てします (バックアップクラスターとターゲットクラスターが同じ NodePort を共有している場合に使用)
          preserveNodePorts = "true"
    
          includedNamespaces = ["default", "default1"]
          includedResources  = ["statefulset"]
          excludedResources  = ["excludedResources"]
    
          # FileSystem タイプのボリューム (OSS、NAS、CPFS、ローカルボリューム) のストレージクラス変換。
          # `kubectl -ncsdr describe ` を実行し、
          # `status.resourceList.dataResource.pvcBackupInfo` を確認して、変換可能な PVC を見つけてください。
          # 重要:ReadWriteMany ボリュームはディスクに変換できません。
          # ReadOnlyMany ボリュームをディスクに変換する場合、レプリカが複数のノードに同時にマウントされないようにしてください。
          convertedarg = [
            {
              convertToStorageClassType = "alicloud-disk-topology-alltype"  # ターゲットストレージクラス (クラスターに存在する必要があります。ディスクまたは NAS のみ)
              namespace                 = "default"
              persistentVolumeClaim     = "pvc-nas"
            },
            {
              convertToStorageClassType = "alicloud-disk-topology-alltype"
              namespace                 = "default1"
              persistentVolumeClaim     = "pvc-oss"
            }
          ]
    
          # 復元元のバックアップ。
          # スケジュールバックアップの場合、ポイントインタイムバックアップ名を指定します。例:
          # "<your-schedule-name>-20221205225845"
          backupName = "<your-backup-task-name>"
    
          # バックアップ内の名前空間をターゲットクラスター内の別の名前空間にマッピングします。
          # ターゲット名前空間が存在しない場合、自動的に作成されます。
          namespaceMapping = {
            "<backup-namespace>" = "<target-namespace>"
          }
        }
      }
    
      # 復元の完了を待機するには、コメントを解除します (スクリプト化されたワークフローに推奨)。
      # 復元時間は、アプリケーション数とボリュームデータサイズによって異なります。
      #wait {
      #  fields = {
      #    "status.phase" = "Completed"
      #  }
      #}
      #timeouts {
      #  create = "60m"
      #}
    }
  2. 変更内容をプレビューします。

    terraform plan
  3. 復元タスクを作成します。

    terraform apply

    レスポンスを展開して表示

    kubernetes_manifest.applicationrestore-demo: Creating...
    kubernetes_manifest.applicationrestore-demo: Creation complete after 1s
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

ステップ5:リソースの削除

重要

バックアップボールト (BackupLocation) は、他のクラスターが依存している可能性があるため削除できません。

スケジュールバックアップタスクの削除

terraform destroy を実行して、BackupSchedule を削除し、スケジュールを停止します。

バックアップタスクまたは復元タスクの削除

DeleteRequest CR を使用して、バックアップタスクまたは復元タスクと関連するクラウドリソースを安全に削除します。

バックアップタスクを削除しても、既存のバックアップには影響しません。復元タスクを削除しても、復元されたデータには影響しません。
  1. csdr.tf に次の内容を追加します。

    パラメータ 必須 説明
    name はい 削除リクエストの名前。形式:バックアップタスクを削除する場合は <ApplicationBackup-name>-dbr、復元タスクを削除する場合は <ApplicationRestore-name>-dbr
    deleteObjectName はい 削除するリソースの名前。
    deleteObjectType はい "Backup":ApplicationBackup CR と関連リソースを削除します。"Restore":ApplicationRestore CR と関連リソースを削除します。
    resource "kubernetes_manifest" "deleterequest-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "DeleteRequest"
        metadata = {
          name      = "<object-name>-dbr"  # 形式:<ApplicationBackup-or-ApplicationRestore-name>-dbr
          namespace = "csdr"
        }
        spec = {
          deleteObjectName = "<object-name>"   # 削除するバックアップタスクまたは復元タスクの名前
          deleteObjectType = "Backup"          # "Backup": ApplicationBackup と関連リソースを削除します
                                               # "Restore": ApplicationRestore と関連リソースを削除します
        }
      }
    }
  2. 変更内容をプレビューします。

    terraform plan
  3. 削除を適用します。

    terraform apply

    出力を展開して表示

    kubernetes_manifest.deleterequest-demo: Creating...
    kubernetes_manifest.deleterequest-demo: Creation complete after 0s
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

    ターゲットリソースを削除した後、システムは DeleteRequest CR も削除します。

次のステップ

関連ドキュメント