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

Serverless App Engine:Terraform を使用して SAE アプリケーションを SLB に関連付ける

最終更新日:May 20, 2025

Serverless App Engine (SAE) にアプリケーションをデプロイした後、インターネット向け Server Load Balancer (SLB) インスタンスにアプリケーションを関連付けてインターネットアクセスを実装できます。 また、アプリケーションが配置されている仮想プライベートクラウド (VPC) 内の他のアプリケーションと通信するために、アプリケーションをイントラネット SLB インスタンスに関連付けることもできます。 このトピックでは、Terraform を使用してインターネット向け SLB インスタンスを SAE アプリケーションに関連付ける方法と、SLB インスタンスの関連付けを解除する方法について説明します。

説明

このトピックのサンプルコードはワンクリックで実行できます。 ワンクリックで実行

前提条件

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

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

    このカスタムポリシーにより、RAM ユーザーは SLB インスタンスの編集、作成、削除、構成、および SAE アプリケーションとの関連付けと関連付けの解除を行うことができます。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "slb:DescribeLoadBalancers",
            "slb:DescribeLoadBalancerAttribute",
            "slb:CreateLoadBalancer",
            "slb:DeleteLoadBalancer",
            "slb:ModifyLoadBalancerInternetSpec",
            "slb:CreateLoadBalancerTCPListener",
            "slb:CreateLoadBalancerHTTPListener",
            "slb:CreateLoadBalancerHTTPSListener",
            "slb:DeleteLoadBalancerListener",
            "slb:SetLoadBalancerStatus",
            "sae:BindSlb",  // SLB のバインドを許可
            "sae:UnbindSlb" // SLB のバインド解除を許可
          ],
          "Resource": "*"
        }
      ]
    }
  • Terraform 環境を準備します。 Terraform を使用するには、次のいずれかの方法を使用できます。

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

    • Terraform Explorer で Terraform を使用する: Alibaba Cloud は Terraform のオンラインランタイム環境を提供しています。 Terraform Explorer 環境にログインして、Terraform をインストールせずに Terraform を使用できます。 この方法は、費用をかけずに効率的かつ便利な方法で Terraform を使用およびデバッグする必要があるシナリオに適しています。

    • Cloud Shell で Terraform を使用する: Terraform は Cloud Shell にプリインストールされており、ID 資格情報は構成されています。 Cloud Shell で Terraform コマンドを直接実行できます。 この方法は、低コストで迅速かつ便利な方法で Terraform を使用およびデバッグするシナリオに適しています。

    • Terraform をローカルにインストールして構成する: この方法は、ネットワーク接続が制限されているシナリオ、またはカスタマイズされた開発環境が必要なシナリオに適しています。

リソース

アプリケーションを作成し、アプリケーションを SLB インスタンスに関連付ける

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

  1. terraform という名前のプロジェクトフォルダを作成して、Terraform リソースを保存します。

  2. 次のコマンドを実行して、プロジェクトディレクトリに移動します。

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

    サンプルコード:

    # プロバイダー構成
    provider "alicloud" {
      region = var.region_id
    }
    
    # 変数定義
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    variable "app_name" {
      description = "アプリケーション名"
      type        = string
      default     = "app-slb"
    }
    
    variable "image_url" {
      description = "イメージ URL"
      type        = string
      default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
    }
    
    variable "namespace_id" {
      description = "名前空間 ID"
      type        = string
      default     = "cn-shenzhen:demo"
    }
    
    variable "namespace_name" {
      description = "名前空間名"
      type        = string
      default     = "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.4.0.0/16"
    }
    
    # VSwitch
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.4.0.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" "manual" {
      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
    }
    
    # SLB 構成
    resource "alicloud_slb_load_balancer" "slb" {
      load_balancer_name = "prod"
      address_type       = "internet"
      load_balancer_spec = "slb.s2.small"
      vswitch_id         = alicloud_vswitch.default.id
    }
    
    resource "alicloud_sae_load_balancer_internet" "example" {
      app_id          = alicloud_sae_application.manual.id
      internet_slb_id = alicloud_slb_load_balancer.slb.id
      internet {
        protocol    = "HTTP"
        port        = var.port
        target_port = 80
      }
    }
    
    # その他の変数定義
    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-a"
    }
    
    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       = var.namespace_id
      description = "名前空間 ID"
    }
    
    output "app_id" {
      description = "アプリケーションの ID"
      value       = alicloud_sae_application.manual.id
    }
    
    output "app_name" {
      description = "アプリケーション名"
      value       = var.app_name
    }
    
    output "endpoint" {
      value = format("http://%s:%s", alicloud_slb_load_balancer.slb.address, var.port)
    }
  4. 次のコマンドを実行して、構成を初期化します。

    terraform init
  5. 期待される出力:image

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

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

      terraform apply

      期待される出力:image

    app-slb アプリケーションが作成され、SLB インスタンスに関連付けられます。 SLB インスタンスの IP アドレスとポートが出力に表示されます。

  7. 結果を確認します。

    terraform show コマンドを実行する

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

    terraform show

    image

    ブラウザアクセススクリーンショット

    http://121.43.XXX.XX:8000 など、SLB インスタンスの IP アドレスとポートをブラウザに入力します。 Enter キーを押して、アプリケーションのホームページに移動します。image

SLB インスタンスの関連付けを解除し、アプリケーションを削除する

このセクションでは、アプリケーションから SLB インスタンスの関連付けを解除し、アプリケーションを削除する方法について説明します。 この例では、中国 (深セン) リージョンの app-slb アプリケーションを使用します。

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

    terraform destroy
  2. 期待される出力:image

    SLB インスタンスの関連付けが解除され、app-slb アプリケーションが削除されます。

完全なサンプルコード

説明

このトピックのサンプルコードはワンクリックで実行できます。 ワンクリックで実行

# プロバイダー構成
provider "alicloud" {
  // リージョンを設定
  region = var.region_id
}

参考資料

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