Terraform: OCI Terraformの設定

このチュートリアルでは、Terraformレジストリに記載されているOracle Cloud InfrastructureのTerraformプロバイダ・スクリプトを設定して、OCIアカウントに接続します。設定を確認するには、テナンシから情報をフェッチします。

主なタスクは:

  • RSAキーを作成します。
  • Oracle Cloud Infrastructure Terraformプロバイダ・スクリプトを設定します:
    • Terraformスクリプトを認証します。
    • テナンシ内の可用性ドメインに関する情報を取得します。
ローカル環境からOracle Cloud Infrastructureテナンシに接続されているユーザーのダイアグラム。ローカル環境はLinuxで、Terraformがインストールされています。クラウドのTerraformレジストリに接続されているローカル環境のTerraformから矢印が出ています。「Authenticate?」というラベルの付いた、ユーザーのOracle Cloud Infrastructureテナンシにメッセージを送信するローカル環境からの別の矢印があります。3つ目の矢印は、テナンシから「データのフェッチ」というラベルの付いたローカル環境に向かっています。これらの矢印は、ユーザーがテナンシによって認証されるようにTerraformスクリプトを設定したことを示しています。ユーザーは、TerraformおよびTerraformレジストリを使用して、テナンシから情報をフェッチできます。テナンシには、3つの可用性ドメインが表示されます。これは、ユーザーがフェッチしている情報です。

その他の情報については、次のWebサイトを参照してください。

開始する前に

このチュートリアルを正常に実行するには、次が必要です:

MacOSまたはLinux
Windows 10
ノート

このチュートリアルでは、AMDシェイプを使用したOracle Linux VM環境を例として使用しますが、この項で説明する任意の環境を使用できます。

1. 準備

Terraformスクリプトを認証および実行するために環境を準備します。また、アカウントがスクリプトの認証に必要な情報を収集します。

Terraformのインストール

このチュートリアルでは、OCI Resource Managerでサポートされている最新バージョンのTerraformをインストールすることをお薦めします。Resource Managerは、OCIリソースのTerraformテンプレートを作成するためのサービスです。後でTerraformスクリプトでResource Managerを使用する場合、使用しているTerraformのバージョンがサポートされます。

  1. 使用している環境で、Terraformのバージョンを確認します。
    terraform -v
    最新のサポートされているTerraformバージョンがない場合は、次のステップを使用して、サポートされている最新バージョンをインストールします。
  2. ブラウザから、Terraformリリースに移動します。
  3. サポートされている最新バージョンのフォルダをクリックします。

    例: terraform_1.2.9

  4. 環境と一致するzipファイルの名前をメモ帳にコピーします。

    terraform_<version>_<your_environment>.zip

    Oracle 64ビットLinux AMD環境の例: terraform_1.2.9_linux_amd64.zip

  5. ご使用の環境で、一時ディレクトリを作成し、そのディレクトリに移動します:
    mkdir temp
    cd temp
  6. Terraform zipファイルのダウンロード:
    wget https://releases.hashicorp.com/terraform/<version>/terraform_<version>_<your_environment>.zip
    ヒント

    • ブラウザからアドレスをコピーしてURLを作成できます。<version>にはterraformという語は含まれません。

    例:

    wget https://releases.hashicorp.com/terraform/1.2.9/terraform_1.2.9_linux_amd64.zip
  7. ファイルを解凍します。例:
    unzip terraform_1.2.9_linux_amd64.zip
  8. 解凍したフォルダを、インストールするサード・パーティ・アプリケーションのバイナリを含むフォルダに移動します。たとえば、Oracle Linuxの場合、サポートされていないフォルダを/usr/local/binに移動します。
    sudo mv terraform /usr/local/bin
  9. ホーム・ディレクトリに戻ります:
    cd
  10. Terraformのバージョンを確認します:
    terraform -v

    例: Terraform v1.2.9 on linux_amd64

これで、Terraformが正常にインストールされました。
RSAキーの作成

Terraformのリソース検出の設定チュートリアル用のRSAキーを作成した場合は、このステップをスキップします。

Oracle Cloud InfrastructureアカウントへのAPIサインイン用のRSAキーを作成します。

ノート

クラウド・シェルを使用している場合は、RSAキーの作成をスキップします。OCIコンソールにログインすると、すでに認証されています。
  1. ターミナル・ウィンドウを開きます。
  2. ホーム・ディレクトリで、.ociディレクトリを作成します。
    mkdir <your-home-directory>/.oci

    Oracle Linuxの例:

    mkdir /home/opc/.oci
    ノート

    Windows Subsystem for Linux (WSL)を使用している場合は、Linux環境で直接/.ociディレクトリを作成します。/mntフォルダ(Windowsファイル・システム)に/.ociディレクトリを作成する場合は、chmodコマンドを使用してWSL構成ファイルの権限を変更する必要があります。
  3. 2048ビットの秘密キーをPEMフォーマットで生成します:
    openssl genrsa -out <your-home-directory>/.oci/<your-rsa-key-name>.pem 2048
  4. 自分だけが秘密キー・ファイルを読書きできるように、権限を変更します:
    chmod 600 <your-home-directory>/.oci/<your-rsa-key-name>.pem
  5. 公開キーを生成します:
    openssl rsa -pubout -in <your-home-directory>/.oci/<your-rsa-key-name>.pem -out $HOME/.oci/<your-rsa-key-name>_public.pem
  6. 公開キーをコピーします。
    ターミナルで、次を入力します:
    cat <your-home-directory>/.oci/<your-rsa-key-name>_public.pem
  7. ユーザー・アカウントに公開キーを追加します。
    • OCIコンソールの上部のナビゲーション・バーで、「プロファイル」メニューをクリックし、「ユーザー設定」に移動します。
    • 「APIキー」をクリックします。
    • 「APIキーの追加」をクリックします。
    • 「公開キーの貼付け」を選択します。
    • BEGIN PUBLIC KEYおよびEND PUBLIC KEYの行を含む、前のステップの値を貼り付けます
    • 「追加」をクリックします。

これで、OCIアカウントに接続するためのRSAキーが設定されました。

リファレンス

RSAキーの生成

リスト・ポリシーの追加

ユーザー名が管理者グループ内にある場合は、この項をスキップしてください。それ以外の場合は、管理者に依頼して、テナンシに次のポリシーを追加してください:

allow group <the-group-your-username-belongs> to read all-resources in tenancy

この権限を持つユーザーは、テナンシ内のすべてのリソースをリストできます。

ポリシーを追加するステップ
  1. 上部のナビゲーション・バーで、「プロファイル」メニューを開きます。
  2. ユーザー名をクリックします。
  3. 左ペインで、「グループ」をクリックします。
  4. メモ帳で、ユーザー名が属するグループ名をコピーします。
  5. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
  6. 「コンパートメント」ドロップダウンから<your-tenancy>(root)を選択します。
  7. 「ポリシーの作成」をクリックします。
  8. 次の情報を入力します:
    • 名前: list-resources
    • 説明: グループ<the-group-your-username-belongs>に、このテナンシ内のリソースのリストを許可します。
    • コンパートメント: <your-tenancy>(ルート)
  9. 「ポリシー・ビルダー」で、「手動エディタの表示」をクリックします。
  10. 次のポリシーを貼り付けます:
    allow group <the-group-your-username-belongs> to read all-resources in tenancy
  11. 「作成」をクリックします。

参照: 共通ポリシー

必要な情報の収集

Terraformスクリプトの認証に必要な情報を準備し、メモ帳に情報をコピーします。

  1. OCIコンソールから次の資格証明情報を収集します。
    • テナントOCID: <tenancy-OCID>
      • 上部のナビゲーション・バーで、「プロファイル」メニューをクリックし、テナンシ: <your-tenancy>に移動してOCIDをコピーします。
    • ユーザーOCID: <user-OCID>
      • 「プロファイル」メニューから、「ユーザー設定」に移動してOCIDをコピーします。
    • フィンガープリント: <fingerprint>
      • 「プロファイル」メニューから、「ユーザー設定」に移動し、「APIキー」をクリックします。
      • 2項で作成したRSA公開キーに関連付けられているフィンガープリントをコピーします。フォーマットはxx:xx:xx...xxです。
    • リージョン: <region-identifier>
      • 上部のナビゲーション・バーから、リージョンを検索します。
      • リージョンおよび可用性ドメインの表から、リージョンの<region-identifier>を見つけます。例: us-ashburn-1
  2. 使用している環境から次の情報を収集します。
    • 秘密キーのパス: <rsa-private-key-path>
      • RSAキーの作成の項で作成したRSA秘密キーへのパス。

        Oracle Linuxの例: /home/opc/.oci/<your-rsa-key-name>.pem

2. スクリプトの作成

3つのスクリプトを作成します: 1つは認証用、もう1つはアカウントからのデータのフェッチ用、もう1つは出力の印刷用です。

APIキー・ベース認証の追加

まず、Terraformスクリプトのディレクトリを設定します。次に、OCIアカウントがこのディレクトリから実行されているスクリプトを認証できるように、プロバイダ・スクリプトを追加します。

  1. <your-home-directory>で、tf-providerというディレクトリを作成し、そのディレクトリに移動します。
    mkdir tf-provider
    cd tf-provider
  2. provider.tfというファイルを作成します。
  3. provider.tfに、次のコードを追加します:
    • フィールドをカッコで囲んだフィールドを、必要な情報の収集セクションの情報に置き換えます。
    • 文字列値の前後に引用符を追加します。
    provider "oci" {
      tenancy_ocid = "<tenancy-ocid>"
      user_ocid = "<user-ocid>" 
      private_key_path = "<rsa-private-key-path>"
      fingerprint = "<fingerprint>"
      region = "<region-identifier>"
    }
  4. provider.tfファイルを保存します。
説明

APIキー・ベースの認証には次の変数を使用します:

  • tenancy_ocid
  • user_ocid
  • private_key_path
  • fingerprint
  • region
OCI Terraformプロバイダの詳細は、次を参照してください
ヒント

プロバイダをインストールする必要はありません。このチュートリアルのスクリプトを実行すると、プロバイダがダウンロードされます。
データ・ソースの追加

この項では、テナンシ内の可用性ドメインのリストをフェッチします。データをフェッチすることで、OCIアカウントがprovider.tfスクリプトを認証し、アカウントから情報を取得することを確認します。

  1. tf-providerディレクトリに、availability-domains.tfというファイルを作成します。
  2. 次のコードをavailability-domains.tfに追加し、フィールドをカッコで置き換えます(「必要な情報の収集」セクションの情報)。
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/data-sources/identity_availability_domains
    
    # Tenancy is the root or parent to all compartments.
    # For this tutorial, use the value of <tenancy-ocid> for the compartment OCID.
    
    data "oci_identity_availability_domains" "ads" {
      compartment_id = "<tenancy-ocid>"
    }
    ノート

    データ・ソースは、テナンシ全体の可用性ドメインのリストを取得します。テナンシは、ルート・コンパートメントのコンパートメントOCIDです。特定の"<compartment-ocid>"または"<tenancy-ocid>"を指定すると、同じリストが出力されます
    重要

    provider.tfavailability-domains.tfが同じディレクトリにあることを確認してください。Terraformは、関係に基づいて、ディレクトリ内のすべてのファイルを正しい順序で処理します。モジュラ・アプローチおよび将来の再利用のために、プロバイダ・ファイルを他のスクリプトから分離してください。
説明

Terraformでデータをフェッチするには、データ・ソースを使用します。データ・ソースからのデータのフェッチは、REST APIのGETメソッドに似ています。

  • Oracle Cloud Infrastructureプロバイダに移動します。
  • 左側のナビゲーション・フィルタで、availability domainsと入力します。
  • 「アイデンティティ」で、「データ・ソース」に移動し、「oci_identity_availability_domains」をクリックします。
  • ページのタイトルからデータ・ソース名を検索します:
    • データ・ソース: oci_identity_availability_domains
  • 引数リファレンスの項で、(必須)というラベルの付いたすべての引数(入力)を見つけます:
    • compartment_id
  • データ・ソース・ブロックを作成します:
    • キーワードdataを使用してデータ・ソースを宣言します。
    • データ・ソース名のラベルを追加します: "oci_identity_availability_domains"
    • ローカル名に選択したラベルを追加します。
      • ラベルには、文字、数字、アンダースコア(_)およびハイフン(-)を含めることができます。最初の文字は数字にできません。
      • このチュートリアルでは、ローカル名"ads"を使用してdata "oci_identity_availability_domains" "ads"を構成します。
    • コード・ブロック内で、必要なすべての引数の値を指定します。
      • 例: compartment_id = "<some-compartment-ocid>"
    • オプションの引数には、フェッチ結果を絞り込むための値を指定します。一部のデータ・ソースにのみオプションの引数があります。
出力の追加

データ・ソースoci_identity_availability_domainsは、可用性ドメインのリストをフェッチします。この項では、フェッチされた情報を印刷する出力ブロックを宣言します。

  1. tf-providerディレクトリに、outputs.tfというファイルを作成します。
  2. outputs.tfに、次のコードを追加します。
    # Output the "list" of all availability domains.
    output "all-availability-domains-in-your-tenancy" {
      value = data.oci_identity_availability_domains.ads.availability_domains
    }
  3. outputs.tfファイルを保存します。
    重要

    outputs.tfprovider.tfおよびavailability-domains.tfが同じディレクトリにあることを確認してください。
説明
  • データ・ソース: oci_identity_availability_domainsページで、属性リファレンスに移動します。
    ノート

    属性は、oci_identity_availability_domainsデータ・ソースに対して返すことができる出力です。
  • 属性を検索します:
    • 属性: availability_domains:
      • 可用性ドメインのリスト
      • availability_domainsを出力すると、リスト内の可用性ドメインごとに、3つの属性が表示されます:
        • compartment_id
        • id
        • name
  • データ・ソース出力ブロックを作成します:
    • キーワードoutputを使用して出力ブロックを宣言します
    • 出力結果とともに印刷するラベルを追加します:
      • ラベルには、文字、数字、アンダースコア(_)およびハイフン(-)を含めることができます。最初の文字は数字にできません。
      • 例: "all-availability-domains-in-your-tenancy"
    • コード・ブロック内で、次の式を使用してデータ・ソース出力の値を入力します:
      • value = data.<data-source-name>.<local-name-for-data-source>.<attribute>
      • 例: value = data.oci_identity_availability_domains.ads.availability_domains

3. スクリプトの実行

Terraformスクリプトを実行します。アカウントがスクリプトを認証した後、Terraformはテナンシの可用性ドメインをフェッチします。

初期化

tf-providerディレクトリの作業ディレクトリを初期化します。

  1. Terraform initコマンドを実行します。
    terraform init

    出力例:

    Initializing the backend...
    
    Initializing provider plugins...
    - Finding latest version of hashicorp/oci...
    - Installing hashicorp/oci vx.x.x...
    - Installed hashicorp/oci vx.x.x (signed by HashiCorp)
    
    Terraform has been successfully initialized!
  2. tf-providerディレクトリの内容を確認します。
    ls -a

    これで、ociプロバイダのプラグインを含む.terraformというフォルダが作成されました。

    ノート

    トラブルシューティング:
    • terraform initの実行後
    • エラー・メッセージ: Failed to query available provider packages:
      • VPNを使用している場合は、プロキシ設定を確認してください。
計画

実行計画を作成して、実際のリソースに変更を加えずに、実行計画に表示される変更が期待どおりであるかどうかを確認します。

  1. Terraform planコマンドを実行します。
    terraform plan
  2. Plan: 0 to add, 0 to change, 0 to destroyが表示されることを確認します。

    出力例:

    Changes to Outputs:
      + all-availability-domains-in-your-tenancy = [
          + {
              + compartment_id = "ocid1.tenancy.oc1..xxx"
              + id             = "ocid1.availabilitydomain.xxx"
              + name           = "QnsC:US-ASHBURN-AD-1"
            },
          + {
              + compartment_id = "ocid1.tenancy.oc1..xxx"
              + id             = "ocid1.availabilitydomain.xxx"
              + name           = "QnsC:US-ASHBURN-AD-2"
            },
          + {
              + compartment_id = "ocid1.tenancy.oc1..xxx"
              + id             = "ocid1.availabilitydomain.xxx"
              + name           = "QnsC:US-ASHBURN-AD-3"
            },
        ]
    
    You can apply this plan to save these new output values to the Terraform state, without changing any real
    infrastructure.
    
    ノート

    • データをフェッチ中であるため、出力の追加のみが計画に表示されます。リソースを追加、変更または破棄していません。
    • -outオプションのかわりにoutput.tfファイルを使用しているため、次のメッセージは無視できます:
      Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform
      apply" now.
適用
  1. Terraformスクリプトを実行し、出力を取得します:
    terraform apply
  2. 確認を求められた場合は、作成するリソースにyesを入力します。

    applyコマンドを実行すると、出力がターミナルに表示されます。

    出力例:
    Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    all-availability-domains-in-your-tenancy = tolist([
      {
        "compartment_id" = "ocid1.tenancy.xxx"
        "id" = "ocid1.availabilitydomain.xxx"
        "name" = "QnsC:US-ASHBURN-AD-1"
      },
      {
        "compartment_id" = "ocid1.tenancy.xxx"
        "id" = "ocid1.availabilitydomain.xxx"
        "name" = "QnsC:US-ASHBURN-AD-2"
      },
      {
        "compartment_id" = "ocid1.tenancy.xxx"
        "id" = "ocid1.availabilitydomain.xxx"
        "name" = "QnsC:US-ASHBURN-AD-3"
      },
    ])

完了しました。これで、Oracle Cloud Infrastructureアカウントは、Oracle Cloud Infrastructure Terraformプロバイダ・スクリプトを認証できます。

参照:

トラブルシューティング

Terraformスクリプトの実行中に、次のエラー・メッセージが表示される場合があります。

401エラー- (Service error:NotAuthenticated)

次の変数のいずれかの値が間違っています:

  • テナントOCID
  • ユーザーOCID
  • 指紋
  • RSA秘密キー(パスまたはキー)
  1. provider.tfファイルで、変数名とその値をダブルチェックします。
    provider "oci" {
      tenancy_ocid = "<tenancy-ocid>"
      user_ocid = "<user-ocid>" 
      private_key_path = "<rsa-private-key-path>"
      fingerprint = "<fingerprint>"
      region = "<region-identifier>"
    }
  2. 必要に応じて変数またはその値を更新します。
  3. 文字列値の前後に引用符を追加したことを確認します。
  4. スクリプトを実行します。

クライアントを作成できません。構成が正しくありません: 秘密キーの正しい構成が見つかりませんでした

TerraformスクリプトでRSA秘密キーが見つかりません。

  1. RSAキーの作成手順を繰り返し、更新されたキーを使用します。
  2. provider.tfファイルで、RSAを記述する変数がprivate_key_pathという名前であることを確認します。
    private_key_path = "<rsa-private-key-path>"
  3. provider.tfファイル内のRSA秘密キーへのパスが正しいことを確認します。たとえば、パスがスラッシュで始まり、秘密キー<your-rsa-key-name>.pemの正しい名前であることを確認します。
  4. <rsa-private-key-path>から環境変数を削除します。

    たとえば、provider.tfファイルで、$HOME/.oci/<rsa-private-key-path>のかわりに/home/opc/<rsa-private-key-path>を使用します。

    ノート

    Windows Subsystem for Linux (WSL)を使用している場合は、Linux環境で直接/.ociディレクトリを作成します。/mntフォルダ(Windowsファイル・システム)に/.ociディレクトリを作成する場合は、chmodコマンドを使用してWSL構成ファイルの権限を変更する必要があります。

そのようなホストはありません

リージョン識別子の値が正しくありません。

  1. コンソールの上部のナビゲーション・バーで、リージョンを検索します。
  2. リージョンおよび可用性ドメインにリストされている表で、リージョンの<region-identifier>を見つけます。例: us-ashburn-1
  3. provider.tfファイルで、<region-identifier>の値を更新して再試行してください。

使用可能なプロバイダ・パッケージの問合せに失敗しました

VPNを使用している場合は、プロキシ設定を確認します。

  1. VPNから切断します。
  2. VPNを使用せずにVMまたは環境に接続し、次のTerraformスクリプトを実行します。
    terraform init
    terraform plan
    terraform apply
    エラーメッセージが表示されない場合は、VPNプロキシ設定によってエラーが発生しています。
  3. 管理者に問い合せて、プロキシ設定を更新し、再試行してください。