Terraform は、開発者が宣言型言語を使用してインフラストラクチャ構成を定義および管理するために使用できる、オープンソースの Infrastructure as Code(IaC)ツールです。 Terraform は、Elastic Compute Service(ECS)リソースを作成、変更、または削除するための簡単な方法を提供します。 Terraform は、手動操作の複雑さとエラーを軽減し、インフラストラクチャの管理性と保守性を向上させます。 このトピックでは、Terraform をインストールおよび構成し、Terraform を使用して ECS インスタンスを作成する方法について説明します。
Terraform の基本機能
Terraform は、IT インフラストラクチャの自動オーケストレーションをサポートするツールです。 Terraform を使用すると、コードを使用して IT リソースを管理および保守できます。 詳細については、「Terraform とは」をご参照ください。
Terraform は、使いやすい CLI を提供します。この CLI を使用すると、Alibaba Cloud またはサードパーティクラウドに構成ファイルをデプロイし、構成ファイルのバージョンを管理できます。 Terraform を使用すると、構成ファイルでクラウドトポロジを構築するために必要なインフラストラクチャリソースを定義できます。 リソースには、仮想マシン(VM)、ストレージアカウント、ネットワークインターフェースなどが含まれます。
Terraform は、Alibaba Cloud プロバイダーと統合して、新しいインフラストラクチャをサポートできます。 テンプレートを使用して Alibaba Cloud プロバイダーを構成し、Alibaba Cloud 上でクラウドインフラストラクチャを定義、プレビュー、およびデプロイできます。
Terraform を使用して、複数の Alibaba Cloud サービスのリソースを作成、変更、および削除できます。
Alibaba Cloud サービスと Terraform の統合方法については、Alibaba Cloud プロバイダー を参照してください。
Terraform のインストール
Cloud Shell を使用する
Alibaba Cloud の Cloud Shell は、Terraform が付属する無料の O&M サービスです。 Cloud Shell で Terraform コマンドを直接実行できます。
関連する権限を持つ有効な Alibaba Cloud アカウントを持っていることを確認してください。
ブラウザを開き、アドレスバーに https://shell.alibabacloud.com/ と入力して Cloud Shell にアクセスします。
Cloud Shell にログインした後、次のコマンドを実行します。
terraform
次の図に示すコマンド出力は、Terraform が Cloud Shell で使用可能であり、直接使用できることを示しています。
Cloud Shell の使用方法については、「Cloud Shell の使用」をご参照ください。
手動インストール
プリコンパイル済みパッケージを使用する
Terraform 公式 Web サイト にログインし、お使いのオペレーティングシステムに基づいて ZIP パッケージを見つけ、ダウンロードします。
ダウンロードしたパッケージを /usr/local/bin ディレクトリに解凍します。 ダウンロードしたパッケージは、解凍後に削除できます。 これは Terraform の動作には影響しません。
PATH 環境変数に Terraform ディレクトリが定義されていることを確認してください。 PATH 環境変数の値は、オペレーティングシステムによって異なります。
Windows
[コントロールパネル] > [システム] > [システム設定] > [環境変数] を選択します。
システム変数で PATH が見つかるまで下にスクロールします。
[編集] をクリックして、PATH 環境変数の値を変更します。
ディレクトリはセミコロン(;)で区切ります。 例:c:\path;c:\path2。
設定を有効にするには、コマンドラインツールを起動します。
詳細については、「Windows で .exe を作成するためのパスを設定できる場所」をご参照ください。
macOS または Linux
PATH 環境変数の値を表示します。
echo $PATH
Terraform のバイナリファイルを、PATH 環境変数の値にあるディレクトリのいずれかに移動します。 mv コマンドで、ソースディレクトリとデスティネーションディレクトリを指定できます。 たとえば、Terraform のバイナリファイルが Downloads フォルダにあり、PATH
環境変数の値に /usr/local/bin
ディレクトリが含まれている場合は、次のコマンドを実行できます。
mv ~/Downloads/terraform /usr/local/bin/
詳細については、以下のトピックをご参照ください。
ソースコードを使用する
ソースコードからバイナリファイルをコンパイルする場合は、次のコマンドを実行して HashiCorp Terraform リポジトリ をクローンします。
git clone https://github.com/hashicorp/terraform.git
次の図のコマンド出力は、クローンの進行状況を示しています。 クローンが完了するまで待ちます。
リポジトリのクローンが作成されると、install コマンドを実行するディレクトリに terraform という名前のディレクトリが追加されます。 cd コマンドを実行して /terraform ディレクトリに移動します。
cd terraform
install コマンドを実行してディレクトリをコンパイルし、コンパイルされたパッケージを $GOPATH/bin/terraform ディレクトリに移動します。
go install
次の図に示すコマンド出力は、コンパイルが進行中であることを示しています。 コンパイルが完了するまで待って、次の手順に進みます。
「zsh: command not found: go」というエラーメッセージが表示された場合は、最初に Go 環境をインストール する必要があることに注意してください。
PATH 環境変数に Terraform ディレクトリが定義されており、使用可能であることを確認してください。 PATH 環境変数の値は、オペレーティングシステムによって異なります。
macOS または Linux
PATH 環境変数の値を表示します。
echo $PATH
Terraform のバイナリファイルを、PATH 環境変数の値にあるディレクトリのいずれかに移動します。 mv コマンドでソースディレクトリとデスティネーションディレクトリを指定できます。 たとえば、Terraform のバイナリファイルが Downloads フォルダにあり、PATH
環境変数の値に /usr/local/bin
ディレクトリが含まれている場合は、次のコマンドを実行できます。
mv ~/Downloads/terraform /usr/local/bin/
詳細については、以下のトピックをご参照ください。
Windows
[コントロールパネル] > [システム] > [システム設定] > [環境変数] を選択します。
システム変数で PATH が見つかるまで下にスクロールします。
[編集] をクリックして、PATH 環境変数の値を変更します。
ディレクトリはセミコロン(;)で区切ります。 例:c:\path;c:\path2。
設定を有効にするには、コマンドラインツールを起動します。
詳細については、「Windows で .exe を作成するためのパスを設定できる場所」をご参照ください。
macOS Homebrew
Homebrew は、macOS にパッケージをインストールするためによく使用されるツールです。 Homebrew を使用して、いくつかのコマンドで Terraform をインストールできます。
手順 1:HashiCorp tap をインストールします。これは、HashiCorp のすべての Homebrew パッケージのリポジトリです。
brew tap hashicorp/tap
手順 2:次のコマンドを実行して Terraform をインストールします。
brew install hashicorp/tap/terraform
このコマンドは、Terraform の最新バージョンをインストールします。 Terraform のインストール後に新しいバージョンが利用可能な場合は、upgrade コマンドを実行して Terraform を更新できます。
Terraform を更新する前に、まず次のコマンドを実行して Homebrew を更新する必要があります。
brew update
次のコマンドを実行して、Terraform を最新バージョンに更新します。
brew upgrade hashicorp/tap/terraform
Linux
Alibaba Cloud Linux
yum install -y dnf-plugin-releasever-adapter
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
yum install terraform
Windows Chocolatey
Chocolatey は、Windows にパッケージをインストールするためによく使用されるツールです。 Chocolatey を使用して、いくつかのコマンドで Terraform をインストールできます。
choco install terraform
Terraform の認証
特定の環境変数にアクセス認証情報を保存し、その環境変数を使用して Terraform を認証できます。 Terraform コマンドを実行する際に、構成テンプレートでアクセス認証情報が明示的に宣言されていない場合、Terraform は環境変数からアクセス認証情報を取得できます。 オペレーティングシステムに基づいて環境変数を構成します。
Windows
Windows デスクトップで、[この PC] を右クリックし、[プロパティ] を選択します。表示されるページで、[システムの詳細設定] をクリックします。 [システムのプロパティ] ダイアログボックスで、[詳細設定] タブの [環境変数] をクリックします。 [環境変数] ダイアログボックスが表示され、[ユーザー環境変数] セクションと [システム環境変数] セクションで構成されています。
[システム環境変数] セクションまたは [ユーザー環境変数] セクションで、[新規] をクリックします。 表示されるダイアログボックスで、次の表に示す環境変数を作成します。
変数
説明
値
ALICLOUD_ACCESS_KEY
AccessKey ID。
例: LTAIUrZCw3********
ALICLOUD_SECRET_KEY
AccessKey シークレット。
例: zfwwWAMWIAiooj14GQ2*************
ALICLOUD_SECURITY_TOKEN
オプション。 セキュリティトークンサービス (STS) トークンを使用する場合は、この変数を指定する必要があります。
例: sts.fr2nlrnlwnelr3*******
Linux
export コマンドを使用して構成された一時的な環境変数は、現在のセッションでのみ有効です。 セッションを終了すると、構成された環境変数は無効になります。 永続的な環境変数を構成するには、export コマンドをオペレーティングシステムの起動構成ファイルに追加します。
# Access Key Id
$ export ALICLOUD_ACCESS_KEY="<Your AccessKey ID>" // アクセスキー ID
# Access Key Secret
$ export ALICLOUD_SECRET_KEY="<Your AccessKey secret>" // アクセスキーシークレット
# If you use an STS token, set the ALICLOUD_SECURITY_TOKEN environment variable to the STS token.
$ export ALICLOUD_SECURITY_TOKEN="<Your STS token>" // STS トークンを使用する場合は、ALICLOUD_SECURITY_TOKEN 環境変数を STS トークンに設定します。
環境変数を構成した後、アクセス認証情報を明示的に宣言する必要はありません。または、構成テンプレートのプロバイダーコードブロックでリージョン ID のみ宣言できます。
provider "alicloud" {
region = "cn-hangzhou"
}
ALICLOUD_REGION
環境変数を使用してリージョン ID を指定することもできます。 リージョン ID が宣言されておらず、 ALICLOUD_REGION 環境変数が構成されていない場合は、リージョンパラメーターの値として cn-beijing が使用されます。
サポートされているリソース
各リソースは、インフラストラクチャコンポーネントを定義するために使用される新しいリソース(ECS インスタンス、仮想マシン(VM)、セキュリティグループなど)です。
Terraform を使用して ECS リソースを作成および管理する
このセクションでは、Terraform を使用して ECS インスタンスを作成する方法について説明します。
作業ディレクトリと、そのディレクトリに main.tf という名前の構成ファイルを作成します。次のコードは、ECS インスタンスと、ECS インスタンスの作成に必要な VPC(Virtual Private Cloud)、セキュリティグループ、および vSwitch を作成するために使用されます。次のコードを main.tf 構成ファイルにコピーします。
# Alibaba Cloud リージョンを表す region という名前の変数を定義します。この変数のデフォルト値は cn-beijing です。 variable "region"{ default = "cn-beijing" } # Alibaba Cloud プロバイダーを構成し、region 変数で定義されたリージョンを指定します。 provider "alicloud"{ region = var.region } # ECS インスタンスタイプを表す instance_type という名前の文字列変数を定義します。この変数のデフォルト値は ecs.e-c1m1.large です。 variable "instance_type" { type = string default = "ecs.e-c1m1.large" } # データソースを使用して、指定されたインスタンスタイプ、リソースタイプ(vSwitch など)、およびディスクカテゴリをフィルターとして構成し、ECS インスタンスを作成できるゾーンをクエリします。 data "alicloud_zones" "default" { available_instance_type = var.instance_type available_resource_creation = "VSwitch" available_disk_category = "cloud_essd" } # VPC に関連付ける CIDR ブロックを表す vpc_cidr_block という名前の変数を定義します。この変数のデフォルト値は 172.16.0.0/16 です。 variable "vpc_cidr_block" { default = "172.16.0.0/16" } # vSwitch に関連付ける CIDR ブロックを表す vsw_cidr_block という名前の変数を定義します。この変数のデフォルト値は 172.16.0.0/24 です。 variable "vsw_cidr_block" { default = "172.16.0.0/24" } # 特定のリソース名の一意性を確保するために、10000 から 99999 までのランダムな整数を生成します。 resource "random_integer" "default" { min = 10000 max = 99999 } # vpc-test という名前の VPC を作成し、ランダムな整数を使用して名前の一意性を確保します。 resource "alicloud_vpc" "vpc" { vpc_name = "vpc-test_${random_integer.default.result}" cidr_block = var.vpc_cidr_block } # 作成された VPC にセキュリティグループを作成し、ランダムな整数を使用してセキュリティグループ名の一意性を確保します。 resource "alicloud_security_group" "group" { security_group_name = "test_${random_integer.default.result}" # test_$ を実際の値に置き換えます。 vpc_id = alicloud_vpc.vpc.id } # 作成されたセキュリティグループ内のすべての TCP トラフィックを許可するセキュリティグループのインバウンドルールを作成します。 resource "alicloud_security_group_rule" "allow_all_tcp" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" # nic_type パラメーターを 'intranet' に設定します。 policy = "accept" port_range = "1/65535" priority = 1 security_group_id = alicloud_security_group.group.id cidr_ip = "0.0.0.0/0" } # 指定されたゾーンと作成された VPC に vSwitch を作成し、ランダムな整数を使用して vSwitch 名の一意性を確保します。 resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = var.vsw_cidr_block zone_id = data.alicloud_zones.default.zones[0].id vswitch_name = "vswitch-test-${random_integer.default.result}" } # ゾーン、セキュリティグループ、インスタンスタイプなどの複数のパラメーターを指定して ECS インスタンスを作成し、ランダムな整数を使用してインスタンス名の一意性を確保します。 resource "alicloud_instance" "instance" { availability_zone = data.alicloud_zones.default.zones[0].id security_groups = [alicloud_security_group.group.id] instance_type = var.instance_type system_disk_category = "cloud_essd" system_disk_name = "test_foo_system_disk_${random_integer.default.result}" system_disk_description = "test_foo_system_disk_description" image_id = "aliyun_2_1903_x64_20G_alibase_20240628.vhd" instance_name = "test_ecs_${random_integer.default.result}" vswitch_id = alicloud_vswitch.vswitch.id internet_max_bandwidth_out = 10 password = "Terraform@Example" # ECS インスタンスのパスワードを構成します。Terraform@Example を実際の値に置き換えます。 }
Terraform ランタイム環境を初期化するには、次のコマンドを実行します。
terraform init
次のコマンド出力は、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.
コードを実行するには、次のコマンドを実行します。
terraform apply
コードの実行中に、プロンプトが表示されたら
yes
と入力し、[enter] キーを押します。実行が完了するまで待ちます。次のコマンド出力は、コードが実行されたことを示しています。You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure. 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 Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
結果を確認します。
terraform show コマンドを実行する
作業ディレクトリで次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。
terraform show
ECS コンソールにログインする
ECS コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。上部のナビゲーションバーで、ECS インスタンスが作成されたリージョンを選択します。この例では、[中国 (北京)] を選択して、作成された ECS インスタンスを表示します。
参考資料
Terraform のユースケースについては、「ベストプラクティス」をご参照ください。
一般的な Terraform コマンドについては、「一般的なコマンド」をご参照ください。
Terraform は ROS でマネージドサービスとして利用できます。 ROS コンソール で Terraform テンプレートをデプロイできます。詳細については、「Terraform スタックの作成」をご参照ください。