Terraform は、リソースの自動オーケストレーションを行うオープンソースツールです。Terraform は、Resource Orchestration Service (ROS) でマネージドサービスとして利用できます。本トピックで説明する開発方法および推奨事項は、ROS で管理される Terraform の関連概念に精通しており、Terraform コードを開発して ROS で使用したいユーザーを対象としています。
開発方法
ご自身が慣れている開発方法を使用して Terraform コードを作成・テストすることを推奨します。以下のいずれかの開発方法をご利用いただけます。
オンプレミス環境を使用する。
Terraform オンラインデバッグツール を使用する。この方法は Alibaba Cloud リソースに対してのみ使用できます。
ROS コンソールで Terraform スタックを作成し、ビジネス要件に基づいてスタックの作成を継続するか、スタックを更新します。詳細については、「Terraform スタックの作成」、「スタック作成の継続」、および「スタックの更新」をご参照ください。
開発推奨事項
.tf ファイル内に Alibaba Cloud プロバイダー (alicloud) を宣言しないでください。
ROS は、ご利用の Alibaba Cloud アカウントのテンポラリ AccessKey ペアまたはセキュリティトークンサービス (STS) 認証情報とスタックリージョンを使用するデフォルトプロバイダー alicloud を提供します。ROS のデフォルトプロバイダーには、以下のメリットがあります。
開発が容易になり、セキュリティが向上し、AccessKey ペア漏洩のリスクが低減されます。
リソースとスタックが同一アカウントおよび同一リージョンに属するため、集中管理および統合が可能になります。
リソースとスタックが同一アカウントおよび同一リージョンに属することで、価格照会、システムタグ、カスタムスタックタグの伝播、スタックリソースグループの伝播、リスク検出などの機能が強化されます。
説明スタックおよびスタックグループが異なるアカウントおよびリージョンに属する場合、特定のシナリオにおいて価格照会、システムタグ、カスタムスタックタグの伝播、およびリスク検出がサポートされます。
スタックおよびスタックグループが異なるリージョンに属する場合、特定のシナリオにおいてスタックリソースグループの伝播がサポートされます。
オンプレミスコードは、ファイル名の末尾に .debug.tf を付けて保存してください。
Terraform コードが ROS で管理されている場合、ROS はファイル名の末尾が .debug.tf であるファイルを無視し、Terraform はこれらのファイルをオーケストレーションしません。一方、オンプレミス環境で Terraform コードをテストする際には、Terraform がこれらのファイルをオーケストレーションします。たとえば、alicloud プロバイダーを構成するために provider.debug.tf という名前のファイルを作成したとします。このファイルをオンプレミス環境でコード開発に使用すると、ファイル内の構成が有効になり、リソースは中国 (香港) リージョンに作成されます。ただし、このファイルを ROS でスタック作成に使用すると、ファイルは無視され、リソースはスタックのリージョンに作成されます。以下のサンプルコードは、provider.debug.tf ファイルの内容を示しています。
variable "region" { type = string default = "cn-hongkong" } provider "alicloud" { region ="${var.region}" }-
プロバイダーバージョンを指定してください。
ROS で管理される Terraform は、Aliyun::Terraform-v1.0 のリリース以降、複数のプロバイダーバージョンをサポートしています。プロバイダーバージョンを指定することで、プロバイダーバージョンの更新に起因する問題を防止し、ビジネスの安定性を確保できます。サンプルコードを以下に示します。
terraform { required_providers { alicloud = { source = "aliyun/alicloud" version = "1.140.0" } } }プロバイダーバージョンの詳細については、「ROS のバージョンサポート」のプロバイダーバージョン列をご参照ください。
Aliyun::Terraform-v1.0 以降を使用してください。
Aliyun::Terraform-v0.12 および Aliyun::Terraform-v0.15 は互換性維持目的でのみ使用されており、対応するプロバイダーバージョンおよび機能は更新されません。
.tfvars ファイルではなく ROS パラメーターを使用して変数値を渡してください。
ROS パラメーターには、以下のメリットがあります。
テンプレートの修正回数を削減できます。ほとんどの場合、パラメーター値を変更するだけで済みます。
変数と一対一のマッピングを持ちます。ROS コンソールで ROS パラメーターと変数のマッピングを確認できます。.tfvars ファイルを使用すると、変数値が上書きされ、コンソールに表示される値と実際の値が異なる可能性があります。
詳細については、「(オプション)パラメーター」をご参照ください。
擬似パラメーターを使用してスタック情報を取得してください。
詳細については、「(オプション)パラメーター」をご参照ください。たとえば、.tf ファイル内で ALIYUN__Region 変数を定義し、var.ALIYUN__Region を使用してご利用のスタックのリージョンを取得できます。サンプルコードを以下に示します。
variable "ALIYUN__Region" { type = string default = "cn-hongkong" }変数定義を精緻化してください。
ROS は Terraform 変数を自動的に ROS パラメーターに変換します。変数の定義を精緻化することで、変換結果の精度を確保できます。詳細については、「(オプション)パラメーター」をご参照ください。
変数に type パラメーターを指定しない場合、ROS はその変数を文字列として認識し、Terraform に文字列を渡す可能性があります。Terraform がその変数をオーケストレーションする際に、変数の型エラーが発生する可能性があります。
パラメーターに機密情報が含まれる場合は、対応する変数の sensitive を true に設定する必要があります。
variable "password" { type = string sensitive = true }
Metadata を使用してコンソールでのパラメーターおよび変数の表示を制御してください。
パラメーターのグループ化:詳細については、「Metadata」および「Metadata を使用したパラメーターのグループ化」をご参照ください。
パラメーターの非表示:Metadata.ALIYUN::ROS::Interface.Hidden を使用して、非表示にしたいパラメーターを指定できます。
ROSTemplateFormatVersion: '2015-09-01' Description: Creates a simple oss bucket Parameters: BucketName: Type: String Label: Bucket Name Description: en: Bucket name Default: bucketName1 Metadata: ALIYUN::ROS::Interface: Hidden: - BucketName Workspace: ...パラメーターの制約の照会:.metadata ファイル内の ALIYUN::ROS::Interface の ResourcesForParameterConstraints を使用して、パラメーターの制約を構成できます。詳細については、「Terraform テンプレートのパラメーター制約照会を手動で構成する」をご参照ください。
コンソールでのパラメーターおよび変数の入力モードを制御してください。
ROS パラメーター:AssociationProperty および AssociationPropertyMetadata を使用して、値の妥当性を自動的にチェックし、ROS パラメーターの有効な値を指定できます。詳細については、「AssociationProperty および AssociationPropertyMetadata」および「Resource Orchestration Service コンソールでのパラメーター設定の動的選択」をご参照ください。
Terraform 変数:description パラメーターを使用して、Terraform 変数の AssociationProperty および AssociationPropertyMetadata を制御できます。詳細については、「(オプション)パラメーター」をご参照ください。サンプルコードを以下に示します。
variable "vpc_id" { type = string description = <<EOT { "AssociationProperty": "ALIYUN::ECS::VPC::VPCId", "Description": { "en": "Please search the ID starts with (vpc-xxx)from console-Virtual Private Cloud", }, "Label": { "en": "Existing VPC ID", } } EOT }