このトピックでは、Windows で Terraform を使用して Alibaba Cloud のリソースを作成する方法について説明します。
Terraform を使用した Infrastructure as Code (IaC) によるインフラストラクチャ管理は、主に次の手順で構成されます。
-
Terraform のインストール:システムが Terraform コマンドを認識して実行できるようにします。
-
Terraform 設定ファイルの作成:設定ファイルは Terraform の中核です。Virtual Private Cloud (VPC)、Elastic Compute Service (ECS) インスタンス、Object Storage Service (OSS) バケットなどのリソースの作成、設定、依存関係を記述します。
-
リソースの初期化と作成:この重要な手順により、インフラストラクチャの設計がアクティブなリソースに変わります。
-
リソースの表示と管理:デプロイ後、インフラストラクチャを表示および管理して、現在の要件を満たしていることを確認できます。
-
リソースの破棄:不要になったリソースは破棄できます。
1. Terraform のインストール
-
Terraform の公式 Web サイトにアクセスし、お使いの Windows オペレーティングシステム用の Terraform バイナリをダウンロードして展開します。
ダウンロードページには、386 および AMD64 アーキテクチャ用のインストールパッケージが用意されています。お使いのシステムに一致するものを選択し、[Download] をクリックします。
-
Terraform のインストールパスを Path 環境変数に追加します。
-
デスクトップで [このPC] を右クリックし、[プロパティ] > [システムの詳細設定] > [環境変数] を選択します。
-
[システム環境変数] または [ユーザー環境変数] で [Path] をクリックし、[編集] > [新規] を選択します。Terraform バイナリを展開したディレクトリへのパスを入力し、[OK] をクリックして変更を保存します。
-
-
インストールを検証します。[Win+R] キーを押し、
cmdと入力して [OK] をクリックし、コマンドプロンプトを開きます。terraform --versionコマンドを実行します。次のような出力が表示された場合、インストールは成功です。Terraform v1.9.3 on windows_amd64
2. Terraform 設定ファイルの作成
設定ファイルは Terraform の中核です。VPC、ECS、OSS など、クラウドまたはオンプレミスにデプロイするインフラストラクチャリソースを定義します。
-
新しいフォルダー (例:ecs) を作成し、そのフォルダーに main.tf という名前の Terraform 設定ファイルを作成します。
各 Terraform プロジェクトに個別の作業ディレクトリを作成することは、ベストプラクティスです。これにより、リソースが整理され、状態ファイルの競合が防止され、バージョン管理が簡素化されます。また、この分離は環境の分離とモジュールの管理にも役立ち、保守性とセキュリティが向上します。
-
Terraform 設定ファイルを記述します。ECS インスタンスと、VPC やセキュリティグループなどの依存リソースは、設定ファイルにコードとして定義されます。次のコードを main.tf にコピーできます。
重要-
この例では、従量課金制の ECS インスタンスを作成します。作成時に料金が発生します。
-
この例では、Terraform 認証に環境変数を使用します。詳細については、「Terraform 認証」をご参照ください。
ECS インスタンスの作成には、次のリソースが必要です。
リソース
説明
VPC インスタンスを作成します。
vSwitch インスタンスを作成します。
セキュリティグループを作成します。
セキュリティグループのイングレスルールとエグレスルールを作成します。
ECS インスタンスを作成します。
variable "name" { type = string default = "tf-test" } # リージョンを指定します。 variable "region" { type = string default = "cn-beijing" } # パブリック帯域幅。0 より大きい場合、パブリック IP アドレスがインスタンスに割り当てられます。 variable "internet_max_bandwidth_out" { type = number default = 10 } # ECS インスタンスタイプを指定します。 variable "instance_type" { type = string default = "ecs.e-c1m1.large" } # イメージ ID を指定します。 variable "image_id" { default = "ubuntu_18_04_64_20G_alibase_20190624.vhd" } # リソースのタグを定義します。 variable "tags" { type = map(string) default = { From = "Terraform" Usage = "demo" } } provider "alicloud" { region = var.region } # 指定されたインスタンスタイプで利用可能なゾーンを取得します。 data "alicloud_zones" "default" { available_instance_type = var.instance_type available_resource_creation = "VSwitch" available_disk_category = "cloud_essd_entry" } # VPC を作成します。 resource "alicloud_vpc" "vpc" { vpc_name = var.name cidr_block = "172.16.0.0/12" } # vSwitch を作成します。 resource "alicloud_vswitch" "vsw" { vpc_id = alicloud_vpc.vpc.id cidr_block = "172.16.0.0/21" zone_id = data.alicloud_zones.default.zones[0].id } # セキュリティグループを作成します。 resource "alicloud_security_group" "default" { name = var.name vpc_id = alicloud_vpc.vpc.id } # SSH アクセスを許可するイングレスルールを追加します。 resource "alicloud_security_group_rule" "allow_tcp_22" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = "22/22" priority = 1 security_group_id = alicloud_security_group.default.id cidr_ip = "0.0.0.0/0" } # ECS インスタンスを作成します。 resource "alicloud_instance" "instance" { availability_zone = data.alicloud_zones.default.zones.0.id security_groups = alicloud_security_group.default.*.id instance_type = var.instance_type system_disk_category = "cloud_essd_entry" image_id = var.image_id instance_name = var.name vswitch_id = alicloud_vswitch.vsw.id internet_max_bandwidth_out = var.internet_max_bandwidth_out tags = var.tags } output "ecs_id" { value = alicloud_instance.instance.id } output "ecs_ip" { value = alicloud_instance.instance.public_ip } -
3. リソースの初期化と作成
Terraform 設定ファイルを記述した後、リソースを作成する前に作業ディレクトリを初期化する必要があります。
3.1 Terraform の初期化
[コマンドプロンプト] で、ステップ 2 で作成したフォルダーに切り替えてから、terraform init コマンドを実行します。 新しい Terraform 設定では、terraform init は最初に実行するコマンドです。 これにより、作業ディレクトリが初期化され、必要な Alibaba Cloud プロバイダープラグインがダウンロードされ、その他の必要なファイルが作成されます。
# D: ドライブに切り替えます。
d:
# 手順2のフォルダーパスに切り替えます。tool/terraform/projects/ecs を実際のパスに置き換えてください。
cd tool/terraform/projects/ecs
# 初期化コマンドを実行します。
terraform init
3.2 リソースの作成
-
terraform planを実行して実行計画を作成します。この計画には、terraform applyを実行したときに作成、変更、または破棄されるすべてのリソースに関する詳細情報が表示されます。... + router_table_id = (known after apply) + secondary_cidr_blocks = (known after apply) + status = (known after apply) + user_cidrs = (known after apply) + vpc_name = "tf_vpc_test" } # alicloud_vswitch.vsw will be created + resource "alicloud_vswitch" "vsw" { + availability_zone = (known after apply) + cidr_block = "172.16.0.0/21" + create_time = (known after apply) + id = (known after apply) + ipv6_cidr_block = (known after apply) + ipv6_cidr_block_mask = (known after apply) + name = (known after apply) + status = (known after apply) + vpc_id = (known after apply) + vswitch_name = (known after apply) + zone_id = "cn-beijing-a" } Plan: 5 to add, 0 to change, 0 to destroy. Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now. -
terraform applyを実行すると、terraform planで生成された実行計画に基づいてリソースが作成されます。作成プロセス中に、リソースの作成を続行するように求められたら、yes と入力する必要があります。変数に値を渡す方法の詳細については、「Variables」をご参照ください。Plan: 5 to add, 0 to change, 0 to destroy. Changes to Outputs: + ecs_id = (known after apply) + ecs_ip = (known after apply) Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes alicloud_vpc.vpc: Creating... alicloud_vpc.vpc: Creation complete after 7s [id=vpc-2zexxx5: xxxk5w] alicloud_security_group.default: Creating... alicloud_vswitch.vsw: Creating... alicloud_security_group.default: Creation complete after 2s [id=sg-2zexxx4xxx9pa] alicloud_security_group_rule.allow_tcp_22: Creating... alicloud_security_group_rule.allow_tcp_22: Creation complete after 0s [id=sg-2zexxx4xxx9pa:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1] alicloud_vswitch.vsw: Creation complete after 4s [id=vsw-2zexxxxxxxxxxxgwdf] alicloud_instance.instance: Creating... alicloud_instance.instance: Still creating... [10s elapsed] alicloud_instance.instance: Creation complete after 14s [id=i-2zexxxxxxxxxxxkmo] Apply complete! Resources: 5 added, 0 changed, 0 destroyed. Outputs: ecs_id = "i-2zexxxxxxxxxxxkmo" ecs_ip = "3x.1xx.1xx.x41"
4. リソースの表示と管理
デプロイ後、インフラストラクチャを管理および保守できます。
4.1 リソースの表示
-
terraform showコマンドを実行して、リソースの詳細情報を表示します。D:\tool\terraform\projects\ecs>terraform show # data.alicloud_zones.default: data "alicloud_zones" "default" { available_disk_category = "cloud_essd_entry" available_instance_type = "ecs.e-c1m1.large" available_resource_creation = "VSwitch" enable_details = false id = "2398922967" ids = [ "cn-beijing-a", "cn-beijing-c", "cn-beijing-e", "cn-beijing-f", "cn-beijing-g", "cn-beijing-h", "cn-beijing-i", ] instance_charge_type = "PostPaid" multi = false spot_strategy = "NoSpot" zones = [ { available_disk_categories = [] available_instance_types = [] available_resource_creation = [] id = "cn-beijing-a" local_name = null multi_zone_ids = [] slb_slave_zone_ids = [] } ] } -
terraform state listコマンドを実行して、作成されたすべてのリソースを一覧表示します。D:\tool\terraform\projects\ecs>terraform state list data.alicloud_zones.default alicloud_instance.instance alicloud_security_group.default alicloud_security_group_rule.allow_tcp_22 alicloud_vpc.vpc alicloud_vswitch.vsw -
terraform state show <resource_type>.<resource_name>コマンドを実行して、特定のリソースの詳細情報を表示します。D:\tool\terraform\projects\ecs>terraform state show alicloud_vpc.vpc # alicloud_vpc.vpc: resource "alicloud_vpc" "vpc" { cidr_block = "172.16.0.0/12" classic_link_enabled = false create_time = "2024-09-09T05:54:41Z" description = null enable_ipv6 = false id = "vpc-2zexxx" ipv6_cidr_block = null ipv6_cidr_blocks = [] name = "tf-test" resource_group_id = "rg-acfxxx" route_table_id = "vtb-2zexxx" router_id = "vrt-2zexxx" router_table_id = "vtb-2zexxx" secondary_cidr_blocks = [] status = "Available" system_route_table_description = null system_route_table_name = null user_cidrs = [] vpc_name = "tf-test" } -
作成されたリソースに関する情報をAlibaba Cloud マネジメントコンソールで表示します。
4.2 リソースの管理
Terraform はリソースを作成または変更すると、その状態と属性を terraform.tfstate ファイルに保存します。terraform state コマンドを使用して状態を管理できます。詳細については、「状態の概要」をご参照ください。
4.3 リソースの変更
-
設定ファイル (例:main.tf または別の .tf ファイル) 内のリソース定義を変更します。たとえば、セキュリティグループに新しいイングレスルールを追加できます。
resource "alicloud_security_group_rule" "allow_tcp_443" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = "443/443" priority = 1 security_group_id = alicloud_security_group.default.id cidr_ip = "0.0.0.0/0" } -
terraform planコマンドを実行して変更をプレビューします。Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # alicloud_security_group_rule.allow_tcp_443 will be created + resource "alicloud_security_group_rule" "allow_tcp_443" { + cidr_ip = "0.0.0.0/0" + id = (known after apply) + ip_protocol = "tcp" + nic_type = "intranet" + policy = "accept" + port_range = "443/443" + prefix_list_id = (known after apply) + priority = 1 + security_group_id = "sg-2zexxx9pa" + type = "ingress" } Plan: 1 to add, 0 to change, 0 to destroy. -
計画が正しい場合は、
terraform applyコマンドを実行します。変更を適用するように求められたらyesと入力します。Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes alicloud_security_group_rule.allow_tcp_443: Creating... alicloud_security_group_rule.allow_tcp_443: Creation complete after 1s [id=sg-2zexxx:xxx:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: ecs_id = "i-2zexxx" ecs_ip = "3x.xxx.xxx.x41"
5. リソースの破棄
リソースが不要になった場合は、terraform destroy コマンドを実行してインフラストラクチャを破棄します。
Plan: 0 to add, 0 to change, 6 to destroy.
Changes to Outputs:
- ecs_id = "i-2zxxx" -> null
- ecs_ip = "3xxx" -> null
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
alicloud_security_group_rule.allow_tcp_443: Destroying... [id=sg-2zexxx:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1]
alicloud_security_group_rule.allow_tcp_22: Destroying... [id=sg-2zexxx:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1]
alicloud_instance.instance: Destroying... [id=i-2zexxxkmo]
alicloud_security_group_rule.allow_tcp_443: Destruction complete after 1s
alicloud_security_group_rule.allow_tcp_22: Destruction complete after 1s
alicloud_instance.instance: Still destroying... [id=i-2zexxxkmo, 10s elapsed]
alicloud_instance.instance: Destruction complete after 12s
alicloud_security_group.default: Destroying... [id=sg-2zexxxpa]
alicloud_vswitch.vsw: Destroying... [id=vsw-2zexxxvdf]
alicloud_security_group.default: Destruction complete after 2s
alicloud_vswitch.vsw: Destruction complete after 8s
alicloud_vpc.vpc: Destroying... [id=vpc-2zexxxk5w]
alicloud_vpc.vpc: Destruction complete after 6s
Destroy complete! Resources: 6 destroyed.