Terraformは、開発者とO&Mチームがクラウドインフラストラクチャの作成、展開、管理を自動化できるように設計されたInfrastructure as Code (IaC) ツールです。 Terraformを使用すると、簡単なコードを記述して、手動操作や設定を必要とせずにクラウドインフラストラクチャを定義および設定できます。 このトピックでは、Terraformを使用してElastic Compute Service (ECS) インスタンスを作成する方法について説明します。
Terraformの詳細については、Terraformとは何ですか?
準備
ステップ1: Terraformのインストール
このセクションでは、インストールパッケージを使用してLinuxまたはWindowsにTerraformをインストールする方法について説明します。
Alibaba Cloudは、以下のTerraformオンライン環境を提供しています。 オンライン環境では、TerraformをインストールしなくてもTerraformコマンドを実行できます。
Terraform Explorer: このトピックで提供されているサンプルコードをコードエディターに貼り付け、[デバッグの開始] をクリックしてサンプルコードを自動的に実行します。
Cloud Shell: Cloud Shellにログインし、このトピックで提供されているサンプルコードのTerraformコマンドを貼り付けて実行します。
Terraform公式Webサイトから、お使いのオペレーティングシステムに適したTerraformインストールパッケージをダウンロードしてください。
Terraformランタイム環境を設定します。
Linux
次のコマンドを実行して、インストールパッケージを /usr/local/binディレクトリに解凍します。
# Replace {your_zip_path} with the path in which the installation package is stored. If the operating system does not support the unzip command, install the command. sudo unzip {your_zip_path} -d /usr/local/bin
Windows
インストールパッケージをD:\tool\terraformなどのディレクトリに解凍します。
Windowsデスクトップで、[このPC] を右クリックし、[プロパティ] を選択します。 表示されるページで、[システムの詳細設定] をクリックします。 [システムのプロパティ] ダイアログボックスで、[アドバンス] dタブの [環境変数] をクリックします。 [環境変数] ダイアログボックスで、[ユーザー変数] または [システム変数] セクションに移動します。
[システム変数] または [ユーザー変数] セクションで、[パス] を選択し、[編集] をクリックします。 表示されるダイアログボックスで、[新規] をクリックします。 次に、Terraformインストールパッケージを解凍したディレクトリ (D:\tool\terraformなど) を入力し、[OK] をクリックします。
terraform
コマンドを実行して、Terraformがインストールされているかどうかを確認します。terraform
次の図に示すように、使用可能なTerraformオプションのリストが表示されている場合、インストールは完了です。
ステップ2: Terraform ID認証の設定
Terraformを使用してAlibaba Cloudインフラストラクチャを管理する前に、Terraform Provider ID認証に合格する必要があります。 Terraformを使用してAlibaba Cloud API操作を呼び出し、Alibaba Cloudのインフラストラクチャとリソースを作成および管理できます。
Terraform ExplorerまたはCloud Shellを使用する場合、Terraform ID認証を設定する必要はありません。 アカウントにVirtual Private Cloud (VPC) およびECSリソースを管理する権限があることを確認します。
この例では、環境変数から取得したRAM (Resource Access Management) ユーザーのAccessKeyペアをID認証に使用します。
RAMユーザーのAccessKeyペアを作成します。 Alibaba Cloudアカウントには、リソースに対するすべての権限があります。 Alibaba CloudアカウントのAccessKeyペアが漏洩した場合、アカウントに属するリソースは潜在的なリスクにさらされます。 RAM ユーザーの AccessKey ペアを使用することを推奨します。 RAMユーザーのAccessKeyペアを作成する方法については、「AccessKeyペアの作成」トピックのRAMユーザーのAccessKeyペアの作成セクションをご参照ください。
RAMユーザーにECSおよびVPCリソースを管理する権限を付与します。 最小特権の原則に従うことをお勧めします。 RAMユーザーに権限を付与する方法については、「RAMユーザーに権限を付与する」をご参照ください。 このトピックで提供されるサンプルコードは、ECSインスタンス、VPC、vSwitchなどのリソースを作成します。 サンプルコードの実行に必要な権限を付与するには、次の表に示すポリシーをRAMユーザーにアタッチすることを推奨します。
Alibaba Cloud サービス
ポリシー
VPC
AliyunVPCFullAccess
ECS
AliyunECSFullAccess
認証情報を格納する環境変数を作成します。
Linux
重要exportコマンドを使用して設定された一時的な環境変数は、現在のセッションに対してのみ有効です。 セッションを終了すると、設定された環境変数は無効になります。 永続的な環境変数を設定するには、オペレーティングシステムの起動設定ファイルにexportコマンドを追加します。
# AccessKey Id export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********" # AccessKey Secret export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************" # The region in which you want to deploy resources. export ALICLOUD_REGION="cn-beijing"
Windows
Windowsデスクトップで、[このPC] を右クリックし、[プロパティ] を選択します。 表示されるページで、[システムの詳細設定] をクリックします。 [システムのプロパティ] ダイアログボックスで、[詳細設定] タブの [環境変数] をクリックします。 [環境変数] ダイアログボックスで、[ユーザー変数] または [システム変数] セクションに移動します。
[システム変数] または [ユーザー変数] セクションで、[新規作成] をクリックします。 表示されるダイアログボックスで、次の表に示す環境変数を作成します。
変数
説明
Value
ALICLOUD_ACCESS_KEY
AccessKey Id
例: LTAIUrZCw3 ********
ALICLOUD_SECRET_KEY
AccessKey Secret
例: zfwwWAMWIAiooj14GQ2 *************
ALICLOUD_REGION
リソースをデプロイするリージョン
例: cn-beijing
関連するTerraformリソース
このセクションでは、このトピックで提供されるサンプルコードで使用されるTerraformリソースについて説明します。
特定のリソースに対して課金されます。 リソースが不要になった場合は、できるだけ早い機会にリソースをリリースまたは購読解除してください。
リソース
alicloud_vpc: VPCを作成します。
alicloud_vswitch: vSwitchを作成します。
alicloud_security_group: セキュリティグループを作成します。
alicloud_security_group_rule: セキュリティグループルールを作成します。
alicloud_instance: ECSインスタンスを作成します。
データソース
alicloud_zones: 特定のインスタンスタイプのECSインスタンスを作成できるゾーンを動的に照会します。
Terraform構成ファイルのコンパイル
VPCやvSwitchなどのECSインスタンスの作成に必要なインフラストラクチャリソースをmain.tf設定ファイルで定義します。 このトピックの [完全なサンプルコード] セクションのサンプルコードを構成ファイルに直接コピーできます。
main.tf設定ファイルを作成します。
Terraformインフラストラクチャリソースは、構成ファイルで定義されます。 最初に構成ファイルを作成する必要があります。
Linux
# Create the working directory. mkdir terraform-projects && cd terraform-projects mkdir ecs-quickstart && cd ecs-quickstart # Create and open the main.tf configuration file. touch main.tf && vim main.tf
Windows
ecs-quickstartフォルダーなどのフォルダーを作成し、そのフォルダーにTerraform構成ファイルを作成します。 この例では、設定ファイル名はmain.tfです。
プロバイダー設定を構成します。
Alibaba Cloudリソースをデプロイするリージョンを指定します。
# The region in which you want to deploy resources. variable "region" { default = "cn-chengdu" } provider "alicloud" { region = var.region }
VPCを設定し、CIDRブロックをVPCに関連付けます。
VPCは、クラウド内の専用プライベートネットワークです。 VPCをパブリッククラウドで論理的に分離されたネットワークとして設定および管理できます。
variable "instance_name" { default = "tf-sample" } # The ECS instance type. variable "instance_type" { default = "ecs.e-c1m2.large" } # Query zones that match the specified conditions. data "alicloud_zones" "default" { available_disk_category = "cloud_essd" available_resource_creation = "VSwitch" available_instance_type = var.instance_type } # Create a VPC. resource "alicloud_vpc" "vpc" { vpc_name = var.instance_name cidr_block = "172.16.0.0/12" } # Create a 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 }
セキュリティグループを作成し、セキュリティグループにセキュリティグループルールを追加します。
セキュリティグループは、ECSインスタンスのインバウンドトラフィックとアウトバウンドトラフィックを制御する仮想ファイアウォールとして機能します。
# Create a security group. resource "alicloud_security_group" "default" { name = var.instance_name vpc_id = alicloud_vpc.vpc.id } # Add an inbound rule to the security group. 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インスタンスを作成します。
ECSは、高性能で安全で低コストのコンピューティング容量を提供し、Webサイトホスティング、アプリケーション開発、データ処理などのさまざまなシナリオに適しています。 ECSを使用することで、アプリケーションを迅速にデプロイして実行し、ビジネスの変化に応じてリソースを柔軟に調整できます。
# The image ID of the ECS instance. variable "image_id" { default = "ubuntu_18_04_64_20G_alibase_20190624.vhd" } # The public bandwidth of the ECS instance. variable "internet_bandwidth" { default = "10" } # The logon password of the ECS instance. variable "password" { default = "Test@12345" } # The number of ECS instances that you want to create. Default value: 1. variable "ecs_count" { default = 1 } # Create the ECS instance. resource "alicloud_instance" "instance" { count = var.ecs_count availability_zone = data.alicloud_zones.default.zones.0.id security_groups = alicloud_security_group.default.*.id password = var.password instance_type = var.instance_type system_disk_category = "cloud_essd" image_id = var.image_id instance_name = var.instance_name vswitch_id = alicloud_vswitch.vsw.id internet_max_bandwidth_out = var.internet_bandwidth } output "public_ip" { value = alicloud_instance.instance.*.public_ip }
完全なサンプルコード
Terraformコマンドを実行してリソースを作成
Terraform設定ファイルをコンパイルした後、Terraformコマンドを実行して、定義したECSインスタンスを自動的に作成します。
ステップ1: Terraformを初期化する
terraform init
コマンドを実行して、Alibaba Cloudプロバイダーのプラグインを現在のフォルダーにダウンロードしてインストールします。 また、関連するレコードファイルも生成します。
Linux
terraform init
Windows
コマンドプロンプトウィンドウを開き、Terraform構成ファイルが格納されているフォルダに移動し、terraform init
コマンドを実行してTerraformを初期化します。
# For example, the configuration file is stored in the D:/ecs-quickstart directory.
# Switch to disk D.
d:
# Go to the folder in which the configuration file is stored. In this example, the configuration file is stored in the ecs-quickstart folder. Replace the folder with the actual folder.
cd ecs-quickstart
# Run the initialization command.
terraform init
ネットワークの遅延などの理由でterraform initコマンドがタイムアウトすると、プロバイダーをダウンロードできないなどの問題が発生する可能性があります。 問題を解決するには、Alibaba CloudオープンソースイメージWebサイトを指定します。
次のコマンド出力は、Terraformが初期化されることを示します。
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.
ステップ2: Terraformコードをプレビューする
terraform plan
コマンドを実行して、次の操作を実行します。
main.tf
設定ファイルでTerraformコードの構文を確認します。現在のTerraformコードを使用して作成するリソースのプレビュー結果を表示します。
terraform plan
次のコマンド出力は、構成ファイル内のTerraformコードに構文エラーがないことを示しています。 この場合、terraform apply
コマンドを実行してリソースを作成できます。 エラーが発生した場合は、プロンプトに従ってTerraform構成ファイルを変更します。
...
Plan: 5 to add, 0 to change, 0 to destroy.
ステップ3: Terraformコードを実行する
terraform apply
コマンドを実行して、Terraformコードで定義したECSインスタンスとインスタンスの依存リソースを自動的に作成し、Pythonを自動的にインストールします。 作成プロセス中に、Terraformがすべての定義されたリソースを作成できるように、プロンプトでyesと入力します。
terraform apply
次のコマンド出力は、ECSインスタンスとその依存リソースが作成されたことを示します。
...
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 6s [id=vpc-2vcsghlpznz74XXXXXXXX]
alicloud_security_group.default: Creating...
alicloud_vswitch.vsw: Creating...
alicloud_security_group.default: Creation complete after 1s [id=sg-2vcdz6b8h9c3XXXXXXXX]
alicloud_security_group_rule.allow_tcp_22: Creating...
alicloud_security_group_rule.allow_tcp_22: Creation complete after 0s [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1]
alicloud_vswitch.vsw: Creation complete after 4s [id=vsw-2vc50dknug30bXXXXXXXX]
alicloud_instance.instance: Creating...
alicloud_instance.instance: Still creating... [10s elapsed]
alicloud_instance.instance: Creation complete after 15s [id=i-2vc3rf151bwcXXXXXXXX]
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
Outputs:
public_ip = [
"4XX.XXX.XXX.XX7",
]
ECSインスタンスへの接続
ECSインスタンスの作成後、インスタンスのパブリックIPアドレスを使用してSSH経由でインスタンスに接続できます。 詳細については、「インスタンスへの接続」をご参照ください。
ssh <Username of the ECS instance>@<Public IP address of the ECS instance>
作成結果の表示
Terraformコマンドを実行する
次のコマンドを実行して、作成されたECSインスタンスに関する情報を表示します。
# Command syntax: terraform state show <Resource type>.<Resource alias>
terraform state show alicloud_instance.instance
ECS コンソールへのログイン
ECSコンソールにログインして、作成されたECSインスタンスに関する情報を表示します。
リソースの変更
ECSインスタンスの設定を変更する場合は、設定ファイル内のリソース定義を変更できます。 たとえば、ECSインスタンスが属するセキュリティグループにインバウンドルールを追加できます。
セキュリティグループにルールを追加して、ポート443でのインバウンドトラフィックを許可する場合は、次のコードを構成ファイルに追加します。
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
コマンドを実行して、変更をプレビューします。 次のコマンド出力は、IDがsg-2vcdz6b8h9c3XXXXXXXX
のセキュリティグループにセキュリティグループルールが追加されることを示しています。... 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-2vcdz6b8h9c3XXXXXXXX" + type = "ingress" } Plan: 1 to add, 0 to change, 0 to destroy.
変更内容が期待どおりの場合は、
terraform apply
コマンドを実行してインフラストラクチャに変更を適用します。 コマンドを実行すると、変更を適用するかどうかの確認が求められます。yes
と入力し、Enterキーを押して変更を適用します。 次のコマンド出力は、IDがsg-2vcdz6b8h9c3XXXXXXXX
のセキュリティグループにセキュリティグループルールが追加されたことを示しています。... 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 0s [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
リソースのリリースRelease the resources
Terraformを使用して作成または管理された前述のリソースが不要になった場合は、次のコマンドを実行してリソースを解放します。
terraform destroy
次のコマンド出力は、リソースが解放されたことを示します。
...
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-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1]
alicloud_security_group_rule.allow_tcp_22: Destroying... [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1]
alicloud_instance.instance: Destroying... [id=i-2vc3rf151bwcXXXXXXXX]
alicloud_security_group_rule.allow_tcp_22: Destruction complete after 0s
alicloud_security_group_rule.allow_tcp_443: Destruction complete after 0s
alicloud_instance.instance: Still destroying... [id=i-2vc3rf151bwcXXXXXXXX, 10s elapsed]
alicloud_instance.instance: Destruction complete after 10s
alicloud_security_group.default: Destroying... [id=sg-2vcdz6b8h9c3XXXXXXXX]
alicloud_vswitch.vsw: Destroying... [id=vsw-2vc50dknug30bXXXXXXXX]
alicloud_security_group.default: Destruction complete after 1s
alicloud_vswitch.vsw: Destruction complete after 8s
alicloud_vpc.vpc: Destroying... [id=vpc-2vcsghlpznz74XXXXXXXX]
alicloud_vpc.vpc: Destruction complete after 6s
Destroy complete! Resources: 6 destroyed.
関連ドキュメント
ECSでサポートされている
リソース
とデータソース
の詳細については、「Terraformリファレンス」トピックのサポートされているリソースセクションを参照してください。Terraformをインストールまたは構成することなく、Terraform ExplorerでTerraformコードをデバッグできます。 詳細については、「Terraform ExplorerでのTerraformの使用」をご参照ください。
Terraformをインストールまたは設定することなく、Cloud ShellでTerraformコマンドを実行できます。 詳細については、「Cloud ShellでのTerraformの使用」をご参照ください。