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

Serverless App Engine:Terraform を使用して SAE アプリケーションの自動スケーリングポリシーを管理する

最終更新日:Mar 12, 2025

スケーラビリティは、分散アプリケーションの O&M 機能を測定する重要な機能です。この機能は、インスタンス数を自動的に増減して、システム容量をスケールインまたはスケールアウトできます。これにより、リソース使用率が向上し、リソース使用コストが削減されます。このトピックでは、Terraform を使用して Serverless App Engine(SAE)アプリケーションの自動スケーリングポリシーを有効および無効にする方法について説明します。

背景

SAE 自動スケーリングポリシーは、スケジュールされた自動スケーリングポリシー、メトリックベースの自動スケーリングポリシー、およびハイブリッド自動スケーリングポリシーに分類されます。SAE アプリケーションの自動スケーリングポリシーを Terraform を使用して有効にする場合は、アプリケーションの作成時に alicloud_sae_application_scaling_rule リソースを構成する必要があります。自動スケーリングポリシーを無効にする場合は、自動スケーリングポリシーとアプリケーションの両方を削除する必要があります。スケジュールされた期間を指定する方法については、「crontab 式を使用する」をご参照ください。

シナリオ

  • スケジュールされた自動スケーリングポリシーは、アプリケーションが特定の期間内にリソースを使用する必要があるシナリオに適しています。スケジュールされた自動スケーリングポリシーは、証券、ヘルスケア、公共事業、教育などの業界で一般的に使用されています。

  • メトリックベースの自動スケーリングポリシーは、アプリケーションがリソースを使用するときにバーストトラフィックと定期的なトラフィックが発生するシナリオに適しています。メトリックベースの自動スケーリングポリシーは、インターネット、ゲーム、ソーシャルメディアなどの業界で一般的に使用されています。

  • ハイブリッド自動スケーリングポリシーは、アプリケーションが特定の期間内にリソースを使用する必要があり、アプリケーションがリソースを使用するときにバーストトラフィックと定期的なトラフィックが発生するシナリオに適しています。ハイブリッド自動スケーリングポリシーは、インターネット、教育、ケータリングなどの業界で一般的に使用されています。

詳細については、「自動スケーリングポリシーを構成する」をご参照ください。

説明

このトピックに記載されているサンプルコードは、数回クリックするだけで実行できます。詳細については、「Terraform Explorer」をご参照ください。

前提条件

  • Alibaba Cloud アカウントは、このアカウントに属するすべてのリソースに対するフル 権限 を持っています。Alibaba Cloud アカウントの認証情報が漏洩した場合、セキュリティリスクが発生する可能性があります。Resource Access Management(RAM)ユーザーを使用し、RAM ユーザーの AccessKey ペアを作成することをお勧めします。詳細については、「RAM ユーザーを作成する」および「AccessKey ペアを作成する」をご参照ください。

  • Terraform でコマンドを実行するために使用する RAM ユーザーには、次のポリシーがアタッチされています。このポリシーには、Terraform でコマンドを実行するために必要な最小 権限 が含まれています。詳細については、「JSON タブでカスタムポリシーを作成する」をご参照ください。

    このカスタムポリシーにより、RAM ユーザーまたはロールは、アプリケーションの作成、更新、削除、開始、停止、デプロイ、ロールバック、および自動スケーリングルールの管理など、SAE アプリケーションのライフサイクル全体を管理できます。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "sae:CreateApplication",
            "sae:UpdateApplication",
            "sae:DeleteApplication",
            "sae:GetApplication",
            "sae:ListApplications",
            "sae:CreateScalingRule",
            "sae:UpdateScalingRule",
            "sae:DeleteScalingRule",
            "sae:GetScalingRule",
            "sae:ListScalingRules",
            "sae:StartApplication",
            "sae:StopApplication",
            "sae:DeployApplication",
            "sae:RollbackApplication"
          ],
          "Resource": "*"
        }
      ]
    }
  • Terraform のランタイム 環境 は、次のいずれかの方法で準備されます。

    • Terraform は、ROS でマネージドサービスとして利用できます。ROS コンソール で Terraform テンプレートをデプロイできます。詳細については、「Terraform スタックを作成する」をご参照ください。

    • Terraform Explorer で Terraform を使用する: Alibaba Cloud は、Terraform のオンラインランタイム 環境 を提供しています。Terraform Explorer 環境 にログインして、Terraform をインストールせずに Terraform を使用できます。この方法は、追加費用なしで Terraform を迅速かつ便利に使用およびデバッグする場合に適しています。

    • Cloud Shell: Alibaba Cloud Cloud Shell は、Terraform がプリインストールされ、認証資格情報が構成されている無料の O&M プロダクトです。そのため、Cloud Shell で Terraform コマンドを実行できます。この方法は、低コストで Terraform に迅速かつ便利にアクセスして使用する場合に適しています。

    • Terraform をインストールして構成する: この方法は、ネットワーク接続が不安定な場合、またはカスタム開発 環境 が必要な場合に適しています。

リソース

スケジュールされた自動スケーリングポリシーを有効にする

この例では、中国 (深セン) リージョンにアプリケーションを作成し、イメージモードでアプリケーションをデプロイし、アプリケーションのスケジュールされた自動スケーリングポリシーを構成する方法を示します。

この例では、スケジュールされた自動スケーリングポリシーは 1 日の間隔で実行されます。ポリシーは、ある日の 19:35 に 5 つのインスタンスに対して初めて実行されます。ポリシーは、同じ日の 20:35 に 2 つのインスタンスに対して 2 回目に実行されます。SAE は、スケジュールされた自動スケーリングポリシーに基づいて、その日の 19:35 から 20:35 までアプリケーションの 5 つのインスタンスを保持し、その日の 20:35 から翌日の 19:35 までアプリケーションの 2 つのインスタンスを保持します。

  1. Terraform リソースを格納するために、terraform という名前のプロジェクトフォルダを作成します。
  2. 次のコマンドを実行して、プロジェクトディレクトリに移動します。

    cd terraform
  3. main.tf という名前の構成ファイルを作成します。

    # Provider 構成
    provider "alicloud" {
      region = var.region_id
    }
    
    # 変数定義
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    variable "app_name" {
      description = "アプリケーションの名前を指定します"
      type        = string
      default     = "app-scaling"
    }
    
    variable "image_url" {
      description = "イメージの URL を指定します"
      type        = string
      default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
    }
    
    variable "namespace_name" {
      description = "名前空間の名前を指定します"
      type        = string
      default     = "demo"
    }
    
    variable "namespace_id" {
      description = "名前空間の ID を指定します"
      type        = string
      default     = "cn-shenzhen:demo"
    }
    
    # 名前空間
    resource "alicloud_sae_namespace" "default" {
      namespace_description = var.namespace_description
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
    }
    
    # VPC
    resource "alicloud_vpc" "default" {
      vpc_name   = var.name
      cidr_block = "10.0.0.0/16"
    }
    
    # VSwitch
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.0.1.0/24"
      vpc_id       = alicloud_vpc.default.id
      zone_id      = var.zone_id
    }
    
    # セキュリティグループ
    resource "alicloud_security_group" "sg" {
      name        = var.name
      description = var.description
      vpc_id      = alicloud_vpc.default.id
    }
    
    resource "alicloud_security_group_rule" "sg_rule" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = var.port_range
      priority          = 1
      security_group_id = alicloud_security_group.sg.id
      cidr_ip           = var.cidr_ip
    }
    
    # アプリケーション構成
    resource "alicloud_sae_application" "default" {
      app_name          = var.app_name
      app_description   = var.app_description
      deploy            = true
      image_url         = var.image_url
      namespace_id      = alicloud_sae_namespace.default.id
      vswitch_id        = alicloud_vswitch.default.id
      vpc_id            = alicloud_vpc.default.id
      security_group_id = alicloud_security_group.sg.id
      package_type      = var.package_type
      timezone          = "Asia/Beijing"
      replicas          = var.replicas
      cpu               = var.cpu
      memory            = var.memory
    }
    
    # 自動スケーリングポリシー
    resource "alicloud_sae_application_scaling_rule" "metrics" {
      app_id              = alicloud_sae_application.default.id
      scaling_rule_name   = "metric-dev"
      scaling_rule_enable = true
      scaling_rule_type   = "mix"
    
      scaling_rule_timer {
        begin_date = "2024-11-26"
        end_date   = "2024-11-30"
        period     = "* * *"
        schedules {
          at_time      = "19:45"
          max_replicas = 50
          min_replicas = 10
        }
        schedules {
          at_time      = "20:45"
          max_replicas = 40
          min_replicas = 3
        }
      }
    
      scaling_rule_metric {
        max_replicas = 40
        min_replicas = 3
        metrics {
          metric_type                       = "CPU"
          metric_target_average_utilization = 1
        }
        scale_up_rules {
          step                         = 10
          disabled                     = false
          stabilization_window_seconds = 0
        }
        scale_down_rules {
          step                         = 10
          disabled                     = false
          stabilization_window_seconds = 10
        }
      }
    }
    
    # その他の変数定義
    variable "namespace_description" {
      description = "名前空間の説明"
      default     = "名前空間"
    }
    
    variable "name" {
      default     = "tf"
      description = "セキュリティグループルールの名前"
      type        = string
    }
    
    variable "description" {
      default     = "セキュリティグループルールの説明"
      description = "セキュリティグループルールの説明"
      type        = string
    }
    
    variable "port_range" {
      default     = "1/65535"
      description = "セキュリティグループルールのポート範囲"
      type        = string
    }
    
    variable "cidr_ip" {
      description = "新しいセキュリティグループルールを作成するために使用される CIDR ブロック"
      type        = string
      default     = "0.0.0.0/0"
    }
    
    variable "zone_id" {
      description = "アベイラビリティーゾーン ID"
      type        = string
      default     = "cn-shenzhen-e"
    }
    
    variable "app_description" {
      default     = "Terraform によって作成された説明"
      description = "アプリケーションの説明"
      type        = string
    }
    
    variable "package_type" {
      default     = "Image"
      description = "アプリケーションのパッケージタイプ"
      type        = string
    }
    
    variable "cpu" {
      default     = "500"
      description = "アプリケーションの CPU (ミリコア単位)"
      type        = string
    }
    
    variable "memory" {
      default     = "1024"
      description = "アプリケーションのメモリ (MB 単位)"
      type        = string
    }
    
    variable "replicas" {
      default     = "1"
      description = "アプリケーションのレプリカ数"
      type        = string
    }
    
    variable "port" {
      description = "SLB のポート"
      type        = string
      default     = "8000"
    }
    
    # 出力
    output "namespace_id" {
      value = alicloud_sae_namespace.default.id
      description = "名前空間 ID"
    }
    
    output "app_id" {
      description = "アプリケーションの ID"
      value       = alicloud_sae_application.default.id
    }
    
    output "app_name" {
      description = "アプリケーションの名前"
      value       = var.app_name
    }
    
  4. 次のコマンドを実行して、構成を初期化します。

terraform init

期待される出力:image

  1. 次の手順を実行して、SAE アプリケーションを作成します。

  2. 次のコマンドを実行して、構成ファイルを実行します。プロンプトが表示されたら yes と入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。

terraform apply

期待される出力:image

  1. 確認

terraform show コマンドを実行する

次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。

terraform show

image

SAE コンソール

app-scaling アプリケーションが作成され、アプリケーションのスケジュールされた自動スケーリングポリシーが有効になります。SAEコンソール にログインし、アプリケーションの [基本情報] ページの [インスタンス情報] タブで自動スケーリングポリシーとインスタンスの状態を表示できます。

image

メトリックベースの自動スケーリングポリシーを有効にする

この例では、スケジュールされた自動スケーリングポリシーを構成するために作成された main.tf ファイルに基づいて、メトリックベースの自動スケーリングポリシーを有効にする方法を示します。alicloud_sae_application_scaling_rule リソースの設定は、メトリックベースの自動スケーリングポリシーの構成に置き換えられます。他の設定は変更されません。詳細については、「スケジュールされた自動スケーリングポリシーを有効にする」をご参照ください。

# 自動スケーリングポリシー
resource "alicloud_sae_application_scaling_rule" "metrics" {
  app_id              = alicloud_sae_application.default.id
  scaling_rule_name   = "metric-dev"
  scaling_rule_enable = true
  scaling_rule_type   = "metric"
  scaling_rule_metric {
    max_replicas = 50
    min_replicas = 3
    metrics {
      metric_type                       = "CPU"
      metric_target_average_utilization = 1
    }
    scale_up_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 0
    }
    scale_down_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 10
    }
  }
}

この例では、CPU 使用率が 1% を超えると、アプリケーションは自動的にスケールアウトされ、最大 50 個のインスタンスを使用できます。CPU 使用率が 1% を下回ると、アプリケーションは自動的にスケールインされ、最小 3 つのインスタンスを使用できます。

説明

サンプルコードでは、テスト結果を表示するために低い CPU 使用率が指定されています。ビジネス要件に基づいて パラメーター 値を指定できます。

  1. 次のコマンドを実行して、構成を初期化します。

terraform init

期待される出力:image

  1. 次の手順を実行して、SAE アプリケーションを作成します。

  2. 次のコマンドを実行して、構成ファイルを実行します。プロンプトが表示されたら yes と入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。

terraform apply

期待される出力:image

  1. 確認

terraform show コマンドを実行する

次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。

terraform show

image

SAE コンソール

app-scaling アプリケーションが作成され、アプリケーションのメトリックベースの自動スケーリングポリシーが有効になります。SAEコンソール にログインし、アプリケーションの [基本情報] ページの [インスタンス情報] タブで自動スケーリングポリシーとインスタンスの状態を表示できます。

image

ハイブリッド自動スケーリングポリシーを有効にする

この例では、スケジュールされた自動スケーリングポリシーを構成するために作成された main.tf ファイルに基づいて、ハイブリッド自動スケーリングポリシーを有効にする方法を示します。alicloud_sae_application_scaling_rule リソースの設定は、ハイブリッド自動スケーリングポリシーの構成に置き換えられます。他の設定は変更されません。詳細については、「スケジュールされた自動スケーリングポリシーを有効にする」をご参照ください。

サンプルコード:

resource "alicloud_sae_application_scaling_rule" "metrics" {
  app_id              = alicloud_sae_application.default.id
  scaling_rule_name   = "metric-dev"
  scaling_rule_enable = true
  scaling_rule_type   = "mix"

  scaling_rule_timer {
    begin_date = "2022-04-20"
    end_date   = "2022-05-31"
    period     = "* * *"
    schedules {
      at_time      = "19:45"
      max_replicas = 50
      min_replicas = 10
    }
    schedules {
      at_time      = "20:45"
      max_replicas = 40
      min_replicas = 3
    }

  }
  scaling_rule_metric {
    max_replicas = 40
    min_replicas = 3
    metrics {
      metric_type                       = "CPU"
      metric_target_average_utilization = 1
    }
    scale_up_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 0
    }
    scale_down_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 10
    }
  }
}

ハイブリッド自動スケーリングポリシーの内容について、以下に説明します。

  • 共通期間:CPU 使用率が 1% を超えると、アプリケーションは自動的にスケールアウトされ、最大 40 個のインスタンスを使用できます。CPU 使用率が 1% を下回ると、アプリケーションは自動的にスケールインされ、最小 3 つのインスタンスを使用できます。

  • 特別期間:2024 年 11 月 26 日から 2022 年 11 月 30 日までは、CPU 使用率のしきい値に基づいてスケジュールされた自動スケーリングポリシーが実行されます。

    • 指定された期間内の 1 日の 19:45 から 20:45 までは、アプリケーションで最小 10 個、最大 50 個のインスタンスを使用できます。

    • 指定された期間内の 1 日の 20:45 から翌日の 20:45 までは、アプリケーションで最小 3 個、最大 40 個のインスタンスを使用できます。

説明

サンプルコードでは、テスト結果を表示するために低い CPU 使用率が指定されています。ビジネス要件に基づいて パラメーター 値を指定できます。

  1. 次のコマンドを実行して、構成を初期化します。

terraform init

期待される出力:image

  1. 次の手順を実行して、SAE アプリケーションを作成します。

  2. 次のコマンドを実行して、構成ファイルを実行します。プロンプトが表示されたら yes と入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。

terraform apply

期待される出力:image

  1. 確認します。

terraform show コマンドを実行する

次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。

terraform show

image

SAE コンソール

app-scaling アプリケーションが作成され、アプリケーションのハイブリッド自動スケーリングポリシーが有効になります。SAEコンソール にログインし、アプリケーションの [基本情報] ページの [インスタンス情報] タブで自動スケーリングポリシーとインスタンスの状態を表示できます。

image

自動スケーリングポリシーを無効にし、アプリケーションを削除する

このセクションでは、自動スケーリングポリシーを無効にし、自動スケーリングポリシーが有効になっているアプリケーションを削除する方法の例を示します。この例では、中国 (杭州) リージョンにある app-scaling アプリケーションが削除されます。

  1. プロジェクトディレクトリで次のコマンドを実行して、構成ファイルを実行します。
    terraform destroy
  2. 期待される出力:image

    自動スケーリングポリシーが無効になり、app-scaling アプリケーションが削除されます。

    完全なコード

    説明

    このトピックに記載されているサンプルコードは、数回クリックするだけで実行できます。詳細については、「Terraform Explorer」をご参照ください。

    # Provider 構成
    provider "alicloud" {
      region = var.region_id
    }
    
    # 変数定義
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    variable "app_name" {
      description = "アプリケーションの名前を指定します"
      type        = string
      default     = "app-scaling"
    }
    
    variable "image_url" {
      description = "イメージの URL を指定します"
      type        = string
      default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
    }
    
    variable "namespace_name" {
      description = "名前空間の名前を指定します"
      type        = string
      default     = "demo"
    }
    
    variable "namespace_id" {
      description = "名前空間の ID を指定します"
      type        = string
      default     = "cn-shenzhen:demo"
    }
    
    # 名前空間
    resource "alicloud_sae_namespace" "default" {
      namespace_description = var.namespace_description
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
    }
    
    # VPC
    resource "alicloud_vpc" "default" {
      vpc_name   = var.name
      cidr_block = "10.0.0.0/16"
    }
    
    # VSwitch
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.0.1.0/24"
      vpc_id       = alicloud_vpc.default.id
      zone_id      = var.zone_id
    }
    
    # セキュリティグループ
    resource "alicloud_security_group" "sg" {
      name        = var.name
      description = var.description
      vpc_id      = alicloud_vpc.default.id
    }
    
    resource "alicloud_security_group_rule" "sg_rule" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = var.port_range
      priority          = 1
      security_group_id = alicloud_security_group.sg.id
      cidr_ip           = var.cidr_ip
    }
    
    # アプリケーション構成
    resource "alicloud_sae_application" "default" {
      app_name          = var.app_name
      app_description   = var.app_description
      deploy            = true
      image_url         = var.image_url
      namespace_id      = alicloud_sae_namespace.default.id
      vswitch_id        = alicloud_vswitch.default.id
      vpc_id            = alicloud_vpc.default.id
      security_group_id = alicloud_security_group.sg.id
      package_type      = var.package_type
      timezone          = "Asia/Beijing"
      replicas          = var.replicas
      cpu               = var.cpu
      memory            = var.memory
    }
    
    # 自動スケーリングポリシー
    resource "alicloud_sae_application_scaling_rule" "metrics" {
      app_id              = alicloud_sae_application.default.id
      scaling_rule_name   = "metric-dev"
      scaling_rule_enable = true
      scaling_rule_type   = "mix"
    
      scaling_rule_timer {
        begin_date = "2024-11-26"
        end_date   = "2024-11-30"
        period     = "* * *"
        schedules {
          at_time      = "19:45"
          max_replicas = 50
          min_replicas = 10
        }
        schedules {
          at_time      = "20:45"
          max_replicas = 40
          min_replicas = 3
        }
      }
    
      scaling_rule_metric {
        max_replicas = 40
        min_replicas = 3
        metrics {
          metric_type                       = "CPU"
          metric_target_average_utilization = 1
        }
        scale_up_rules {
          step                         = 10
          disabled                     = false
          stabilization_window_seconds = 0
        }
        scale_down_rules {
          step                         = 10
          disabled                     = false
          stabilization_window_seconds = 10
        }
      }
    }
    
    # その他の変数定義
    variable "namespace_description" {
      description = "名前空間の説明"
      default     = "名前空間"
    }
    
    variable "name" {
      default     = "tf"
      description = "セキュリティグループルールの名前"
      type        = string
    }
    
    variable "description" {
      default     = "セキュリティグループルールの説明"
      description = "セキュリティグループルールの説明"
      type        = string
    }
    
    variable "port_range" {
      default     = "1/65535"
      description = "セキュリティグループルールのポート範囲"
      type        = string
    }
    
    variable "cidr_ip" {
      description = "新しいセキュリティグループルールを作成するために使用される CIDR ブロック"
      type        = string
      default     = "0.0.0.0/0"
    }
    
    variable "zone_id" {
      description = "アベイラビリティーゾーン ID"
      type        = string
      default     = "cn-shenzhen-e"
    }
    
    variable "app_description" {
      default     = "Terraform によって作成された説明"
      description = "アプリケーションの説明"
      type        = string
    }
    
    variable "package_type" {
      default     = "Image"
      description = "アプリケーションのパッケージタイプ"
      type        = string
    }
    
    variable "cpu" {
      default     = "500"
      description = "アプリケーションの CPU (ミリコア単位)"
      type        = string
    }
    
    variable "memory" {
      default     = "1024"
      description = "アプリケーションのメモリ (MB 単位)"
      type        = string
    }
    
    variable "replicas" {
      default     = "1"
      description = "アプリケーションのレプリカ数"
      type        = string
    }
    
    variable "port" {
      description = "SLB のポート"
      type        = string
      default     = "8000"
    }
    
    # 出力
    output "namespace_id" {
      value = alicloud_sae_namespace.default.id
      description = "名前空間 ID"
    }
    
    output "app_id" {
      description = "アプリケーションの ID"
      value       = alicloud_sae_application.default.id
    }
    
    output "app_name" {
      description = "アプリケーションの名前"
      value       = var.app_name
    }
    

    参考資料

    • Terraform の詳細については、「Terraform とは」をご参照ください。