IBM Cloud Docs
Terraform テンプレートの作成

Terraform テンプレートの作成

構成が明確で、再使用可能かつ包括的な Terraform テンプレートを作成する方法について説明します。

1 つの Terraform テンプレートは、IBM Cloud® リソースで実現したい状態を宣言した 1 つ以上の Terraform 構成ファイルで構成されます。 リソースを正常に操作するには、 IBM をクラウドプロバイダーとして構成 し、 リソースをTerraform構成ファイルに追加 する必要があります。 オプションで、入力変数を使用してリソースをカスタマイズできます。

Terraform 構成ファイルは、HashiCorp Configuration Language (HCL) または JSON 形式を使用して作成できます。

Terraform テンプレートの作成を開始する前に、IBM Cloud Schematics の制約事項を確認してください。

provider ブロックの構成

使用するクラウド・プロバイダーを Terraform 構成ファイルの provider ブロックに指定します。 provider ブロックには、Terraform 用の IBM Cloud® Provider プラグインでリソースをプロビジョンするために必要なすべての入力変数が含まれます。

IBM Cloud の API キー

IBM Cloud API キーは、 IBM Cloud プラットフォームでの認証に不可欠です。 また、 Schematics がリソースの API を操作するため、および付与された許可を判別するために必要とする IAM トークンおよび IAM リフレッシュ・トークン。 ネイティブの Terraform を使用する場合は、必ず IBM Cloud API キーを指定する必要があります。 Schematics では、すべての IAM 対応のリソース (IBM Cloud Kubernetes Service クラスターなど) および VPC インフラストラクチャー・リソースのために、IAM トークンが取得されます。 しかし、古典的なインフラストラクチャリソースではIAMトークンは取得されず、APIキーは provider ブロックで提供されなければならない。

provider ブロック内の異なる IBM Cloud APIキー

IBM Cloud アカウントに関連付けられたものとは異なる API キーを使用する場合は、その API キーを provider ブロックに指定できます。 API キーが provider ブロックで構成された場合、そのキーは、IBM Cloud に保管されている API キーよりも優先されます。

IBM Cloud サービスIDのAPIキー

すべての IAM 対応サービス (VPC インフラストラクチャー・リソースを含む) のサービス ID に対して API キーを提供できます。 古典的なインフラストラクチャリソースにサービスIDを使用することはできません。

指示に従って、 provider ブロックを構成します。

  1. provider ブロックを構成する方法を選択します。

    • オプション1 provider.tf ファイルを別に作成する。 このファイル内の情報は、Terraform と IBM Cloud Schematics によってロードされ、同じ GitHub ディレクトリーに存在するすべての Terraform 構成ファイルまたはテープ・アーカイブ・ファイル (.tar) に適用されます。 この方法は、インフラストラクチャー・コードを複数のファイルに分割する場合に役立ちます。
    • オプション2 Terraform設定ファイルに provider ブロックを追加する。 必要に応じて、このオプションを選択することもできます、1 つの Terraform 構成ファイルで、変数およびリソースと一緒にプロバイダーを指定します。
  2. どの リソースを操作するために provider ブロックで指定する必要がある資格情報と情報. Schematics が IBM Cloud API キーを自動的に取得するかを確認して、この情報を provider ブロックに指定する必要がないようにします。

  3. provider.tf ファイルを作成するか、以下のコードを Terraform 構成ファイルに追加します。 provider ブロックに設定可能なサポート対象パラメーターの完全なリストについては、IBM Cloud プロバイダー・リファレンスを参照してください。

    VPCインフラリソースの例

    provider "ibm" {
        generation = 1
        region = "<region_name>"
    }
    

    古典的なインフラリソースの例

    variable "iaas_classic_username" {
        type = "string"
    }
    variable "iaas_classic_api_key" {
        type = "string"
    }
    
    provider "ibm" {
        region = "<region_name>"
        iaas_classic_username = var.iaas_classic_username
        iaas_classic_api_key  = var.iaas_classic_api_key
    }
    
    

    すべての IBM Cloud Kubernetes Service リソースの例

    provider "ibm" {
    }
    

    その他のリソースの例

    provider "ibm" {
        region = "<region_name>"
    }
    

resource ブロックにクラウドリソースを追加する

IBM Cloud Schematics で管理したいクラウドリソースを定義するには、 resource ブロックを使用します。

マルチクラウド方式をサポートするために、Terraform は複数のクラウド・プロバイダーに対応しています。 クラウドでプロビジョンできるリソース、リソースの API、リソースをクラウドで公開するための手法は、クラウド・プロバイダーが理解しておくべきものです。 その知識をユーザーが利用できるように、サポートされるすべてのクラウド・プロバイダーは、Terraform 用のコマンド・ライン・プラグインを提供して、ユーザーがリソースを操作できるようにする必要があります。 IBM Cloud でプロビジョンできるリソースの概要については、IBM Cloud Provider Plug-in for Terraform リファレンスを参照してください。

VPCをプロビジョニングするインフラストラクチャ・コードの例

resource ibm_is_vpc "vpc" {
    name = "myvpc"
}

他のリソース・ブロックのリソースの参照

Terraform 構成ファイルの他のリソース・ブロックにある既存のリソースを参照する方法について説明します。

IBM Cloud Provider プラグインの解説書には、データ・ソースとリソースという 2 つのタイプのオブジェクトが記載されています。 両方のオブジェクトを使用して、他のリソース・ブロックにあるリソースを参照できます。

  • リソース: リソースを作成するには、IBM Cloud Provider プラグインの解説書のリソース定義を使用します。 リソース定義には、クラウドリソースを構成するための構文と、他のリソースブロックの入力パラメータとして参照できるプロパティを示す Attributes参照が含まれます。 例えば、VPC を作成する場合は、作成後に VPC の ID が使用可能になります。 VPC のサブネットを作成するときには、その ID を入力パラメーターとして使用できます。 複数のリソースを 1 つの Terraform 構成ファイルにまとめる場合は、このオプションを使用します。

    インフラストラクチャー・コードの例

    resource ibm_is_vpc "vpc" {
        name = "myvpc"
    }
    
    resource ibm_is_security_group "sg1" {
        name = "mysecuritygroup"
    vpc  = ibm_is_vpc.vpc.id
    }
    
  • データ・ソース :データ・ソース: IBM Cloud Provider プラグイン・リファレンスのデータ・ソースを使用して、既存のクラウド・リソースの情報を取得することもできます。 IBM Cloud Provider プラグインの解説書の『Argument reference』セクションを参照して、既存のリソースを取得するために指定する必要がある入力パラメーターを確認してください。 次に、『Attributes reference』のセクションを参照して、resource ブロックで参照できるパラメーターの概要を確認してください。 別の Terraform 構成ファイルに構成されているリソースの詳細を取得する場合は、このオプションを使用します。

    インフラストラクチャー・コードの例

    data ibm_is_image "ubuntu" {
        name = "ubuntu-18.04-amd64"
    }
    
    resource ibm_is_instance "vsi1" {
        name    = "$mysi"
    vpc     = ibm_is_vpc.vpc.id
    zone    = "us-south1"
    keys    = [data.ibm_is_ssh_key.ssh_key_id.id]
    image   = data.ibm_is_image.ubuntu.id
    profile = "cc1-2x4"
    
    primary_network_interface {
        subnet          = ibm_is_subnet.subnet1.id
        security_groups = [ibm_is_security_group.sg1.id]
    }
    }
    

他のアカウントのリソースの管理

IBM Cloud ソース・アカウントのワークスペースを使用して、Terraform ジョブを実行し、ターゲット・アカウントにリソースを作成することができます。 ターゲット・アカウントでリソースをプロビジョンするには、ターゲット・アカウントの ID とアクセス許可を指定する必要があります。 これは、ターゲット・アカウントの権限を持つユーザーの ID を使用することによって行うことができます。 または、API キーを使用してターゲット・アカウントの認証および適切なクロスアカウント許可を持つサービス ID。

API キーを渡さずに UI を使用してジョブを実行すると、ログイン・ユーザーの ID が操作の実行に想定されます。

variable ブロックを使用したリソースのカスタマイズ

variable ブロックを使用して、インフラストラクチャー・コードのテンプレートを作成できます。 例えば、複数のデータ・センターにデプロイするリソースに対して複数の Terraform 構成ファイルを作成する代わりに、 データ・センターを定義するために、入力変数を使用して同じ構成を再利用するだけです。

変数の格納

プロビジョンするリソースを指定した Terraform 構成ファイル自体に変数を宣言するか、すべての変数宣言を指定した variables.tf ファイルを別個に作成するかを決めることできます。 ワークスペースを作成すると、IBM Cloud Schematics がすべての Terraform 構成ファイルを自動的に解析して変数宣言を検出します。

変数宣言

入力変数を宣言するときは、Terraform のバージョンに従って変数の名前とデータ型を指定する必要があります。 オプションで、変数のデフォルト値を指定できます。 入力変数が Schematics にインポートされ、デフォルト値が指定されている場合、デフォルト値を上書 きすることができます。 \n IBM Cloud Schematics は、プリミティブ型の場合、 boolnumberstring、複雑な変数の場合、 HCL フォーマットのような文字列として値を受け入れます。

  • Terraform v1.5文字列、リスト、マップ、 bool、数値、およびリスト(型)、マップ(型)、オブジェクト({attribute name=type,.})、セット(型)、タプル([タイプ])などの複合データ型 をサポートしている。

入力変数の制限

はい。 Terraform 構成ファイルに入力変数を定義する場合、それらの変数に対して入力できる文字は最大 2049 文字であることに注意してください。 この制限を超える値が入力変数で必要な場合、その値の 2049 文字目より後は切り捨てられます。

デフォルト値のない変数宣言の例

variable "datacenter" {
    type        = "string"
    description = "The data center that you want to deploy your Kubernetes cluster in."
}

デフォルト値を持つ変数宣言の例

variable "datacenter" {
    type        = "string"
    description = "The data center that you want to deploy your Kubernetes cluster in."
    default = "dal10"
}

変数の参照

"${var.<variable_name>}" 構文を使用すると、Terraform 構成ファイルの他のブロックにある変数の値を参照できます。

datacenter 変数の参照例

resource ibm_container_cluster "test_cluster" {
    name         = "test"
    datacenter   = var.datacenter
}

宣言された変数の値を IBM Cloud Schematics に提供する

テンプレートで宣言されている変数に対して、Terraform アクションで使用する IBM Cloud Schematics のワークスペースを作成した後で値を指定できます。

  • UI の場合は、 IBM Cloud > Schematics > workspace > Settings ページで値を指定できます。 value フィールドは、HCL ファイルにあるように .tfvars 形式の値です。

  • CLIComplexデータ型の 値の作成や更新を見ることができる。 そして、 value フィールドには、例に示すように、変数ストアのエスケープ文字列を入れなければならない。

  • API については、フィールド template_data > variablestore値の作成または更新を 見ることができる。 value フィールドは、 .tfvars ファイルで提供されている HCL フォーマットの値です。 どのタイプの変数でも、常に JSON ストリングです。

    "variablestore": [
                {
                    "value": "[\n    {\n      internal = 800\n      external = 83009\n      protocol = \"tcp\"\n    }\n  ]",
                    "description": "",
                    "name": "docker_ports",
                    "type": "list(object({\n    internal = number\n    external = number\n    protocol = string\n  }))"
                },
                {
                    "name": "worker_pool_labels",
                    "type": "map(string)",
                    "value": "{\n        \"label-name1\": \"label-value1\",\n        \"label-name2\": \"label-value2\"\n}"
                },
                {
                    "name": "docker_ports",
                    "type": "list(object({\n    internal = number\n    external = number\n    protocol = string\n  }))",
                    "value": "[\n    {\n      internal = 800\n      external = 83009\n      protocol = \"tcp\"\n    }\n  ]",
                    "description": ""
                }
        ]
    

ファイルで複合変数を宣言する方法を確認することができますか?

はい。変数に値を宣言して割り当てると、UI にツールチップが表示されます。 次の表に、変数ストアで宣言できる複合データ型の例をいくつか示します。

例を示す複合変数型
タイプ
number 4.56
string example value
bool false
map(string) {key1 = "value1", key2 = "value2"}
set(string) ["こんにちは"、"彼"]
map(number) {internal = 8080, external = 2020}
list(string) ["us-south"、"eu-gb"]
list [「値」、30]
list(list(string)) ストリングのリストの例 を参照してください。
list(object({internal = number external = number protocol = string})) オブジェクトのリストの例 を参照してください。

ストリングのリストの例

[
        "test", "env:prod", "env:agent:test"
]

オブジェクトのリストの例

[
    {
        internal = 8300
        external = 8300
        protocol = "tcp"
    },
    {
        internal = 8301
        external = 8301
        protocol = "ldp"
    }
]

Terraform テンプレートの保管

Terraform 構成ファイルに含まれているインフラストラクチャー・コードは、通常のコードとして扱う必要があります。 コラボレーション、ソース、バージョン管理をサポートするには、ファイルを GitHub または GitLab リポジトリに保存します。 バージョン管理を使用すると、前のバージョンに戻したり、変更を監査したり、複数のチームとコードを共有したりできます。 GitHub, にファイルを保存したくない場合は、代わりにローカルマシンから テープアーカイブファイルまたは .tar をアップロードしてテンプレートを提供してください。 クローンを作成する場合は、クローンの作成が 許可されるファイル拡張子と禁止されるファイル拡張 子を参照してください。

GitHub リポジトリー内の Terraform テンプレートのディレクトリー構造を、最新の更新時刻とともに次の表にリストします。

Terraform テンプレートのディレクトリー構造
ファイル 説明
README.md README.md を作成
main.tf main.tf の作成
output.tf output.tf の作成
provider.tf provider.tf の作成
variables.tf variables.tf の作成

Terraformソリューションのサンプル

さまざまなソリューションは、IBM Cloud® Schematics サービスと IBM Cloud® サービスを組み合わせて使用した場合の強みを示しています。 これらのソリューションでは、簡単な Terraform テンプレートまたはモジュールを使用してインフラストラクチャーをセットアップします。 各ソリューションは特定のユース・ケースの視点で紹介されていますが、これらのインフラストラクチャーはさまざまな業種にわたって典型的です。

IBM Cloud Schematics を通じて公開されている Terraform ソリューション・テンプレート を使用して、インフラストラクチャーを作成し、リソースを管理し、強力なツールを使用してワークスペースとアクションを保護、管理、およびモニターします。