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

Serverless App Engine:Terraform を使用して SAE アプリケーションを管理する

最終更新日:Mar 10, 2025

Serverless App Engine (SAE) は、アプリケーション管理用のサーバーレス Platform as a Service (PaaS) です。SAE にアプリケーションをデプロイする場合、クラスタやサーバーを管理または保守する必要はありません。そのため、アプリケーションの設計と開発に集中できます。SAE にアプリケーションをデプロイするには、コンソール、API 操作、プラグイン、CI/CD ツールを使用できます。また、Terraform を使用して SAE アプリケーションをデプロイすることもできます。このトピックでは、Terraform を使用して SAE アプリケーションを作成および削除する方法について説明します。

前提条件

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

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

    このカスタムポリシーにより、ユーザーは SAE のアプリケーションとサービスを管理できます。これには、アプリケーションの説明、作成、更新、削除、デプロイ、開始、停止、およびサービスの作成、更新、削除、バインド、バインド解除が含まれます。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "sae:DescribeApplications",
            "sae:DescribeApplication",
            "sae:DescribeInstances",
            "sae:DescribeInstance",
            "sae:DescribeServices",
            "sae:DescribeService"
          ],
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "sae:CreateApplication",
            "sae:UpdateApplication",
            "sae:DeleteApplication",
            "sae:DeployApplication",
            "sae:StartApplication",
            "sae:StopApplication"
          ],
          "Resource": "acs:sae:*:*:application/*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "sae:CreateService",
            "sae:UpdateService",
            "sae:DeleteService",
            "sae:BindService",
            "sae:UnbindService"
          ],
          "Resource": "acs:sae:*:*:service/*"
        }
      ]
    }
  • 次のいずれかの方法を使用して、Terraform の実行環境を準備します。

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

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

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

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

リソース

  • alicloud_sae_application は、SAE でアプリケーションを管理および作成するために設計されています。

  • alicloud_vpc を使用すると、サブネット計画、ルートテーブル、ネットワークセキュリティなど、ネットワークを構成できます。

  • alicloud_vswitch は VPC 内のサブネットであり、VPC を複数のサブネットに分割するために使用されます。各サブネットには、独自の IP アドレス範囲とルートテーブルを設定できます。VSwitch を使用すると、異なるサブネットに異なるアプリケーションとサービスをデプロイできます。

  • alicloud_security_group は、VPC 内のネットワークアクセス制御を管理するために使用されるセキュリティグループサービスです。

アプリケーションを作成する

イメージまたはコードパッケージを使用して、SAE にアプリケーションをデプロイできます。コードパッケージは、.zip ファイルとして JAR、WAR、または PHP パッケージにすることができます。アプリケーションを作成するときは、要件に基づいて、次のいずれかの方法を使用して仮想プライベートクラウド (VPC) を構成できます。

  • 自動構成: SAE は、作成するアプリケーションの名前空間、VPC、vSwitch、およびセキュリティグループを自動的に構成します。デフォルトの名前空間が構成されます。

  • カスタム構成: 作成するアプリケーションの名前空間、VPC、vSwitch、およびセキュリティグループを手動で構成する必要があります。

自動構成

このセクションでは、イメージを使用してアプリケーションをデプロイし、アプリケーションの自動構成を実装する方法について説明します。この例では、中国 (北京) リージョンを使用します。

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

    provider "alicloud" {
      region = var.region
    }
    
    variable "region" {
      default = "cn-beijing"
    }
    
    variable "name" {
      default = "serverless-example"
    }
    
    resource "random_integer" "default" {
      max = 99999
      min = 10000
    }
    
    data "alicloud_regions" "default" {
      current = true
    }
    
    data "alicloud_zones" "default" {
      available_resource_creation = "VSwitch"
    }
    
    resource "alicloud_vpc" "default" {
      vpc_name   = var.name
      cidr_block = "10.4.0.0/16"
    }
    
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.4.0.0/24"
      vpc_id       = alicloud_vpc.default.id
      zone_id      = data.alicloud_zones.default.zones.0.id
    }
    
    resource "alicloud_security_group" "default" {
      vpc_id = alicloud_vpc.default.id
    }
    
    resource "alicloud_sae_namespace" "default" {
      namespace_id              = "${data.alicloud_regions.default.regions.0.id}:example${random_integer.default.result}"
      namespace_name            = var.name
      namespace_description     = var.name
      enable_micro_registration = false
    }
    
    resource "alicloud_sae_application" "default" {
      app_description   = var.name
      app_name          = "${var.name}-${random_integer.default.result}"
      namespace_id      = alicloud_sae_namespace.default.id
      image_url         = "registry-vpc.${data.alicloud_regions.default.regions.0.id}.aliyuncs.com/sae-demo-image/consumer:1.0"
      package_type      = "Image"
      security_group_id = alicloud_security_group.default.id
      vpc_id            = alicloud_vpc.default.id
      vswitch_id        = alicloud_vswitch.default.id
      timezone          = "Asia/Beijing"
      replicas          = "1"
      cpu               = "500"
      memory            = "2048"
    }

    コンテナレジストリ コンソールにログインし、リポジトリの [詳細] ページでイメージアドレスを取得できます。フォーマットは次のとおりです。

    registry.<regionId>.aliyuncs.com/<namespace name><image repository name>:<image version>
  4. 次のコマンドを実行して、構成を初期化します。
    terraform init
  1. 予想される出力:

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
  1. 次の手順を実行して、SAE アプリケーションを作成します。

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

terraform apply
  1. 予想される出力:

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
  1. 確認

terraform show コマンドを実行する

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

terraform show

image

Serverless App Engine SAE コンソールのスクリーンショット

SAE コンソール にログインし、作成されたアプリケーションのリストを表示します。

image

説明

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

カスタム構成: イメージを使用してアプリケーションをデプロイする

このセクションでは、イメージを使用してアプリケーションをデプロイし、アプリケーションを手動で構成する方法について説明します。この例では、中国 (深セン) リージョンを使用します。

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

    provider "alicloud" {
      region = var.region_id
    }
    
    # リージョンの ID を指定します。
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    # アプリケーションの名前を指定します。
    variable "app_name" {
      description = "アプリケーションの名前"
      type        = string
      default     = "manual-jar-tf"
    }
    
    # アプリケーションの説明を指定します。
    variable "app_description" {
      default     = "Terraform によって作成された説明"
      description = "アプリケーションの説明"
      type        = string
    }
    
    # アプリケーションのデプロイ方法を指定します。
    variable "package_type" {
      default     = "FatJar"
      description = "アプリケーションのパッケージタイプ"
      type        = string
    }
    
    # インスタンスの CPU 仕様を指定します。
    variable "cpu" {
      default     = "500"
      description = "アプリケーションの CPU (ミリコア単位)"
      type        = string
    }
    
    # インスタンスのメモリサイズを指定します。
    variable "memory" {
      default     = "1024"
      description = "アプリケーションのメモリ (MB 単位)"
      type        = string
    }
    
    # JAR パッケージのパスを指定します。
    variable "jar_url" {
      description = "アプリケーションの JAR URL (例: `oss://my-bucket/my-app.jar`)"
      type        = string
      default     = "https://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar"
    }
    
    # アプリケーションインスタンスの数を指定します。
    variable "replicas" {
      default     = "1"
      description = "アプリケーションのレプリカ数"
      type        = string
    }
    
    # 名前空間の名前を指定します。
    variable "namespace_name" {
      description = "名前空間名"
      type        = string
      default     = "tfjardemo"
    }
    
    # 名前空間の ID を指定します。
    variable "namespace_id" {
      description = "名前空間 ID"
      type        = string
      default     = "cn-shenzhen:tfjardemo"  # 既存の名前空間 ID を参照します
    }
    
    # 名前空間の説明を指定します。
    variable "namespace_description" {
      description = "名前空間の説明"
      default     = "名前空間"
    }
    
    # VPC とセキュリティグループを指定します。
    variable "name" {
      default     = "tf"
      description = "セキュリティグループルールの名前"
      type        = string
    }
    
    variable "description" {
      default     = "セキュリティグループルールの説明"
      description = "セキュリティグループルールの説明"
      type        = string
    }
    
    # セキュリティグループルールのポート範囲を指定します。
    variable "port_range" {
      default     = "1/65535"
      description = "セキュリティグループルールのポート範囲"
      type        = string
    }
    
    # CIDR ブロックを指定します。
    variable "cidr_ip" {
      description = "新しいセキュリティグループルールを作成するために使用される CIDR ブロック"
      type        = string
      default     = "0.0.0.0/0"
    }
    
    # リージョン内のゾーンを指定します。
    variable "zone_id" {
      description = "アベイラビリティーゾーン ID"
      type        = string
      default     = "cn-shenzhen-e"  # 十分なリソースを持つゾーンを選択します
    }
    
    # Simple Log Service へのログ収集を構成します。
    variable "slsConfig" {
      default     = "[{\"logDir\":\"\",\"logType\":\"stdout\"},{\"logDir\":\"/home/admin/logs/*.log\"}]"
      description = "SLS ログ収集の構成"
      type        = string
    }
    
    resource "alicloud_vpc" "vpc" {
      vpc_name   = "tf-vpc"
      cidr_block = "172.16.0.0/16"
    }
    
    resource "alicloud_vswitch" "vswitch" {
      vpc_id       = alicloud_vpc.vpc.id
      cidr_block   = "172.16.1.0/24"
      zone_id      = var.zone_id
      vswitch_name = "tf-vswitch"
      description  = "tf-vswitch の説明"
    }
    
    resource "alicloud_sae_namespace" "default" {
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
      namespace_description = var.namespace_description
    }
    
    output "namespace_id" {
      value       = var.namespace_id
      description = "名前空間 ID"
    }
    
    resource "alicloud_security_group" "sg" {
      name        = var.name
      description = var.description
      vpc_id      = alicloud_vpc.vpc.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" "manual" {
      app_name           = var.app_name
      app_description    = var.app_description
      deploy             = true
      package_url        = var.jar_url
      namespace_id       = alicloud_sae_namespace.default.id
      vswitch_id         = alicloud_vswitch.vswitch.id
      vpc_id             = alicloud_vpc.vpc.id
      security_group_id  = alicloud_security_group.sg.id
      package_type       = var.package_type
      jdk                = "Open JDK 8"
      timezone           = "Asia/Beijing"
      replicas           = var.replicas
      cpu                = var.cpu
      memory             = var.memory
      micro_registration = "0"
    
      lifecycle {
        ignore_changes = [
          micro_registration
        ]
      }
    }
    
    output "app_id" {
      description = "アプリケーションの ID"
      value       = alicloud_sae_application.manual.id
    }
    
    output "app_name" {
      description = "アプリケーションの名前"
      value       = var.app_name
    }
  4. 次のコマンドを実行して、構成を初期化します。
    terraform init
  5. 予想される出力:

    image

  1. 次の手順を実行して、イメージを使用してアプリケーションを作成します。プロンプトが表示されたら yes と入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。

terraform apply
  1. 予想される出力:

image

出力が予想どおりに返された場合、イメージを使用してデプロイされたアプリケーションが作成されます。

  1. 確認

terraform show コマンドを実行する

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

terraform show

image

Serverless App Engine SAE コンソール

SAE コンソール にログインし、作成されたアプリケーションのリストを表示します。

image

image

カスタム構成: JAR パッケージを使用してアプリケーションをデプロイする

このセクションでは、JAR パッケージを使用してアプリケーションをデプロイし、アプリケーションを手動で構成する方法について説明します。この例では、中国 (深セン) リージョンを使用します。

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

    provider "alicloud" {
      region = var.region_id
    }
    
    # リージョンの ID を指定します。
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    # アプリケーションの名前を指定します。
    variable "app_name" {
      description = "アプリケーションの名前"
      type        = string
      default     = "manual-jar-tf"
    }
    
    # アプリケーションの説明を指定します。
    variable "app_description" {
      default     = "Terraform によって作成された説明"
      description = "アプリケーションの説明"
      type        = string
    }
    
    # アプリケーションのデプロイ方法を指定します。
    variable "package_type" {
      default     = "FatJar"
      description = "アプリケーションのパッケージタイプ"
      type        = string
    }
    
    # インスタンスの CPU 仕様を指定します。
    variable "cpu" {
      default     = "500"
      description = "アプリケーションの CPU (ミリコア単位)"
      type        = string
    }
    
    # インスタンスのメモリサイズを指定します。
    variable "memory" {
      default     = "1024"
      description = "アプリケーションのメモリ (MB 単位)"
      type        = string
    }
    
    # JAR パッケージのパスを指定します。
    variable "jar_url" {
      description = "アプリケーションの JAR URL (例: `oss://my-bucket/my-app.jar`)"
      type        = string
      default     = "https://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar"
    }
    
    # アプリケーションインスタンスの数を指定します。
    variable "replicas" {
      default     = "1"
      description = "アプリケーションのレプリカ数"
      type        = string
    }
    
    # 名前空間の名前を指定します。
    variable "namespace_name" {
      description = "名前空間名"
      type        = string
      default     = "tfjardemo"
    }
    
    # 名前空間の ID を指定します。
    variable "namespace_id" {
      description = "名前空間 ID"
      type        = string
      default     = "cn-shenzhen:tfjardemo"  # 既存の名前空間 ID を参照します
    }
    
    # 名前空間の説明を指定します。
    variable "namespace_description" {
      description = "名前空間の説明"
      default     = "名前空間"
    }
    
    # VPC とセキュリティグループを指定します。
    variable "name" {
      default     = "tf"
      description = "セキュリティグループルールの名前"
      type        = string
    }
    
    variable "description" {
      default     = "セキュリティグループルールの説明"
      description = "セキュリティグループルールの説明"
      type        = string
    }
    
    # セキュリティグループルールのポート範囲を指定します。
    variable "port_range" {
      default     = "1/65535"
      description = "セキュリティグループルールのポート範囲"
      type        = string
    }
    
    # CIDR ブロックを指定します。
    variable "cidr_ip" {
      description = "新しいセキュリティグループルールを作成するために使用される CIDR ブロック"
      type        = string
      default     = "0.0.0.0/0"
    }
    
    # リージョン内のゾーンを指定します。
    variable "zone_id" {
      description = "アベイラビリティーゾーン ID"
      type        = string
      default     = "cn-shenzhen-e"  # 十分なリソースを持つゾーンを選択します。
    }
    
    # Simple Log Service へのログ収集を構成します。
    variable "slsConfig" {
      default     = "[{\"logDir\":\"\",\"logType\":\"stdout\"},{\"logDir\":\"/home/admin/logs/*.log\"}]"
      description = "SLS ログ収集の構成"
      type        = string
    }
    
    resource "alicloud_vpc" "vpc" {
      vpc_name   = "tf-vpc"
      cidr_block = "172.16.0.0/16"
    }
    
    resource "alicloud_vswitch" "vswitch" {
      vpc_id       = alicloud_vpc.vpc.id
      cidr_block   = "172.16.1.0/24"
      zone_id      = var.zone_id
      vswitch_name = "tf-vswitch"
      description  = "tf-vswitch の説明"
    }
    
    resource "alicloud_sae_namespace" "default" {
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
      namespace_description = var.namespace_description
    }
    
    output "namespace_id" {
      value       = var.namespace_id
      description = "名前空間 ID"
    }
    
    resource "alicloud_security_group" "sg" {
      name        = var.name
      description = var.description
      vpc_id      = alicloud_vpc.vpc.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" "manual" {
      app_name           = var.app_name
      app_description    = var.app_description
      deploy             = true
      package_url        = var.jar_url
      namespace_id       = alicloud_sae_namespace.default.id
      vswitch_id         = alicloud_vswitch.vswitch.id
      vpc_id             = alicloud_vpc.vpc.id
      security_group_id  = alicloud_security_group.sg.id
      package_type       = var.package_type
      jdk                = "Open JDK 8"
      timezone           = "Asia/Beijing"
      replicas           = var.replicas
      cpu                = var.cpu
      memory             = var.memory
      micro_registration = "0"
    
      lifecycle {
        ignore_changes = [
          micro_registration
        ]
      }
    }
    
    output "app_id" {
      description = "アプリケーションの ID"
      value       = alicloud_sae_application.manual.id
    }
    
    output "app_name" {
      description = "アプリケーションの名前"
      value       = var.app_name
    }
  4. 次のコマンドを実行して、構成を初期化します。

    terraform init

    予想される出力:

    image

  5. 次の手順を実行して、JAR パッケージを使用してアプリケーションを作成します。

    1. 次のコマンドを実行して、アプリケーションをデプロイします。プロンプトが表示されたら yes と入力し、[enter] キーを押します。コマンドが実行されるまで待ちます。次のコマンド出力が返された場合、承認は完了です。

      terraform apply

      予想される出力:

      image

    出力が予想どおりに返された場合、JAR パッケージを使用してデプロイされたアプリケーションが作成されます。

  1. 確認:

terraform show コマンドを実行する

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

terraform show

image

SAE コンソール

SAE コンソール にログインし、作成された名前空間を表示します。

image

アプリケーションを削除する

このセクションでは、アプリケーションを削除する方法について説明します。この例では、auto-app-1 アプリケーションを使用します。このアプリケーションは、中国 (上海) リージョンで自動的に作成されました。

  1. プロジェクトディレクトリで次のコマンドを実行して、構成ファイルを実行します。

    terraform destroy

    予想される出力:image

関連情報

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