このトピックでは、Terraform を使用して Linux で Alibaba Cloud リソースを迅速に作成する方法について説明します。
Terraform を使用して、コードとしてのインフラストラクチャ (IaC) を管理できます。プロシージャには、次のステップが含まれます。
Terraform をインストールする。システムが Terraform コマンドを検出して実行できることを確認します。
Terraform を構成する。統一されたメソッドを使用して Terraform の ID 認証情報を管理します。
Terraform 構成ファイルを作成する。構成ファイルは Terraform のコアです。VPC、ECS インスタンス、OSS バケットなどのリソースの作成、構成、依存関係を記述します。
リソースを初期化して作成する。これは、インフラストラクチャ設計を現実のものにするための重要なステップです。
リソースを表示および管理する。デプロイメント後、インフラストラクチャ環境を管理および保守して、最新の要件と設計仕様を満たしていることを確認できます。
リソースを破棄する。作成されたリソースが不要になった場合、対応するフォルダに作成されたリソースを破棄できます。
1. Terraform のインストール
Terraform は、Terraform コマンドを実行してクラウドリソースを作成、管理、バージョン管理できるコードとしてのインフラストラクチャ (IaC) ツールです。Terraform をインストールした後にのみ、Terraform コマンドを実行してインフラストラクチャのデプロイメントを自動化できます。インストール手順の詳細については、「プロバイダーをインストールする」をご参照ください。
2. Terraform の構成
Terraform の ID 認証は、Terraform を使用して Alibaba Cloud インフラストラクチャで操作を実行する前に、Alibaba Cloud Terraform Provider の ID を検証するプロセスです。ID 認証が成功した後にのみ、Alibaba Cloud API と通信し、Alibaba Cloud インフラストラクチャリソースを管理できます。Alibaba Cloud Terraform Provider は、複数の ID 認証メソッドをサポートしています。詳細については、「Terraform の ID 認証」をご参照ください。
このトピックでは、環境変数で RAM ユーザーの AccessKey ペアを使用して ID 認証を構成するメソッドを例として使用します。
export ALICLOUD_ACCESS_KEY="<yourAccessKeyID>"
export ALICLOUD_SECRET_KEY="<yourAccessKeySecret>"
export ALICLOUD_REGION="cn-beijing"3. Terraform 構成ファイルの作成
構成ファイルは Terraform のコアです。RAM、ECS、OSS など、クラウドまたはオンプレミスにデプロイするインフラストラクチャリソースを定義します。
ram という名前の新しいフォルダを作成し、そのフォルダに main.tf という名前の Terraform 構成ファイルを作成します。
# 作業ディレクトリを作成し、そのディレクトリに移動します。 mkdir ram && cd ram # 構成ファイルを作成して編集します。 touch main.tf && vim main.tf各 Terraform プロジェクトに独立した作業ディレクトリを作成すると、リソースの構成が明確になり、状態ファイルの難読化が防止され、バージョン管理とチームコラボレーションが容易になり、環境の隔離とモジュール管理の実装に役立ちます。このプラクティスにより、構成管理の保守性とセキュリティが向上します。
Terraform 構成ファイルを作成します。このトピックでは、RAM ユーザーを作成し、そのユーザーに ECS を管理する権限を付与する例を使用して、構成ファイルの作成方法を説明します。
次のリソースが必要です。
重要RAM ユーザーがコンソールにログインして AccessKey ペアを同時に使用することを許可しないことをお勧めします。これにより、各 RAM ユーザーの責任が明確になり、誤用を防ぐことができます。
リソース
説明
RAM ユーザーの作成
RAM ユーザーのコンソールへのログインを許可
RAM ユーザーの AccessKey ペアを作成
アクセスポリシーの作成
RAM ユーザーに権限を付与
main.tf ファイルに次のサンプルコードをコピーします。次に、
Escキーを押して挿入モードを終了し、:wqと入力して Enter キーを押し、ファイルを保存します。variable "user_name" { default = "terraform_user_test" } variable "user_password" { default = "!Test@123456" } variable "user_display_name" { default = "TestAccount" } variable "user_mobile" { default = "86-18688888888" } variable "user_email" { default = "example@example.com" } resource "alicloud_ram_user" "user" { name = var.user_name display_name = var.user_display_name mobile = var.user_mobile email = var.user_email comments = "Created by Terraform" force = true } resource "alicloud_ram_login_profile" "profile" { user_name = alicloud_ram_user.user.name password = var.user_password } resource "alicloud_ram_access_key" "ak" { user_name = alicloud_ram_user.user.name secret_file = "accesskey.txt" } resource "alicloud_ram_policy" "policy" { policy_name = "tf-example-policy" policy_document = <<EOF { "Statement": [ { "Action": "ecs:*", "Effect": "Allow", "Resource":"*" } ], "Version": "1" } EOF description = "This is a policy test." } resource "alicloud_ram_user_policy_attachment" "attach" { policy_name = alicloud_ram_policy.policy.policy_name policy_type = alicloud_ram_policy.policy.type user_name = alicloud_ram_user.user.name }
4. リソースの初期化と作成
Terraform 構成ファイルを作成した後、リソースを作成する前に作業ディレクトリを初期化する必要があります。
4.1 Terraform の初期化
現在のターミナルで terraform init コマンドを実行して初期化を実行します。terraform init コマンドは、Terraform 構成ファイルを使用する前に実行する必要がある最初のコマンドです。このコマンドは、Terraform の作業ディレクトリを初期化します。これには、必要な Alibaba Cloud プロバイダープラグインやその他のレコードファイルのダウンロードが含まれます。
4.2 リソースの作成
terraform planコマンドを実行して実行計画を作成します。この計画には、terraform applyコマンドを実行したときに作成、変更、または破棄されるすべてのリソースに関する情報が表示されます。
terraform applyコマンドを実行して、terraform planコマンドによって生成された実行計画に基づいてリソースを作成します。作成プロセス中に、プロンプトが表示されたら yes と入力してリソースの作成を続行します。変数値の渡し方の詳細については、「変数」の変数設定メソッドをご参照ください。
5. リソースの表示と管理
デプロイメント後、インフラストラクチャ環境を管理および保守して、最新の要件と設計仕様を満たしていることを確認できます。
5.1 リソースの表示
terraform showコマンドを実行して、リソースの詳細情報を表示します。
terraform state listコマンドを実行して、作成されたすべてのリソースをリストします。
terraform state show <resource type>.<resource name>コマンドを実行して、特定のリソースの詳細情報を表示します。
作成されたリソースに関する情報を Alibaba Cloud 管理コンソールで表示します。
5.2 リソースの管理
Terraform がリソースを作成および変更した後、リソースのステータスとプロパティ情報を terraform.tfstate ファイルに保存します。terraform state コマンドを使用して状態を管理できます。詳細については、「状態メカニズムの概要」をご参照ください。
5.3 リソースの変更
main.tf などの構成ファイルで、変更したいリソースの定義を変更します。たとえば、RAM ユーザーの権限を減らして、ユーザーが ECS インスタンスをクエリする権限のみを持つようにすることができます。
vim main.tfコマンドを実行し、i キーを押して編集モードに入ります。次のコードをコピーし、それを使用して main.tf ファイルの alicloud_ram_policy セクションを置き換えます。
resource "alicloud_ram_policy" "policy" { policy_name = "tf-example-policy" policy_document = <<EOF { "Statement": [ { "Action": [ "ecs:Get*", "ecs:List*", "ecs:Describe*" ], "Effect": "Allow", "Resource":"*" } ], "Version": "1" } EOF description = "This is a policy test." }Esc を押し、:wq と入力してファイルを保存します。
terraform planコマンドを実行して変更をプレビューします。
変更が期待どおりである場合は、
terraform applyコマンドを実行してインフラストラクチャに変更を適用します。このコマンドを実行すると、Terraform は変更の確認を求めます。yesと入力し、Enter キーを押して変更を適用します。
6. リソースの破棄
作成されたリソースが不要になった場合、terraform destroy コマンドを実行して作成されたすべてのリソースを破棄できます。
複数のバージョンを持つ作成済みのアクセスポリシーを破棄する場合、terraform destroy コマンドではリソースを直接破棄できません。force パラメーターを alicloud_ram_policy に追加し、値を true に設定して、ポリシーのすべてのバージョンを強制削除できます。ポリシーが他の RAM ユーザーまたは RAM ロールによって参照されている場合、ポリシーが削除される前に、関連付けは自動的に削除されます。force プロパティは注意して使用してください。

完全な例
Terraform をすぐに試せるように、このトピックでは完全な Terraform コードを提供します。コードをコピーして実行できます。
variable "user_name" {
default = "terraform_user_test"
}
variable "user_password" {
default = "!Test@123456"
}
variable "user_display_name" {
default = "TestAccount"
}
variable "user_mobile" {
default = "86-18688888888"
}
variable "user_email" {
default = "example@example.com"
}
resource "alicloud_ram_user" "user" {
name = var.user_name
display_name = var.user_display_name
mobile = var.user_mobile
email = var.user_email
comments = "Created by Terraform"
force = true
}
resource "alicloud_ram_login_profile" "profile" {
user_name = alicloud_ram_user.user.name
password = var.user_password
}
resource "alicloud_ram_access_key" "ak" {
user_name = alicloud_ram_user.user.name
secret_file = "accesskey.txt"
}
resource "alicloud_ram_policy" "policy" {
policy_name = "tf-example-policy"
policy_document = <<EOF
{
"Statement": [
{
"Action": "ecs:*",
"Effect": "Allow",
"Resource":"*"
}
],
"Version": "1"
}
EOF
description = "This is a policy test."
}
resource "alicloud_ram_user_policy_attachment" "attach" {
policy_name = alicloud_ram_policy.policy.policy_name
policy_type = alicloud_ram_policy.policy.type
user_name = alicloud_ram_user.user.name
}