全部产品
Search
文档中心

CloudOps Orchestration Service:ACS-HBR-SAPHanaRestorationAutomation

更新时间:Jun 28, 2025

Template Name

ACS-HBR-SAPHanaRestorationAutomation

Jalankan Sekarang

Deskripsi Template

Membuat instance SAP HANA tujuan secara otomatis di dalam virtual private cloud (VPC) tempat instance SAP HANA sumber berada, menggunakan layanan Hybrid Backup Recovery (HBR) untuk memulihkan data cadangan dari instance SAP HANA sumber ke instance SAP HANA tujuan, serta memeriksa status instance SAP HANA tujuan.

Tipe Template

Otomatis

Pemilik

Alibaba Cloud

Parameter Input

Parameter

Deskripsi

Tipe

Diperlukan

Nilai Default

Batas

zoneId

ID zona.

String

Ya

vpcId

VPC tempat instance sumber berada.

String

Ya

vSwitchId

vSwitch tempat instance tujuan termasuk.

String

Ya

sourceClusterId

ID instance sumber.

String

Ya

vaultId

ID vault cadangan HBR.

String

Ya

HANASID

SID instance tujuan.

String

Ya

Ekspresi reguler untuk verifikasi string: ^[A-Z][A-Z0-9][A-Z0-9]$

masterPass

Kata sandi akun master untuk instance sumber.

String

Ya

Ekspresi reguler untuk verifikasi string: ^(?=.[0-9].)(?=.[A-Z].)(?=.[a-z].)[a-zA-Z][0-9a-zA-Z_@#$]{7,}$

imageId

Versi sistem operasi instance tujuan.

String

Ya

instanceType

Tipe instance dari instance tujuan.

String

Ya

privateIpAddress

Alamat IP privat instance tujuan.

String

Ya

Ekspresi reguler untuk verifikasi string: ^((192.168

loginPassword

Kata sandi pengguna root untuk instance tujuan.

String

Ya

Ekspresi reguler untuk verifikasi string: ^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$

dataSize

Ukuran direktori /hana/data untuk instance tujuan.

String

Ya

Ekspresi reguler untuk verifikasi string: (^[2-9]\d{1}$)

logSize

Ukuran direktori /hana/log untuk instance tujuan.

String

Ya

Ekspresi reguler untuk verifikasi string: (^[2-9]\d{1}$)

sharedSize

Ukuran direktori /hana/shared untuk instance tujuan.

String

Ya

Ekspresi reguler untuk verifikasi string: (^[2-9]\d{1}$)

mediaPath

Jalur Object Storage Service (OSS) paket perangkat lunak SAP HANA.

String

Ya

Ekspresi reguler untuk verifikasi string: ^(oss

dingTalkWebhook

URL webhook chatbot DingTalk.

String

Ya

databaseName

Instance database.

List

Tidak

['SYSTEMDB@:SYSTEMDB']

customizedImage

Menentukan apakah akan menggunakan gambar kustom.

Boolean

Tidak

False

customizedImageId

ID gambar kustom.

String

Tidak

""

ECSHostname

Nama host tempat instance tujuan berada.

String

Tidak

hana001

Ekspresi reguler untuk verifikasi string: ^([a-zA-Z0-9]

HANAInstanceNumber

Nomor instance tujuan.

String

Tidak

00

Ekspresi reguler untuk verifikasi string: ^([0-8][0-9]

systemDiskCategory

Tipe disk sistem instance tujuan.

String

Tidak

cloud_ssd

systemDiskSize

Ukuran disk sistem instance tujuan.

String

Tidak

100

Ekspresi reguler untuk verifikasi string: (^2[0-9]$)

dataLogDiskCategory

Tipe disk dari file system /hana/data dan /hana/log.

String

Tidak

cloud_ssd

sharedDiskCategory

Tipe disk dari file system /hana/shared untuk instance tujuan.

String

Tidak

cloud_ssd

usrsapDiskCategory

Tipe disk dari file system /usr/sap untuk instance tujuan.

String

Tidak

cloud_ssd

usrsapSize

Ukuran direktori /usr/sap untuk instance tujuan.

String

Tidak

50

Ekspresi reguler untuk verifikasi string: (^[2-9]\d{1}$)

systemUsage

Tipe sistem instance tujuan.

String

Tidak

custom

HANASapSidAdmUid

ID pengguna sidadm untuk instance tujuan.

String

Tidak

1001

Ekspresi reguler untuk verifikasi string: (^[5-9]\d{2}$)

HANASapSysGid

ID grup sapsys untuk instance tujuan.

String

Tidak

79

Ekspresi reguler untuk verifikasi string: (^\d+$)

userName

Nama pengguna instance tujuan.

String

Tidak

SYSTEM

weatherDeleteResource

Menentukan apakah akan mempertahankan sumber daya cloud setelah verifikasi berhasil.

Boolean

Tidak

False

timeout

Periode waktu sumber daya cloud dipertahankan. Satuan: menit.

Number

Tidak

30

Parameter Output

Parameter

Deskripsi

Tipe

Result

String

Kebijakan izin yang diperlukan untuk menjalankan template

Untuk informasi tentang cara membuat peran RAM dan melampirkan kebijakan yang diperlukan pada peran tersebut, lihat Buat Peran RAM dan Lampirkan Kebijakan yang Diperlukan pada Peran Tersebut.

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ecs:DescribeAvailableResource",
                "ecs:DescribeInvocationResults",
                "ecs:DescribeInvocations",
                "ecs:RunCommand"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "hbr:CreateClients",
                "hbr:CreateHanaInstance",
                "hbr:CreateHanaRestore",
                "hbr:DeleteHanaInstance",
                "hbr:DescribeClients",
                "hbr:DescribeHanaBackupSetting",
                "hbr:DescribeHanaBackupsAsync",
                "hbr:DescribeHanaInstances",
                "hbr:DescribeHanaRestores",
                "hbr:DescribeTask",
                "hbr:UpdateHanaBackupSetting"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ros:CreateStack",
                "ros:DeleteStack",
                "ros:GetStack"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "oos:ListExecutions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

Referensi

Untuk informasi lebih lanjut, lihat ACS-HBR-SAPHanaRestorationAutomation.yml di GitHub.

Isi Template

FormatVersion: OOS-2019-06-01
Description:
  en: 'Template ini menggunakan VPC yang ada dan instance SAP HANA (instance sumber) untuk membuat instance SAP satu node (instance tujuan), memulihkan data cadangan instance sumber ke instance tujuan melalui layanan HBR, dan memeriksa status instance tujuan yang telah dipulihkan.'
  name-en: ACS-HBR-SAPHanaRestorationAutomation
Parameters:
  zoneId:
    Type: String
    AssociationProperty: 'ALIYUN::ECS::Instance::ZoneId'
    Label:
      en: Zona Ketersediaan
    Description:
      en: Zona ketersediaan tempat instance SAP HANA akan diterapkan
  vpcId:
    Type: String
    AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
    Label:
      en: ID VPC Sumber
    Description:
      en: ID VPC instance sumber
  vSwitchId:
    Type: String
    AssociationProperty: 'ALIYUN::VPC::VSwitch::VSwitchId'
    Label:
      en: ID VSwitch Tujuan
    Description:
      en: ID VSwitch instance tujuan
  sourceClusterId:
    Label:
      en: ID Instance SAP HANA Sumber
    Description:
      en: 'ID instance SAP HANA sumber, dapat ditemukan di Konsol Cloud Backup - ECS Application Backup - Nama Instance/ID.'
    Type: String
  vaultId:
    Label:
      en: ID Vault Cadangan
    Description:
      en: ID vault cadangan
    Type: String
  databaseName:
    Label:
      en: Daftar Database SAP HANA
    Description:
      en: Daftar database SAP HANA dalam format "<Nama Database SAP HANA Sumber>@<ID Sistem SAP HANA Sumber>". Pisahkan beberapa database SAP HANA dengan baris baru.
    Type: List
    Default:
      - 'SYSTEMDB@<SID>:SYSTEMDB'
  HANASID:
    Type: String
    ConstraintDescription:
      en: '3 karakter, bisa berupa huruf besar atau angka, harus dimulai dengan huruf besar.'
    Label:
      en: SID SAP HANA
    Description:
      en: SID SAP HANA instance tujuan
    AllowedPattern: '^[A-Z][A-Z0-9][A-Z0-9]$'
  masterPass:
    Type: String
    Label:
      en: Kata Sandi Master SAP HANA
    Description:
      en: Kata sandi master SAP HANA
    ConstraintDescription:
      en: 'Harus minimal 8 karakter dengan huruf besar, huruf kecil, dan nilai numerik, dapat menggunakan karakter khusus termasuk(_,@,#,$), tetapi tidak boleh dimulai dengan angka dan karakter khusus.'
    AllowedPattern: '^(?=.*[0-9].*)(?=.*[A-Z].*)(?=.*[a-z].*)[a-zA-Z][0-9a-zA-Z_@#$]{7,}$'
    NoEcho: true
  imageId:
    Type: String
    Label:
      en: Sistem Operasi Dan Versi
    Description:
      en: 'Sistem operasi dan versi: <a href=''https://market.aliyun.com/products/57742013/cmjj00037618.html'' target=''_blank''>SUSE15SP1-SAP</a>, <a href=''https://market.aliyun.com/products/57742013/cmjj00036800.html'' target=''_blank''>SUSE12SP4-SAP</a>, <a href=''https://market.aliyun.com/products/57742013/cmjj031975.html'' target=''_blank''>SUSE12SP3-SAP</a>.'
    AllowedValues:
      - SUSE15SP1-SAP
      - SUSE12SP4-SAP
      - SUSE12SP3-SAP
  customizedImage:
    Type: Boolean
    Label:
      en: Gunakan Gambar Kustom
    Description:
      en: Gunakan gambar kustom atau tidak
    Default: false
  customizedImageId:
    Type: String
    Label:
      en: ID Gambar Kustom
    Description:
      en: Masukkan ID gambar kustom
    Default: ''
  instanceType:
    Type: String
    Label:
      en: Tipe Instance Untuk Host SAP HANA
    Description:
      en: '<font color=''blue''></font><br> [ecs.r5.2xlarge Tipe instance non-sertifikasi 64G]<br>[ecs.r5.4xlarge Tipe instance non-sertifikasi 128G]<br>[ecs.c5.8xlarge <font color=''green''>Tipe instance bersertifikat SAP 64G</font>]<br>[ecs.g5.8xlarge <font color=''green''>Tipe instance bersertifikat SAP 128G</font>]<br>[ecs.r5.8xlarge <font color=''green''>Tipe instance bersertifikat SAP 256G</font>]<br>[ecs.r6.13xlarge <font color=''green''>Tipe instance bersertifikat SAP 384G</font>]<br>[ecs.se1.14xlarge <font color=''green''>Tipe instance bersertifikat SAP 480G</font>]<br>[ecs.r5.16xlarge <font color=''green''>Tipe instance bersertifikat SAP 512G</font>]<br>[ecs.re4.20xlarge <font color=''green''>Tipe instance bersertifikat SAP 960G</font>]<br>[ecs.re4.40xlarge <font color=''green''>Tipe instance bersertifikat SAP 1920G</font>]<br>[ecs.re4e.40xlarge <font color=''green''>Tipe instance bersertifikat SAP 3840G</font>].'
    AllowedValues:
      - ecs.r5.2xlarge(8vCPUs 64GiB)
      - ecs.r5.4xlarge(16vCPUs 128GiB)
      - ecs.c5.8xlarge(32vCPUs 64GiB)
      - ecs.g5.8xlarge(32vCPUs 128GiB)
      - ecs.r5.8xlarge(32vCPUs 256GiB)
      - ecs.r6.13xlarge(52vCPUs 384GiB)
      - ecs.se1.14xlarge(56vCPUs 480GiB)
      - ecs.r5.16xlarge(64vCPUs 512GiB)
      - ecs.re4.20xlarge(80vCPUs 960GiB)
      - ecs.re4.40xlarge(160vCPUs 1920GiB)
      - ecs.re4e.40xlarge(160vCPUs 3840GiB)
  ECSHostname:
    Type: String
    Label:
      en: Nama Host
    Description:
      en: Nama host ECS SAP HANA
    Default: hana001
    AllowedPattern: '^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-])*([a-zA-Z0-9])$'
    ConstraintDescription:
      en: 'Panjangnya 2-13 karakter, dapat dimulai dengan huruf besar atau kecil, dan dapat berisi angka, atau -, tetapi tidak dapat dimulai dengan - atau diakhiri dengan -.'
  privateIpAddress:
    Type: String
    Label:
      en: Alamat IP Privat
    Description:
      en: 'Alamat IP privat untuk host ECS SAP HANA, harap perhatikan: alamat IP harus berada dalam blok CIDR VSwitch.'
    ConstraintDescription:
      en: Harap masukkan alamat IP privat yang benar
    AllowedPattern: '^((192\.168|172\.([1][6-9]|[2]\d|3[01]))(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}|(\D)*10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3})$'
  loginPassword:
    Type: String
    Label:
      en: Kata Sandi root
    Description:
      en: Kata sandi root ECS SAP HANA
    AllowedPattern: '^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$'
    ConstraintDescription:
      en: '8-30 karakter, termasuk(huruf besar, huruf kecil, angka atau karakter khusus).'
    NoEcho: true
  HANAInstanceNumber:
    Type: String
    Label:
      en: Nomor Instance SAP HANA
    Description:
      en: Nomor instance SAP HANA
    ConstraintDescription:
      en: '2 angka, 00-97.'
    AllowedPattern: '^([0-8][0-9]|9[0-6])$'
    Default: '00'
  systemDiskCategory:
    Default: cloud_ssd
    AllowedValues:
      - cloud_efficiency
      - cloud_ssd
    Label:
      en: Tipe Disk Sistem
    Description:
      en: 'Kategori disk sistem: Ultra Disk, SSD disk.'
    Type: String
  systemDiskSize:
    Default: '100'
    Type: String
    Label:
      en: Ukuran Disk Sistem
    Description:
      en: 'Ukuran file system /, satuan: GB, rentang: 20~500G.'
    ConstraintDescription:
      en: 'Harus berupa bilangan bulat, rentang: 20~500G.'
    AllowedPattern: '(^2[0-9]$)|(^[3-9]\d$)|(^[1-4]\d{2}$)|500$'
  dataLogDiskCategory:
    Default: cloud_ssd
    AllowedValues:
      - cloud_essd PL1
      - cloud_essd PL2
      - cloud_essd PL3
      - cloud_ssd
    Label:
      en: Kategori Disk File System /hana/data Dan /hana/log
    Description:
      en: '1. Kategori disk file system /hana/data dan /hana/log: ESSD disk, SSD disk.<br>2. Semakin tinggi level performa yang dapat Anda pilih. Misalnya, PL2 tersedia untuk SSD yang ditingkatkan lebih dari 460 GiB dan PL3 tersedia untuk SSD yang ditingkatkan lebih dari 1260 GiB. Level performa yang lebih tinggi menunjukkan biaya yang lebih tinggi:<ul><li>    cloud_essd PL1(hingga 50.000 IOPS per disk)</li><li>    cloud_essd PL2(hingga 100.000 IOPS per disk)</li><li>    cloud_essd PL3(hingga 1.000.000 IOPS per disk)</li></ul>
    Type: String
  dataSize:
    Type: String
    Label:
      en: Ukuran File System /hana/data
    Description:
      en: 'Ukuran file system /hana/data, satuan: GB, rekomendasi SAP: Ukuran >= 1 x RAM.'
    ConstraintDescription:
      en: 'Harus berupa bilangan bulat, rentang: 20~32768G.'
    AllowedPattern: '(^[2-9]\d{1}$)|(^[1-9]\d{2}$)|(^[1-9]\d{3}$)|(^[1-2]\d{4}$)|(^3[0-2][0-7][0-6][0-8]$)'
  logSize:
    Type: String
    Label:
      en: Ukuran File System /hana/log
    Description:
      en: 'Ukuran file system /hana/log, satuan: GB, rekomendasi SAP:[sistem ≤ 515GB] Sizeredolog = 1/2 x RAM;[sistem > 512GB] Sizeredolog(min) = 512GB.'
    ConstraintDescription:
      en: 'Harus berupa bilangan bulat, rentang: 20~32768G.'
    AllowedPattern: '(^[2-9]\d{1}$)|(^[1-9]\d{2}$)|(^[1-9]\d{3}$)|(^[1-2]\d{4}$)|(^3[0-2][0-7][0-6][0-8]$)'
  sharedDiskCategory:
    Default: cloud_ssd
    AllowedValues:
      - cloud_efficiency
      - cloud_ssd
      - cloud_essd
    Label:
      en: Kategori Disk File System /hana/shared
    Description:
      en: 'Kategori disk file system /hana/shared: Ultra Disk, SSD disk, ESSD disk.'
    Type: String
  sharedSize:
    Type: String
    Label:
      en: Ukuran File System /hana/shared
    Description:
      en: 'Ukuran file system /hana/shared, satuan: GB, rekomendasi SAP: Ukuraninstalasi(single-node) = MIN(1 x RAM; 1 TB).'
    ConstraintDescription:
      en: 'Harus berupa bilangan bulat, rentang: 20~32768G.'
    AllowedPattern: '(^[2-9]\d{1}$)|(^[1-9]\d{2}$)|(^[1-9]\d{3}$)|(^[1-2]\d{4}$)|(^3[0-2][0-7][0-6][0-8]$)'
  usrsapDiskCategory:
    Default: cloud_ssd
    AllowedValues:
      - cloud_efficiency
      - cloud_ssd
      - cloud_essd
    Label:
      en: Kategori Disk File System /usr/sap
    Description:
      en: 'Kategori disk file system /usr/sap: Ultra Disk, SSD disk, ESSD disk.'
    Type: String
  usrsapSize:
    Type: String
    Label:
      en: Ukuran File System /usr/sap
    Description:
      en: 'Ukuran file system /usr/sap, satuan: GB.'
    Default: '50'
    ConstraintDescription:
      en: 'Harus berupa bilangan bulat, rentang: 20~32768G.'
    AllowedPattern: '(^[2-9]\d{1}$)|(^[1-9]\d{2}$)|(^[1-9]\d{3}$)|(^[1-2]\d{4}$)|(^3[0-2][0-7][0-6][0-8]$)'
  mediaPath:
    Type: String
    Label:
      en: Jalur OSS Perangkat Lunak SAP HANA
    Description:
      en: 'Silakan unduh media instalasi SAP HANA dari pusat unduhan perangkat lunak SAP (Tidak perlu mengekstrak, paketnya seperti ini: 51053381_part1.exe atau .rar) dan unggah ke bucket OSS, masukkan jalur lengkap yang dimulai dengan oss://. contoh: oss://{bucket_name}/hana.'
    ConstraintDescription:
      en: 'Dimulai dengan oss. contoh: oss://{bucket_name}/hana.'
    AllowedPattern: '^(oss|https|http)://[\S\w]+([\S\w])+$'
  systemUsage:
    Type: String
    Label:
      en: Penggunaan Sistem SAP HANA
    Description:
      en: 'Penggunaan sistem SAP HANA(custom, development, test, production).'
    Default: custom
    AllowedValues:
      - custom
      - development
      - test
      - production
  HANASapSidAdmUid:
    Type: String
    Label:
      en: ID Pengguna sidadm SAP HANA
    Description:
      en: 'ID pengguna sidadm, hanya angka, rentang: 500~65532, nilai default: 1001.'
    Default: '1001'
    ConstraintDescription:
      en: 'Hanya angka, rentang: 500~65532.'
    AllowedPattern: '(^[5-9]\d{2}$)|(^[1-9]\d{3}$)|(^[1-5]\d{4}$)|(^6[0-5][0-5][0-3][0-2]$)'
  HANASapSysGid:
    Type: String
    Label:
      en: ID Grup sapsys SAP HANA
    Description:
      en: 'ID grup sapsys, hanya angka, nilai default: 79.'
    Default: '79'
    ConstraintDescription:
      en: Hanya angka
    AllowedPattern: (^\d+$)
  userName:
    Label:
      en: Nama Pengguna SYSTEMDB
    Description:
      en: Masukkan nama pengguna SYSTEMDB.
    Type: String
    Default: SYSTEM
  weatherDeleteResource:
    Label:
      en: Pertahankan Sumber Daya Cloud
    Description:
      en: 'Apakah akan mempertahankan sumber daya cloud setelah verifikasi cadangan berhasil, secara default tidak dipertahankan. Saat parameter ini dipilih dan cadangan berhasil dipulihkan, parameter "Durasi Pemeliharaan Sumber Daya Cloud" akan menjadi tidak valid.'
    Type: Boolean
    Default: false
  timeout:
    Label:
      en: 'Durasi Pemeliharaan Sumber Daya Cloud (Satuan: Menit)'
    Description:
      en: 'Setelah pengujian selesai/gagal, durasi pemeliharaan sumber daya cloud (satuan: menit).'
    Type: Number
    Default: '30'
  dingTalkWebhook:
    Label:
      en: Webhook Robot DingTalk
    Description:
      en: 'Mengirim notifikasi ke DingTalk melalui webhook untuk meminta persetujuan. Eksekusi tetap tertunda hingga disetujui atau ditolak. Silakan merujuk https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq untuk detail lebih lanjut.'
    Type: String
Tasks:
  - Name: checkHanaInstanceType
    Action: 'ACS::CheckFor'
    Description:
      en: Memeriksa ketersediaan tipe instance SAP HANA di zona tersedia saat ini
    Properties:
      Service: ECS
      API: DescribeAvailableResource
      Parameters:
        ZoneId: '{{ zoneId }}'
        RegionId: '{{ACS::RegionId}}'
        InstanceType:
          'Fn::Select':
            - 0
            - 'Fn::Split':
                - (
                - '{{ instanceType }}'
        DestinationResource: InstanceType
      PropertySelector: 'AvailableZones.AvailableZone[0].Status'
      DesiredValues:
        - Available
    Retries: 2
  - Name: checkHanaBackupSetting
    Action: 'ACS::CheckFor'
    Description:
      en: Memeriksa pengaturan cadangan SAP HANA sumber
    Properties:
      Service: HBR
      API: DescribeHanaBackupSetting
      Parameters:
        VaultId: '{{ vaultId }}'
        ClusterId: '{{ sourceClusterId }}'
        DatabaseName: 
          'Fn::Select':
            - 0
            - 'Fn::Split':
              - '@'
              - '{{ ACS::TaskLoopItem }}'
      PropertySelector: HanaBackupSetting.CatalogBackupUsingBackint
      DesiredValues:
        - true
    Retries: 2
    Loop:
      Items: '{{ databaseName }}'
      RateControl:
        MaxErrors: 0
        Mode: Concurrency
        Concurrency: 1
  - Name: createStack
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Membuat stack node tunggal SAP HANA.
    Properties:
      Service: ROS
      API: CreateStack
      Parameters:
        StackName: 'HBR-{{ACS::ExecutionId}}'
        TimeoutInMinutes: 60
        DisableRollback: true
        Parameters:
          - ParameterKey: ImageId
            ParameterValue: '{{ imageId }}'
          - ParameterKey: CustomizedImageId
            ParameterValue: '{{ customizedImageId }}'
          - ParameterKey: CustomizedImage
            ParameterValue: '{{ customizedImage }}'
          - ParameterKey: ZoneId
            ParameterValue: '{{ zoneId }}'
          - ParameterKey: VpcId
            ParameterValue: '{{ vpcId }}'
          - ParameterKey: VSwitchId
            ParameterValue: '{{ vSwitchId }}'
          - ParameterKey: InstanceType
            ParameterValue: '{{ instanceType }}'
          - ParameterKey: ECSHostname
            ParameterValue: '{{ ECSHostname }}'
          - ParameterKey: PrivateIpAddress
            ParameterValue: '{{ privateIpAddress }}'
          - ParameterKey: LoginPassword
            ParameterValue: '{{ loginPassword }}'
          - ParameterKey: HANASID
            ParameterValue: '{{ HANASID }}'
          - ParameterKey: HANAInstanceNumber
            ParameterValue: '{{ HANAInstanceNumber }}'
          - ParameterKey: SystemDiskCategory
            ParameterValue: '{{ systemDiskCategory }}'
          - ParameterKey: SystemDiskSize
            ParameterValue: '{{ systemDiskSize }}'
          - ParameterKey: DataLogDiskCategory
            ParameterValue: '{{ dataLogDiskCategory }}'
          - ParameterKey: DataSize
            ParameterValue: '{{ dataSize }}'
          - ParameterKey: LogSize
            ParameterValue: '{{ logSize }}'
          - ParameterKey: SharedDiskCategory
            ParameterValue: '{{ sharedDiskCategory }}'
          - ParameterKey: SharedSize
            ParameterValue: '{{ sharedSize }}'
          - ParameterKey: UsrsapDiskCategory
            ParameterValue: '{{ usrsapDiskCategory }}'
          - ParameterKey: UsrsapSize
            ParameterValue: '{{ usrsapSize }}'
          - ParameterKey: MasterPass
            ParameterValue: '{{ masterPass }}'
          - ParameterKey: MediaPath
            ParameterValue: '{{ mediaPath }}'
          - ParameterKey: SystemUsage
            ParameterValue: '{{ SystemUsage }}'
          - ParameterKey: HANASapSidAdmUid
            ParameterValue: '{{ HANASapSidAdmUid }}'
          - ParameterKey: HANASapSysGid
            ParameterValue: '{{ HANASapSysGid }}'
        TemplateURL: 'https://sap-automation-{{ACS::RegionId}}.oss-{{ACS::RegionId}}.aliyuncs.com/Public_V1/HANA/HANA_Single_Node.json'
    Outputs:
      StackId:
        Type: String
        ValueSelector: StackId
  - Name: untilStackReady
    Action: 'ACS::WaitFor'
    OnError: getExecutionFaildMessage
    Description:
      en: Tunggu status stack hingga CREATE_COMPLETE
    DelayType: Constant
    Delay: 300
    Retries: 12
    Properties:
      Service: ROS
      API: GetStack
      Parameters:
        StackId: '{{createStack.StackId}}'
      DesiredValues:
        - CREATE_COMPLETE
      StopRetryValues:
        - CREATE_FAILED
        - CHECK_FAILED
        - ROLLBACK_FAILED
        - ROLLBACK_COMPLETE
        - CREATE_ROLLBACK_COMPLETE
        - CREATE_ROLLBACK_FAILED
      PropertySelector: Status
    Outputs:
      HANAServerId:
        Type: String
        ValueSelector: '.Outputs[] | select(.OutputKey == "HANAServerId") | .OutputValue'
      HANAServerLog:
        Type: Json
        ValueSelector: '.Outputs[] | select(.OutputKey == "InstallLog") | .OutputValue'
  - Name: checkHanaServerLog
    Action: 'ACS::CheckFor'
    OnError: getExecutionFaildMessage
    Description:
      en: Memeriksa log instalasi SAP HANA
    Properties:
      Service: ROS
      API: GetStack
      Parameters:
        StackId: '{{createStack.StackId}}'
      PropertySelector: '.Outputs[] | select(.OutputKey == "InstallLog") | .OutputValue'
      DesiredValues:
        - '{"HANANode": "SUCCESS"}'
    Retries: 2
  - Name: createHANAInstance
    Action: 'ACS::ExecuteAPI'
    OnError: getExecutionFaildMessage
    Description:
      en: Membuat instance SAP HANA HBR
    Properties:
      Service: HBR
      API: CreateHanaInstance
      Parameters:
        VaultId: '{{ vaultId }}'
        EcsInstanceId: '{{ untilStackReady.HANAServerId }}'
        Host: '{{ privateIpAddress }}'
        HanaName: '{{ ECSHostname }}'
        InstanceNumber: '{{ HANAInstanceNumber }}'
        UserName: '{{ userName }}'
        Password: '{{ masterPass }}'
        UseSsl: true
    Outputs:
      ClusterId:
        Type: String
        ValueSelector: ClusterId
  - Name: createClients
    Action: 'ACS::ExecuteAPI'
    OnError: getExecutionFaildMessage
    Description:
      en: Membuat klien instance SAP HANA HBR
    Properties:
      Service: HBR
      API: CreateClients
      Parameters:
        VaultId: '{{ vaultId }}'
        AlertSetting: INHERITED
        ClientInfo:
          - instanceId: '{{ untilStackReady.HANAServerId }}'
            accessKeyId: ''
            accessKeySecret: ''
            clusterId: '{{ createHANAInstance.ClusterId }}'
            sourceTypes:
              - HANA
    Outputs:
      TaskId:
        Type: String
        ValueSelector: TaskId
  - Name: waitForCreateClient
    Action: 'ACS::WaitFor'
    OnError: getExecutionFaildMessage
    Description:
      en: Menunggu klien dibuat
    DelayType: Constant
    Delay: 5
    Retries: 15
    Properties:
      Service: HBR
      API: DescribeTask
      Parameters:
        TaskId: '{{ createClients.TaskId }}'
      PropertySelector: Description
      StopRetryValues:
        - completed
      DesiredValues:
        - completed
  - Name: waitForActivateClient
    Action: 'ACS::WaitFor'
    OnError: getExecutionFaildMessage
    Description:
      en: Menunggu aktivasi klien selesai
    Properties:
      Service: HBR
      API: DescribeClients
      Parameters:
        ClusterId: '{{ createHANAInstance.ClusterId }}'
        VaultId: '{{ vaultId }}'
        SourceType: HANA
        ClientType: ECS_AGENT
      PropertySelector: 'Clients.Client[].Status'
      StopRetryValues:
        - ACTIVATED
        - INSTALL_FAILED
      DesiredValues:
        - ACTIVATED
    Retries: 5
    Outputs:
      ClientId:
        Type: String
        ValueSelector: 'Clients.Client[].ClientId'
  - Name: RestoreBuckup
    Action: 'ACS::HBR::RestoreHanaDatabaseBackup'
    OnError: getExecutionFaildMessage
    Description:
      en: Memulihkan dan memverifikasi cadangan
    Properties:
      vaultId: '{{ vaultId }}'
      sourceClusterId: '{{ sourceClusterId }}'
      sourceSystemName:
        'Fn::Select':
          - 0
          - 'Fn::Split':
            - ':'
            - '{{ ACS::TaskLoopItem }}'
      clusterId: '{{ createHANAInstance.ClusterId }}'
      databaseName:
        'Fn::Select':
          - 1
          - 'Fn::Split':
            - ':'
            - '{{ ACS::TaskLoopItem }}'
      HANAInstanceServerId: '{{ untilStackReady.HANAServerId }}'
      HANASID: '{{ HANASID }}'
      masterClientId: '{{ waitForActivateClient.ClientId }}'
    Loop:
      Items: '{{ databaseName }}'
      RateControl:
        MaxErrors: 0
        Mode: Concurrency
        Concurrency: 1
  - Name: runCommand
    Action: 'ACS::ECS::RunCommand'
    OnSuccess: DingTalkNotify
    OnError: getExecutionFaildMessage
    Description:
      en: Memverifikasi status operasi instance SAP HANA
    Properties:
      regionId: '{{ ACS::RegionId }}'
      commandContent:
        'Fn::Join':
          - ''
          - - 'su - '
            - 'Fn::Jq':
                - First
                - .key | ascii_downcase
                - key: '{{ HANASID }}'
            - 'adm -c "sapcontrol -nr '
            - '{{ HANAInstanceNumber }}'
            - ' -function GetProcessList"; if [[ $?  -eq 3 ]]; then exit 0;fi'
      instanceId: '{{ untilStackReady.HANAServerId }}'
      commandType: RunShellScript
      timeout: '180'
    Outputs:
      commandOutputs:
        Type: String
        ValueSelector: invocationOutput
  - Name: getExecutionFaildMessage
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Mendapatkan informasi kegagalan eksekusi
    Properties:
      Service: OOS
      API: ListExecutions
      Parameters:
        ExecutionId: '{{ ACS::ExecutionId }}'
    Outputs:
      statusMessage:
        Type: String
        ValueSelector: 'Executions[].StatusMessage'
  - Name: DingTalkNotifyExecutionFailed
    Action: 'ACS::Notify'
    OnSuccess: sleepTask
    Description:
      en: Notifikasi pesan kegagalan eksekusi
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: '{{ dingTalkWebhook }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: markdown
          markdown:
            title: '{{ ACS::CurrentUTCTime }}-Laporan kegagalan tes HBR'
            text:
              'Fn::Join':
                - |+


                - - '#### {{ ACS::CurrentUTCTime }}-Laporan kegagalan tes HBR'
                  - 'Periksa database:{{ databaseName }}'
                  - 'Pesan kesalahan:{{ getExecutionFaildMessage.statusMessage }}'
                  - '**Tes akan membersihkan sumber daya cloud uji secara otomatis setelah {{ timeout }} menit. Untuk mempertahankan sumber daya cloud, buka [Konsol OOS](https://oos.console.alibabacloud.com/{{ ACS::RegionId }}/execution/detail/{{ ACS::ExecutionId }}) untuk membatalkan eksekusi**'
          at:
            atMobiles: []
            isAtAll: true
  - Name: DingTalkNotify
    Action: 'ACS::Notify'
    Description:
      en: Memberi tahu hasil tes
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: '{{ dingTalkWebhook }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: markdown
          markdown:
            title: '{{ ACS::CurrentUTCTime }}-Laporan tes HBR'
            text:
              'Fn::Join':
                - |+


                - - '#### {{ ACS::CurrentUTCTime }}-Laporan tes HBR'
                  - Hasil tes: SUCCESS
                  - 'Periksa database:{{ databaseName }}'
                  - 'Instance tujuan:{{ ECSHostname }}'
                  - 'ID instance tujuan:{{ untilStackReady.HANAServerId }}'
                  - '**Tes akan membersihkan sumber daya cloud uji secara otomatis setelah {{ timeout }} menit. Untuk mempertahankan sumber daya cloud, buka [Konsol OOS](https://oos.console.alibabacloud.com/{{ ACS::RegionId }}/execution/detail/{{ ACS::ExecutionId }}) untuk membatalkan eksekusi**'
          at:
            atMobiles: []
            isAtAll: true
  - Name: whetherDeleteResource
    Action: 'ACS::Choice'
    Properties:
      DefaultTask: sleepTask
      Choices:
        - When: '{{ weatherDeleteResource }}'
          NextTask: 'ACS::END'
  - Name: sleepTask
    Action: 'ACS::Sleep'
    Properties:
      Duration: 'PT{{ timeout }}M'
  - Name: deleteStack
    Action: 'ACS::ExecuteApi'
    OnError: getCleanupFaildMessage
    Description:
      en: Menghapus stack
    Properties:
      Service: ROS
      API: DeleteStack
      Parameters:
        StackId: '{{createStack.StackId}}'
  - Name: describeHanaInstances
    Action: 'ACS::ExecuteAPI'
    OnError: getCleanupFaildMessage
    Description:
      en: Meminta instance SAP HANA HBR
    Properties:
      Service: HBR
      API: DescribeHanaInstances
      Parameters:
        VaultId: '{{ vaultId }}'
    Outputs:
      Hanas:
        Type: Json
        ValueSelector: Hanas
  - Name: whetherDeleteHanaInstances
    Action: 'ACS::Choice'
    Properties:
      DefaultTask: untilStackCleanup
      Choices:
        - When:
            'Fn::Equals':
              - '{{ ECSHostname }}'
              - 'Fn::Jq':
                  - First
                  - '.key.Hana[] | select(.Host == "{{ privateIpAddress }}") | .HanaName'
                  - key: '{{ describeHanaInstances.Hanas }}'
          NextTask: deleteHanaInstance
  - Name: deleteHanaInstance
    Action: 'ACS::ExecuteApi'
    OnError: getCleanupFaildMessage
    Description:
      en: Menghapus stack
    Properties:
      Service: HBR
      API: DeleteHanaInstance
      Parameters:
        VaultId: '{{ vaultId }}'
        ClusterId: '{{ createHANAInstance.ClusterId }}'
        Sid: '{{ HANASID }}'
  - Name: untilStackCleanup
    Action: 'ACS::WaitFor'
    OnError: getCleanupFaildMessage
    OnSuccess: 'ACS::END'
    Description:
      en: Tunggu status stack hingga DELETE_COMPLETE
    DelayType: Constant
    Delay: 300
    Retries: 12
    Properties:
      Service: ROS
      API: GetStack
      Parameters:
        StackId: '{{createStack.StackId}}'
      DesiredValues:
        - DELETE_COMPLETE
      StopRetryValues:
        - DELETE_FAILED
        - DELETE_COMPLETE
      PropertySelector: Status
  - Name: getCleanupFaildMessage
    Action: 'ACS::ExecuteAPI'
    Description:
      en: Mendapatkan informasi kegagalan pembersihan
    Properties:
      Service: OOS
      API: ListExecutions
      Parameters:
        ExecutionId: '{{ ACS::ExecutionId }}'
    Outputs:
      statusMessage:
        Type: String
        ValueSelector: 'Executions[].StatusMessage'
  - Name: DingTalkNotifyCleanupFailed
    Action: 'ACS::Notify'
    Description:
      en: Notifikasi kegagalan pembersihan
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: '{{ dingTalkWebhook }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: markdown
          markdown:
            title: '{{ ACS::CurrentUTCTime }}-Laporan kegagalan pembersihan dalam tes HBR'
            text:
              'Fn::Join':
                - |+


                - - '#### {{ ACS::CurrentUTCTime }}-Laporan kegagalan pembersihan dalam tes HBR'
                  - 'Periksa database:{{ databaseName }}'
                  -'Pesan kesalahan :{{ getCleanupFaildMessage.statusMessage }}'
                  - '**Gagal membersihkan sumber daya cloud secara otomatis. Anda harus membersihkan sumber daya cloud secara manual**'
          at:
            atMobiles: []
            isAtAll: true
Outputs:
  Result:
    Type: String
    Value: '{{ untilStackReady.HANAServerId }}'