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 をローカルにインストールして構成する: この方法は、ネットワーク接続が制限されているシナリオ、またはカスタマイズされた開発環境が必要なシナリオに適しています。
リソース
alicloud_sae_namespace: SAE 名前空間を作成および管理します。
alicloud_security_group: セキュリティグループを作成および管理します。
alicloud_security_group_rule: セキュリティグループルールを作成および管理します。
alicloud_sae_application: SAE アプリケーションを作成および管理します。
alicloud_slb_load_balancer: SLB を作成および管理します。
alicloud_sae_load_balancer_internet: SAE アプリケーションのインターネット SLB を構成します。
アプリケーションを作成し、アプリケーションを SLB インスタンスに関連付ける
このセクションでは、イメージを使用してアプリケーションをデプロイし、アプリケーションを手動で構成してから、アプリケーションを SLB インスタンスに関連付ける方法について説明します。 この例では、中国 (深セン) リージョンを使用しています。
terraform という名前のプロジェクトフォルダを作成して、Terraform リソースを保存します。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd terraformmain.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) }次のコマンドを実行して、構成を初期化します。
terraform init期待される出力:

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

app-slbアプリケーションが作成され、SLB インスタンスに関連付けられます。 SLB インスタンスの IP アドレスとポートが出力に表示されます。結果を確認します。
terraform show コマンドを実行する
次のコマンドを実行して、Terraform を使用して作成されたリソースの詳細をクエリします。
terraform show
ブラウザアクセススクリーンショット
http://121.43.XXX.XX:8000など、SLB インスタンスの IP アドレスとポートをブラウザに入力します。 Enter キーを押して、アプリケーションのホームページに移動します。
SLB インスタンスの関連付けを解除し、アプリケーションを削除する
このセクションでは、アプリケーションから SLB インスタンスの関連付けを解除し、アプリケーションを削除する方法について説明します。 この例では、中国 (深セン) リージョンの app-slb アプリケーションを使用します。
プロジェクトディレクトリで次のコマンドを実行して、構成ファイルを実行します。
terraform destroy期待される出力:

SLB インスタンスの関連付けが解除され、
app-slbアプリケーションが削除されます。
完全なサンプルコード
このトピックのサンプルコードはワンクリックで実行できます。 ワンクリックで実行
# プロバイダー構成
provider "alicloud" {
// リージョンを設定
region = var.region_id
}参考資料
Terraform の詳細については、「Terraform とは」をご参照ください。