Terraform テンプレートの作成

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

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

Terraform 構成ファイルは、HashiCorp Configuration Language (HCL) または JSON 形式を使用して作成できます。 また、 Terraform IBM Modules(TIM) を利用することもできます。TIMは、デプロイプロセスを標準化し簡素化するのに役立つ、あらかじめ構築されたインフラストラクチャのコンポーネントを提供します。

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トークンは取得されないため、 provider ブロックにAPIキーを指定する必要があります。

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 」ブロックへのクラウドリソースの追加

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

マルチクラウド方式をサポートするために、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 プラグインの解説書のリソース定義を使用します。 リソース定義には、Cloudリソースを設定するための構文と、他のリソースブロックで入力パラメータとして参照できるプロパティを示す「 属性リファレンス 」が含まれています。 例えば、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 プロバイダ・プラグインのリファレンスに記載されているデータソースを使用して、既存のクラウドリソースに関する情報を取得することもできます。 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設定ファイルを作成する。 同じコンフィギュレーションを入力変数で再利用し、データセンターを定義するだけである。

変数の保存

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

変数の宣言

入力変数を宣言するときは、Terraform のバージョンに従って変数の名前とデータ型を指定する必要があります。 オプションで、変数のデフォルト値を指定できます。 入力変数を Schematics にインポートする際、デフォルト値が指定されている場合は、そのデフォルト値を上書きするかどうかの選択が可能です。 \n IBM Cloud Schematics では、 boolnumberstringHCL といったプリミティブ型については文字列形式の値を受け付け、複素変数については 形式の値を受け付けます。 - Terraform v1.5 は**、文字列、リスト、マップ、 bool、数値、および list(type)、map(type)、object( {attribute name=type,.} )、set(type)、tuple( [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
}

Terraform IBM モジュールを活用した迅速な開発

オプションで、 Terraform IBM Modules(TIM) を使ってテンプレートを作成することもできます。 複雑なインフラストラクチャを迅速に構築し、リソース依存関係を簡素化し、 IBM Cloud ベストプラクティスを適用し、 IBM Cloud コミュニティからの貢献を通じて進化する。

例TIMのVPCモジュールの使用

module "vpc" {
  source  = "terraform-ibm-modules/vpc/ibm"
  version = "1.1.0"
  
  vpc_name                    = "my-production-vpc"
  resource_group_id           = "Default"
  classic_access              = false
  default_address_prefix      = "auto"
  default_network_acl_name    = "my-default-acl"
  default_security_group_name = "my-default-sg"
  default_routing_table_name  = "my-default-rt"
}

利用可能なモジュールを調べる

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

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

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

  • CLI では、 Complex データ型の 値を作成、表示、または更新することができます。 その場合、 value フィールドには、例に示されているように、変数storeのエスケープされた文字列を指定する必要があります。

  • 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 ["value", 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 ソリューション・テンプレート を使用して、インフラストラクチャーを作成し、リソースを管理し、強力なツールを使用してワークスペースとアクションを保護、管理、およびモニターします。