Terraform は、インフラストラクチャ管理を自動化するための IaC (Infrastructure as Code) ツールです。シンプルなコードを使用して、クラウドインフラストラクチャを定義し、プロビジョニングすることができます。このトピックでは、Terraform を使用して Elastic Compute Service (ECS) インスタンスを作成する方法を説明します。
Terraform の詳細については、「Alibaba Cloud Terraform とは」をご参照ください。
前提条件
1. Terraform のインストール
このトピックでは、Linux または Windows オペレーティングシステムにパッケージから Terraform をインストールする方法を説明します。
Alibaba Cloud は、ローカルにインストールすることなく Terraform コマンドを実行できる 2 つのオンライン環境を提供しています:
Terraform Explorer: [デバッグを開始] をクリックして、このトピックのサンプルコードを実行します。
Cloud Shell: このトピックで提供されているコードをコピーし、「Terraform を使用したリソースの作成」で直接 Terraform コマンドを実行します。
Terraform 公式サイトにアクセスし、お使いのオペレーティングシステム用のパッケージをダウンロードします。
Terraform の実行環境を設定します。
Linux
次のコマンドを実行して、パッケージを /usr/local/bin に展開します。
# {your_zip_path} をパッケージのパスに置き換えてください。システムが unzip コマンドをサポートしていない場合は、先にインストールしてください。 sudo unzip {your_zip_path} -d /usr/local/binWindows
パッケージを展開します。例えば、展開先のディレクトリは D:\tool\terraform です。
デスクトップで、PC を右クリックし、 を選択します。
システム環境変数またはユーザー環境変数の Path をクリックし、[編集] > [新規] を選択し、Terraform を展開したディレクトリ (例:D:\tool\terraform) を入力して、[OK] をクリックして設定を完了します。
-
terraformコマンドを実行して、パスの設定を確認します。terraformコマンドが Terraform のオプションリストを表示した場合、インストールは成功です。
➜ ~ terraform Usage: terraform [global options] <subcommand> [args] The available commands for execution are listed below. The primary workflow commands are given first, followed by less common or more advanced commands. Main commands: init Prepare your working directory for other commands validate Check whether the configuration is valid plan Show changes required by the current configuration apply Create or update infrastructure destroy Destroy previously-created infrastructure All other commands: console Try Terraform expressions at an interactive command prompt fmt Reformat your configuration in the standard style force-unlock Release a stuck lock on the current workspace get Install or upgrade remote Terraform modules graph Generate a Graphviz graph of the steps in an operation import Associate existing infrastructure with a Terraform resource login Obtain and save credentials for a remote host logout Remove locally-stored credentials for a remote host metadata Metadata related commands output Show output values from your root module providers Show the providers required for this configuration refresh Update the state to match remote systems show Inspect Terraform state or plan state Advanced state management taint Mark a resource instance as not fully functional test Execute integration tests for Terraform modules untaint Remove the 'tainted' state from a resource instance version Show the current Terraform version workspace Workspace management Global options (use these before the subcommand, if any): -chdir=DIR Switch to a different working directory before executing the given subcommand. -help Show this message, or the help for a given subcommand. -version An alias for the "version" subcommand. show Show the current state or a saved plan state Advanced state management taint Mark a resource instance as not fully functional test Experimental support for module integration testing untaint Remove the 'tainted' state from a resource instance version Show the current Terraform version workspace Workspace management Global options (use these before the subcommand, if any): -chdir=DIR Switch to a different working directory before executing the given subcommand. -help Show this help output, or the help for a specified subcommand. -version An alias for the "version" subcommand.
2. Terraform 認証の設定
Terraform を使用して Alibaba Cloud リソースを管理する前に、Alibaba Cloud プロバイダーの認証を設定する必要があります。これにより、Terraform は必要な API を呼び出してインフラストラクチャを作成および管理できます。
Terraform Explorer または Cloud Shell を使用する場合、手動で認証を設定する必要はありません。ログインしているアカウントに、Virtual Private Cloud (VPC) と ECS リソースを管理する権限があることを確認してください。
このトピックでは、環境変数として保存された Resource Access Management (RAM) ユーザーの AccessKey を使用して認証を行います:
Alibaba Cloud アカウント (root ユーザー) はリソースに対する完全な権限を持っているため、AccessKey が漏洩すると高いセキュリティリスクが生じます。代わりに RAM ユーザーの AccessKey を使用することを推奨します。RAM ユーザーの AccessKey の作成方法については、「AccessKey ペアの作成」をご参照ください。
RAM ユーザーに ECS および VPC リソースを管理する権限を付与する際は、最小権限の原則に従うことを推奨します。RAM ユーザーに権限を付与する方法の詳細については、「RAM ユーザー権限の管理」をご参照ください。このトピックのサンプルコードでは、ECS、VPC、vSwitch などのリソースを作成する必要があります。サンプルを実行するには、RAM ユーザーに次の権限を付与します:
サービス
ポリシー
VPC
この例では、システムポリシー AliyunVPCFullAccess を選択します。
ECS
この例では、システムポリシー AliyunECSFullAccess を選択します。
認証情報を保存するための環境変数を作成します。
Linux
重要exportコマンドで設定された環境変数は一時的なもので、現在のセッションでのみ有効です。永続化するには、コマンドをシェルのスタートアップファイルに追加してください。# ご利用の AccessKey ID。 export ALICLOUD_ACCESS_KEY="yourAccessKeyID" # ご利用の AccessKey Secret。 export ALICLOUD_SECRET_KEY="yourAccessKeySecret" # リソースがデプロイされるリージョン。 export ALICLOUD_REGION="cn-chengdu"Windows
デスクトップで、この PC を右クリックし、を選択します。
[システム変数] または [ユーザー変数] セクションで、[新規] をクリックして、以下の環境変数を作成します。
変数
説明
値
ALICLOUD_ACCESS_KEY
ご利用の AccessKey ID。
yourAccessKeyID
ALICLOUD_SECRET_KEY
ご利用の AccessKey Secret。
yourAccessKeySecret
ALICLOUD_REGION
リソースがデプロイされるリージョン。
例:cn-chengdu
関連する Terraform リソース
このトピックのサンプルコードでは、以下の Terraform リソースを使用します。
このチュートリアルで使用される一部のリソースには料金が発生します。予期しない課金を避けるため、不要になったリソースはクリーンアップしてください。
リソース
alicloud_vpc:VPC を作成します。
alicloud_vswitch:vSwitch を作成します。
alicloud_security_group:セキュリティグループを作成します。
alicloud_security_group_rule:セキュリティグループルールを作成します。
alicloud_instance:ECS インスタンスを作成します。
データソース
alicloud_zones:指定されたインスタンスタイプで利用可能なゾーンを検索します。
Terraform 設定ファイルの作成
ECS インスタンスや VPC など、ECS インスタンスの作成に必要なインフラストラクチャリソースを main.tf ファイルに定義します。「完全なサンプルコード」セクションのコードを設定ファイルにコピーできます。
設定ファイルの作成
このファイルは
.tf拡張子で終わる必要があり、すべてのリソース定義が含まれます。Linux
# 作業ディレクトリを作成します。 mkdir terraform-projects && cd terraform-projects mkdir ecs-quickstart && cd ecs-quickstart # 設定ファイルを作成して編集します。 touch main.tf && vim main.tfWindows
ecs-quickstartという名前の新しいフォルダを作成します。フォルダ内に、main.tf という名前の Terraform 設定ファイルを作成します。-
プロバイダー設定の定義
Alibaba Cloud リソースデプロイメントのリージョンを設定します。
# リソースが配置されるリージョン。 variable "region" { default = "cn-chengdu" } provider "alicloud" { region = var.region } -
VPC とその vSwitch の定義
VPC は、クラウド内で論理的に分離されたプライベートネットワークであり、設定および管理が可能です。
variable "instance_name" { default = "tf-sample" } # ECS インスタンスのインスタンスタイプ。 variable "instance_type" { default = "ecs.e-c1m2.large" } # 指定された条件を満たすアベイラビリティゾーンを照会します。 data "alicloud_zones" "default" { available_disk_category = "cloud_essd" available_resource_creation = "VSwitch" available_instance_type = var.instance_type } # VPC を作成します。 resource "alicloud_vpc" "vpc" { vpc_name = var.instance_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 } -
セキュリティグループの定義
セキュリティグループは、ECS インスタンスのインバウンドおよびアウトバウンドトラフィックを制御する仮想ファイアウォールとして機能します。
# セキュリティグループを作成します。 resource "alicloud_security_group" "default" { name = var.instance_name vpc_id = alicloud_vpc.vpc.id } # セキュリティグループにインバウンドルールを追加します。 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 は、アプリケーションのデプロイ、ウェブサイトのホスティング、データ処理など、さまざまなシナリオに対応する、安全でスケーラブル、かつパフォーマンスに優れた計算能力を提供します。
# ECS インスタンスのイメージ ID。 variable "image_id" { default = "ubuntu_18_04_64_20G_alibase_20190624.vhd" } # ECS インスタンスのパブリック帯域幅。 variable "internet_bandwidth" { default = "10" } # ECS インスタンスのログインパスワード。 variable "password" { default = "Test@12345" } # 作成する ECS インスタンスの数。デフォルト値は 1 です。 variable "ecs_count" { default = 1 } # ECS インスタンスを作成します。 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 = [for i in range(var.ecs_count) : alicloud_instance.instance[i].public_ip] }
完全なサンプルコード
Terraform コマンドの実行
設定ファイルを作成した後、Terraform コマンドを実行して ECS インスタンスを作成します。
1. Terraform の初期化
terraform init コマンドは、Alibaba Cloud プロバイダープラグインを現在のフォルダにダウンロードしてインストールし、さまざまなレコードファイルを生成します。
Linux
terraform initWindows
コマンドプロンプト (cmd) を開き、Terraform 設定ファイルが含まれるディレクトリに移動し、terraform init コマンドを実行して初期化します。
# 設定ファイルは D:/ecs-quickstart ディレクトリにあります。
# D ドライブに切り替えます。
d:
# 設定ファイルがあるディレクトリに切り替えます。ecs-quickstart を実際のディレクトリパスに置き換えてください。
cd ecs-quickstart
# 初期化コマンドを実行します。
terraform init次の出力は、初期化が成功したことを示します。
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 plan を実行して、次の機能を実行します:
main.tfの Terraform コードの構文を検証します。現在の Terraform コードに基づいて作成されるリソースをプレビューします。
terraform plan
出力が Terraform 設定ファイルに構文エラーがないことを示している場合、terraform apply コマンドを実行してリソースを作成できます。他のエラーメッセージが表示された場合は、メッセージに従って Terraform 設定ファイルを修正してください。
...
Plan: 5 to add, 0 to change, 0 to destroy.
3. 設定の適用
terraform apply を実行して、ECS インスタンスとその依存リソースを自動的に作成し、Python をインストールします。作成プロセス中にプロンプトが表示されたら、yes と入力して、Terraform が定義されたすべてのリソースを作成できるようにします。
terraform apply
次の出力は、Terraform がリソースを作成したことを示します。
...
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 インスタンスへの接続
インスタンスが作成された後、そのパブリック IP アドレスを使用して SSH 経由でリモート接続できます。接続方法の詳細については、「接続方法の概要」をご参照ください。
ssh <username>@<public_ip_address>結果の検証
Terraform コマンドの実行
次のコマンドを実行して、作成された ECS インスタンスに関する情報を表示できます。
# フォーマット: terraform state show <resource_type>.<resource_name>[index]
terraform state show alicloud_instance.instance[0]コンソールでの確認
ECS コンソールにログインして、作成された ECS インスタンスを表示できます。Terraform コードを実行すると、tf-sample という名前のインスタンスが作成され、[インスタンス] ページで [実行中] 状態になります。インスタンスは、中国 (成都) リージョンのアベイラビリティゾーン A にデプロイされます。インスタンスタイプは ecs.e-c1m2.large (2 vCPU と 4 GiB メモリ)、プライベート IP アドレスは 172.16.0.100、支払い方法は従量課金、ネットワークタイプは VPC です。
リソースの変更
設定を調整する必要がある場合は、設定ファイル内のリソース定義を変更できます。たとえば、セキュリティグループに新しいインバウンドルールを追加できます。
ポート 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コマンドを実行してインフラストラクチャに変更を適用します。Terraform から確認を求められたら、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.
リソースのクリーンアップ
リソースが不要になったら、次のコマンドを実行して破棄します。
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 でサポートされている
ResourceおよびData Sourceタイプについては、「サポートされているリソースのリスト」をご参照ください。Terraform Explorer で Terraform を使用すると、Terraform をインストールまたは設定せずに Terraform コードをデバッグできます。
「Terraform を使用したリソースの作成」で Terraform を使用すると、Terraform をインストールまたは設定せずに手動で Terraform コマンドを実行できます。