クラウドの中のIaC。開発者のためのTerraform入門 (2021/02/26)

クラウドの中のIaC。開発者のためのTerraform入門 (2021/02/26)

https://blogs.oracle.com/developers/iac-in-the-cloud:-introduction-to-terraform-for-developers
投稿者:Todd Sharp

ここ数回のブログ記事では、開発者の友人たちにTerraformの "成層圏 "を紹介し、
Terraformとは何か、どのように機能するのかを基本的に理解してもらいたいと思います。
ここでの私の目標は、深く掘り下げることではありませんが、それにはいくつかの理由があります。
第一に、最も重要なことは、HashicorpがTerraformのドキュメントを作成してくれたことです。
第二に、多くの開発者は必ずしもTerraformをエンドツーエンドで深く理解する必要はないと私は考えています。
もちろん、DevOpsエンジニアはTerraformに精通していたいと思うでしょう。
しかし、開発者は、まれにツールを使う必要が生じたときに安心して使えるだけの知識を必要とすることが多いのです。
ここでは、Terraformの "15km "の範囲内で、より詳細な情報を意図的に省いた上で、ドキュメントにリンクして、さらなる研究の参考にしていただくことを目標としています。

このシリーズのロードマップは以下の通りです。

  • Terraform 入門&基礎(この記事です)
  • Terraformのインストールと最初のスクリプトの実行
  • Oracle Cloud上でのTerraformの使用開始とResource Manager
  • Resource Managerを使用したOracle Cloud上での高度なTerraform
  • TerraformとResource ManagerのCI/CDパイプラインへの統合

イントロ


Terraform の目的は、インフラストラクチャ・オブジェクトを表すリソースを定義することです。
他の言語は、リソースの定義を容易にするために存在します。
旅の最初にこの概念を理解することで、Terraform の多くのことを理解しやすくなり、全体の概念を単純化することができます(少なくとも私には)。

基本構造と構文


Terraformの基本構造は以下のように表現できます。

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}

ブロックは、コンテンツ、例えばリソースのためのコンテナです。
ブロックは、ブロックタイプ、ゼロ個以上のラベル、そして引数と他のブロックを含むボディを持ちます。引数は、名前に値を代入します。
Terraformはリソース間の関係を考慮して操作の順序を決定するため、ブロックの順序は重要ではありません。
言い換えれば、コンピュート・インスタンス・リソースを作成する前に仮想クラウド・ネットワークのIDが必要な場合、
Terraformはこれを理解し、仮想クラウド・ネットワークを最初に作成します。賢いですね。

詳細はこちら。 [Overview, Configuration Syntax]

ファイル


Terraformファイルは(ほとんどの場合).tfという拡張子を使用します。
他のオプション(JSONなど)もありますが、あまり見かけることはないでしょう。
利便性と読みやすさのために、設定ファイルはいくつかの目的別ファイルに分割されています。
これらのファイルが同じディレクトリにある場合、Terraformはそれらを一つの大きなファイルのように管理します。

詳細はこちら。 [File Extensions]

リソース


Terraformの最も重要な部分であるリソースは、インフラストラクチャ・オブジェクトを記述します。
コンピュートインスタンス、仮想ネットワーク、オブジェクトストレージバケットなど、すべてです。
これらは、指定されたタイプのアイテムを定義し、ローカル名を与えます。

resource "oci_core_instance” “compute_instance” {
availability_domain = var.instance_availability_domain
compartment_id = var.compartment_id
shape = var.instance_shape
}

上の例では、コンピュートインスタンス(oci_core_instance)を定義し、my_instanceというローカル名を与えています。
これには3つの必須引数、availability_domain, compartment_id, shapeが含まれています。
リソースについては今後の記事で詳しく説明しますが、今のところは構文に慣れておいてください。
他の操作でも似たような感じで、ブロックタイプが先に来て、ブロックが開かれる前にラベルがそれに続きます。
名前は文字かアンダースコアで始めなければならず、文字、数字、アンダースコア、ダッシュのみを含むことができます。
これらは引用符で囲む必要はありませんが、引用符で囲んだ方が読みやすいという人もいます (IDE は引用符で囲んだ方が見栄えが良くなるかもしれません)。

Terraformは、コンフィギュレーションの状態を保存し、その後のコンフィギュレーションの実行をインテリジェントに管理します。
Terraformは、設定を再実行した際に、存在しないオブジェクトを作成したり、既に存在するオブジェクトを更新したり、
状態は保存されているが設定には存在しないオブジェクトを破棄したりと、オブジェクトの管理をスマートに行っています。

多くのリソースは、属性やリソース操作の結果として返されるデータをエクスポートします。
例えば、新しいインスタンスを作成すると、作成されたインスタンスIDを含む属性のセットが返されますが、
これは他のリソースで使用したり、スクリプトの最後に出力したりすることができます。
属性は、期待通りにドット表記(リスト要素の場合は括弧付き)でアクセスされます。
上のコードスニペットで作成したインスタンスの ID を取得するには、 oci_core_instance.new_instance.id を使用します。

メタ引数


Terraform にはいくつかのメタ引数があります。
これらは通常、リソース作成の動作を何らかの形で変更する引数です。
例えば、リソースブロックを追加することなく複数のインフラストラクチャオブジェクトを作成するために、
リソースブロック内にcount引数を追加することができます(この引数を使用して、
必要に応じてcountを0に設定するブーリアンローカル変数に基づいて条件付きでリソースを作成することもできますが、それについては別の記事で取り上げます)。

詳細はこちら。[Resources, Behavior, Count]

データソース


データソースは、その名の通り、スクリプトの他の場所で使用するためのデータを取得します。
例えば、コンピュートイメージのリストを取得して、それをフィルタリングして、特定のイメージのIDを名前で検索して、
インスタンスを作成するときにそれを使用する必要があるかもしれません。
そのためには、データソースを使用します。データソースはリソースに似ています。

data "oci_core_images” "images" {
compartment_id = var.compartment_id
}

データソースはどこから来るのか?プロバイダ - 次はプロバイダについて説明します。

詳細はこちら。[Data Sources]

プロバイダー


プロバイダは、単一のプラットフォームやクラウド・プロバイダから提供されるリソース・タイプとデータ・ソースの集合体です。
Terraformは、プロジェクトの初期化時に自動的にプロバイダをインストールします(その方法については後述)。
必要に応じて、1つのプロジェクトに複数のプロバイダを設定することもできます。

プロバイダは以下のようになります。

provider "oci" {
tenancy_ocid = ""
user_ocid = ""
private_key_path = ""
private_key_password = ""
fingerprint = ""
region = ""
}

詳細はこちら。 [Providers, Multiple Providers, Provider Registry]

変数と出力


入力変数

Terraformは宣言された入力変数をサポートしています。
Terraform CLI経由で渡すか、特定の命名規則(TF_VAR_で始まる)に従った環境変数を設定することで、値を設定することができます。
変数は検証することができます(バージョン0.13.0現在)。後ほど、Oracle Cloudで入力変数がどのように管理されているかを見てみましょう。

ここでは簡単な変数の宣言を紹介します。

variable “image_name" {
type = string
}

また、デフォルトを設定することもできます。

variable “image_name" {
type = string
default = “my-image"
}

変数は、var キーワード: var.image_name を使用して他のブロックからアクセスされます。

出力値

出力値を指定すると、プロジェクトからリソースの作成結果(または必要な情報)を出力することができます。
例えば、作成されたコンピュートインスタンスのパブリックIPを出力したいとします。

output "public_ip" {
description = "Public IPs of compute instance. "
value = oci_core_instance.compute_instance.public_ip
}

詳細はこちらをご覧ください。[Variables, Variable Type Constraints, Variable Validation, Output Values, Sensitive Values]

式と関数


式は、設定内の値を参照したり計算したりするために使用されます。
これらは、単純なリテラルからデータ・ソースからエクスポートされた要素(上で見たように)まで多岐にわたります。
基本的な算術、条件付き評価、組み込み関数も式で使用できます。

式と関数は、Terraformの基本的な概念であり、ツールや言語の日常的な使用に影響を与えるものなので、近道をしたくないセクションの一つです。
これらのトピックに関するドキュメントを読むことを強くお勧めします。

詳細はこちら。[Expressions, Functions]

プロジェクトの構造


Terraformは非常に柔軟で、プロジェクトをどのように構成するかはあなた次第です。
開発に関連するすべてのことと同様に、チームでいくつかの標準を開発し、それに従うことをお勧めします。
私はプロジェクトの中で目的別にファイルを分けておくのが好きです。

  • 変数宣言の場合は variables.tf または vars.tf
  • 出力ブロック用の output.tf
  • プロバイダの定義については provider.tf
  • インフラストラクチャのカテゴリごとに分かれた個別のファイル。
    例:コンピュートインスタンス用のcore.tf、FaaS用のfunctions.tfなど。
    インフラストラクチャファイルには、フォーカスするカテゴリに関連するリソースとデータブロックを含めることができます。

あなたやあなたのチームは、どのような構造や規約が最適かを見つけることができるでしょう。
このチュートリアルで基本的な知識が得られたことを願っていますが、このシリーズの今後の記事で、
より多くのことを学ぶために必要な基礎知識が得られたのではないでしょうか。
次回までお楽しみに

詳細はこちら。 [Style Conventions]

まとめ


今回の記事では、開発者向けのTerraformの基本を見てみました。
次の記事では、Terraformをインストールし、最初のスクリプトを作成して実行します。
Photo by Neda Astani on Unsplash

コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

新しいOracle Container Engine for Kubernetesの機能強化により、大規模なKubernetesがさらに簡単になりました (2023/03/20)