ノート:

Terraformテスト・フレームワークとOracle Cloud Infrastructure DevOpsを使用したTerraform検証パイプラインの構築

イントロダクション

組織は、Terraformモジュールを頻繁に使用して複雑なリソース・プロビジョニングを管理し、開発者が必要なインフラストラクチャのデプロイに必要なパラメータを入力するための簡単なインタフェースを提供します。モジュールは、コードの再利用を容易にし、3層のWebアプリケーション、クラウド・ネットワーキング環境、データ分析パイプラインなど、一般的なワークロードのデプロイメントを標準化する手段を組織に提供します。Terraformモジュールを開発する場合、作成者は通常、手動テストから開始します。これには、terraform validate for Syntax Validation、terraform plan to preview the execution plan、terraform applyなどのコマンドを使用し、その後、Oracle Cloud Infrastructure (OCI)コンソールでリソース構成を手動で検査します。ただし、手動テストは、スケーラブルではなく人的エラーが発生しやすく、意図しない問題を引き起こす可能性があります。モジュールは組織内の複数のチームによって使用されるため、リリース前に変更を徹底的にテストすることが重要です。

Terraformテストは、モジュール作成者がTerraformモジュールのユニット・テストおよび統合テストを実行できるように設計された新しいテスト・フレームワークです。これにより、モジュールで定義されているインフラストラクチャの作成、インフラストラクチャの検証チェックの実行、テストに合格したかどうかに関係なくテスト・リソースの破棄が可能になります。また、Terraformテストでは、リソースを破棄できない場合に警告が表示されます。Terraformモジュールと同じHashiCorp構成言語(HCL)構文を使用すると、作成者が他のツールやプログラミング言語を学ぶ必要が最小限に抑えられます。

各Terraformテストはテスト・ファイル内にあります。Terraformは、ファイル拡張子(.tftest.hclまたは.tftest.json)に基づいてテスト・ファイルを検出します。すべてのテスト・ファイルは、次のようにルートレベルの属性とブロックで構成されます。

Terraformは、runブロックを順番に実行し、構成ディレクトリで実行されている一連のTerraformコマンドを模倣します。Terraformでは、テスト・プロセスの開始時にこれらのブロック内のすべての値が評価されるため、variablesブロックとproviderブロックの配置順序は関係ありません。わかりやすくするために、variablesおよびproviderブロックをテスト・ファイルの先頭に置くことをお薦めします。

目的

前提条件

タスク1: リソース作成を検証するためのTerraformテストの記述

  1. Terraformテスト・ファイルの基本的な構造について説明しました。次のTerraform構成の機能を確認するための基本的なテストを記述します。次のTerraform構成では、標準層のOCIオブジェクト・ストレージ・バケットが作成されます。

    #main.tf
    
    resource "oci_objectstorage_bucket" "test_bucket" {
    
        compartment_id = var.compartment_id
        name = var.bucket_name
        namespace = var.bucket_namespace
        storage_tier = var.bucket_storage_tier
        versioning = var.bucket_versioning
    }
    
  2. 必要な変数を使用してvar.tfファイルを作成します。

    variable compartment_id { default = "<compartment-ocid>" }
    variable region { default = "<region>" }
    variable bucket_name { default = "<bucket-name>"}
    variable bucket_namespace { default = "<object-storage-namespace>"}
    variable bucket_access_type { default = "ObjectRead"}
    variable bucket_storage_tier { default = "Standard"}
    variable bucket_versioning {default = "Enabled"}
    
  3. リソース・プリンシパル認可を使用してOCI Terraformプロバイダを構成すると、プロバイダは、プロバイダ定義内で資格証明を指定しなくてもAPIコールを実行できます。OCIプロバイダのリソース・プリンシパル認可を設定するには、リソース・プリンシパル認可を参照してください。

  4. testsディレクトリにTerraformテスト・ファイルを作成します。次に、ディレクトリ構造の例を示します。

    ├── main.tf 
    └── tests 
    └── test.tftest.hcl
    
  5. 作成されたバケットの層が標準かどうかをチェックするtest.tftest.hclファイルを更新します。

    # test.tftest.hcl
    
    run "valid_bucket_tier" {
    
      command = plan
    
      assert {
        condition     = oci_objectstorage_bucket.test_bucket.storage_tier == "Standard"
        error_message = "bucket tier is not standard"
      }
    
    }
    

    ノート:バケットのストレージ層が標準でない場合、テストは失敗します。

  6. 前述のterraformファイルをOCIコード・リポジトリにプッシュします。このコード・リポジトリをCI/CDパイプラインで使用します。

タスク2: Terraform構成を検証するためのOCI DevOpsビルド・パイプラインの構築

build_spec.yamlファイルで、terraform initおよびterraform validateコマンドを使用して、Terraformを初期化し、構成が有効であることを確認します。次に、terraform testコマンドによって、構成されたテストが実行されます。いずれかのテラフォーム・テストが失敗した場合、パイプラインも失敗します。

version: 0.1
component: build
timeoutInSeconds: 10000
shell: bash      
failImmediatelyOnError: true

steps:
  - type: Command
    name: "Initialize Terraform"
    command: |
      terraform init
      terraform validate
  - type: Command
    name: "Test Terraform"
    command: |
      terraform test 

次のステップ

Terraform構成で簡単なアサーション・テストを実行しました。統合テスト、ユニット・テスト、エンドツーエンド・テストなど、様々なタイプのテストを実行できます。詳細は、Terraformテストを参照してください。

このTerraform検証パイプラインは、アプリケーションCI/CDパイプラインと統合できます。Terraform検証パイプラインは、前のステージからアーティファクトをプルし、変更を実装する前に構成をテストします。

承認

その他の学習リソース

docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。