スケーラビリティは、分散アプリケーションの 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 をインストールして構成する: この方法は、ネットワーク接続が不安定な場合、またはカスタム開発 環境 が必要な場合に適しています。
リソース
alicloud_sae_namespace は、SAE 名前空間を作成するために使用されます。
alicloud_security_group は、セキュリティグループを構築および管理するために使用されます。
alicloud_security_group_rule は、セキュリティグループのイングレスまたはエグレスルールを定義するために使用されます。
alicloud_sae_application は、SAE アプリケーションを作成するために使用されます。
alicloud_sae_application_scaling_rule は、SAE アプリケーションの自動スケーリングポリシーを作成するために使用されます。
スケジュールされた自動スケーリングポリシーを有効にする
この例では、中国 (深セン) リージョンにアプリケーションを作成し、イメージモードでアプリケーションをデプロイし、アプリケーションのスケジュールされた自動スケーリングポリシーを構成する方法を示します。
この例では、スケジュールされた自動スケーリングポリシーは 1 日の間隔で実行されます。ポリシーは、ある日の 19:35 に 5 つのインスタンスに対して初めて実行されます。ポリシーは、同じ日の 20:35 に 2 つのインスタンスに対して 2 回目に実行されます。SAE は、スケジュールされた自動スケーリングポリシーに基づいて、その日の 19:35 から 20:35 までアプリケーションの 5 つのインスタンスを保持し、その日の 20:35 から翌日の 19:35 までアプリケーションの 2 つのインスタンスを保持します。
- Terraform リソースを格納するために、terraform という名前のプロジェクトフォルダを作成します。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd terraformmain.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 }次のコマンドを実行して、構成を初期化します。
terraform init期待される出力:
次の手順を実行して、SAE アプリケーションを作成します。
次のコマンドを実行して、構成ファイルを実行します。プロンプトが表示されたら
yesと入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。
terraform apply期待される出力:
確認
terraform show コマンドを実行する
次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。
terraform show
SAE コンソール
app-scaling アプリケーションが作成され、アプリケーションのスケジュールされた自動スケーリングポリシーが有効になります。SAEコンソール にログインし、アプリケーションの [基本情報] ページの [インスタンス情報] タブで自動スケーリングポリシーとインスタンスの状態を表示できます。

メトリックベースの自動スケーリングポリシーを有効にする
この例では、スケジュールされた自動スケーリングポリシーを構成するために作成された 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 使用率が指定されています。ビジネス要件に基づいて パラメーター 値を指定できます。
次のコマンドを実行して、構成を初期化します。
terraform init期待される出力:
次の手順を実行して、SAE アプリケーションを作成します。
次のコマンドを実行して、構成ファイルを実行します。プロンプトが表示されたら
yesと入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。
terraform apply期待される出力:
確認
terraform show コマンドを実行する
次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。
terraform show
SAE コンソール
app-scaling アプリケーションが作成され、アプリケーションのメトリックベースの自動スケーリングポリシーが有効になります。SAEコンソール にログインし、アプリケーションの [基本情報] ページの [インスタンス情報] タブで自動スケーリングポリシーとインスタンスの状態を表示できます。

ハイブリッド自動スケーリングポリシーを有効にする
この例では、スケジュールされた自動スケーリングポリシーを構成するために作成された 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 使用率が指定されています。ビジネス要件に基づいて パラメーター 値を指定できます。
次のコマンドを実行して、構成を初期化します。
terraform init期待される出力:
次の手順を実行して、SAE アプリケーションを作成します。
次のコマンドを実行して、構成ファイルを実行します。プロンプトが表示されたら
yesと入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。
terraform apply期待される出力:
確認します。
terraform show コマンドを実行する
次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。
terraform show
SAE コンソール
app-scaling アプリケーションが作成され、アプリケーションのハイブリッド自動スケーリングポリシーが有効になります。SAEコンソール にログインし、アプリケーションの [基本情報] ページの [インスタンス情報] タブで自動スケーリングポリシーとインスタンスの状態を表示できます。

自動スケーリングポリシーを無効にし、アプリケーションを削除する
このセクションでは、自動スケーリングポリシーを無効にし、自動スケーリングポリシーが有効になっているアプリケーションを削除する方法の例を示します。この例では、中国 (杭州) リージョンにある app-scaling アプリケーションが削除されます。
- プロジェクトディレクトリで次のコマンドを実行して、構成ファイルを実行します。
terraform destroy 期待される出力:

自動スケーリングポリシーが無効になり、
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 とは」をご参照ください。