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つの可用性ドメインが表示されています。これは、ユーザーがフェッチしている情報です。

詳細は、次を参照してください:

開始前

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

MacOSまたはLinux
ノート

このチュートリアルでは、その例として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. ブラウザから、HashiCorp Terraformバージョンのリストに移動します。
  3. サポートされているTerraformバージョンが最新であるフォルダを選択します。

    例: terraform_1.5.7

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

    terraform_<version>_<your_environment>.zip

    Oracle 64ビットLinux AMD環境の例: terraform_1.5.7_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.5.7/terraform_1.5.7_linux_amd64.zip

    接続エラーが表示され、VPNを使用している場合は、プロキシ設定を確認してください。「トラブルシューティング」を参照してください。

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

    例: Terraform v1.5.7 on linux_amd64

    Terraformのバージョンが古いことを示すメッセージは無視してください。重要なことは、最新のサポートされているTerraformバージョンを使用することです。

これで、Terraformが正常にインストールされました。
RSAキーの作成
Oracle Cloud InfrastructureアカウントへのAPIサインイン用のRSAキーを作成します。
ノート

次の場合は、RSAキーの作成をスキップします:
  • Cloud ShellまたはResource Managerを使用しています。Oracle Cloudコンソールにサインインすると、すでに認証されています。
  • チュートリアル「リソース検出の設定」のRSAキーはすでに作成されています。
  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

    例(抜粋):

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoTFqF...
    ...
    -----END PUBLIC KEY——
  7. ユーザー・アカウントに公開キーを追加します。
    1. Oracle Cloudコンソールにサインインします。
    2. ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
    3. 「APIキー」を選択します。
    4. 「APIキーの追加」を選択します。
    5. 「公開キーの貼付け」を選択します。
    6. BEGIN PUBLIC KEYおよびEND PUBLIC KEYの行を含む、前のステップの値を貼り付けます
    7. 「追加」を選択します。

      「構成ファイルのプレビュー」ダイアログ・ボックスが開きます。次に例を示します:

      [DEFAULT]
      user=ocid1.user.oc1..exampleid
      fingerprint=exampleid
      tenancy=ocid1.tenancy.oc1..exampleid
      region=us-ashburn-1
      key_file=<path to your private keyfile> # TODO
    8. 「コピー」を選択し、メモ帳に貼り付けます。

      構成ファイルのプレビューには、テナンシやユーザーOCIDs、フィンガープリント、リージョンなど、後で必要になる情報が含まれます。

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

リファレンス
API署名キーを生成する方法
リスト・ポリシーの追加

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

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

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

ポリシーを追加するステップ
  1. Oracle Cloudコンソールにサインインします。
  2. ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
  3. 表示されるオプションに応じて、「グループ」または「自分のグループ」を選択します。
  4. メモ帳で、ユーザー名が属するグループの名前をコピーします。
  5. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」を選択します。「アイデンティティ」にある「ポリシー」を選択します。
  6. コンパートメントを選択します: <your-tenancy>(root)
  7. 「ポリシーの作成」を選択します。
  8. 「ポリシーの作成」ページで、次の値を入力します:
    • 名前: list-resources
    • 説明: Allow the group <a-group-that-your-username-belongs-to> to list the resources in this tenancy.
    • コンパートメント: <your-tenancy>(ルート)
  9. 「ポリシー・ビルダー」で、「手動エディタの表示」を選択します。
  10. 次のポリシーを貼り付けます:
    allow group <a-group-that-your-username-belongs-to> to read all-resources in tenancy
  11. 「作成」を選択します。

参照: 共通ポリシー

必要な情報の収集

Terraformスクリプトの認証に必要な情報を準備し、情報をノートパッドにコピーします。

  1. 「RSAキーの作成」で追加した秘密キーへのパスを収集します。

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

  2. 「RSAキーの作成」で追加したAPIキーから、ユーザーOCID、フィンガープリント、テナンシOCIDおよびリージョンを収集します。(これはノートパッドにすでにあります。)
    1. Oracle Cloudコンソールにサインインします。
    2. ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
    3. 「APIキー」を選択します。
    4. 「RSAキーの作成」で追加したAPIキーを検索します。
    5. キーの「アクション」メニューから、「構成ファイルの表示」を選択します。

      「構成ファイルのプレビュー」ダイアログ・ボックスが開きます。次に例を示します:

      [DEFAULT]
      user=ocid1.user.oc1..exampleid
      fingerprint=xx:xx:xx...xx
      tenancy=ocid1.tenancy.oc1..exampleid
      region=us-ashburn-1
      key_file=<path to your private keyfile> # TODO
    6. 「コピー」を選択し、メモ帳に貼り付けます。

2. スクリプトの作成

認証用のスクリプトを作成し、アカウントからデータをフェッチして出力を出力します。

APIキー・ベース認証の追加
最初に、Terraformスクリプトのディレクトリを設定します。次に、OCIアカウントがこのディレクトリから実行されるスクリプトを認証できるように、プロバイダ・スクリプトを追加します。最後に、required_providersブロックを含むバージョン・スクリプトを追加して、必要なプロバイダ・バージョンを宣言します。
  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ファイルを保存します。
  5. 同じディレクトリに、versions.tfというファイルを作成します。
  6. versions.tfに、次のコードを追加します:
    terraform {
      required_providers {
        oci = {
          source  = "oracle/oci"
          version = ">=4.67.3"
        }
      }
      required_version = ">= 1.0.0"
    }
  7. versions.tfファイルを保存します。
説明

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

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

プロバイダをインストールする必要はありません。このチュートリアルのスクリプトを実行すると、プロバイダがダウンロードされます。
データ・ソースの追加
この項では、テナンシ内の可用性ドメインのリストをフェッチします。データをフェッチすることで、OCIアカウントがprovider.tfスクリプトを認証し、アカウントから情報を取得することを確認します。
  1. tf-providerディレクトリに、availability-domains.tfというファイルを作成します。
    重要

    すべての*.tfファイルが同じディレクトリにあることを確認します。Terraformは、関係に基づいて、ディレクトリ内のすべてのファイルを正しい順序で処理します。(モジュラ・アプローチおよび今後の再利用については、プロバイダ情報を他のスクリプトとは別のファイルに格納します。)
  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>"を指定すると、同じリストが出力されます。
説明

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ファイルを保存します。
    重要

    すべての*.tfファイルが同じディレクトリにあることを確認します。Terraformは、関係に基づいて、ディレクトリ内のすべてのファイルを正しい順序で処理します。
説明
  • 属性リファレンス(oci_identity_availability_domains)に移動します。
    ノート

    属性は、oci_identity_availability_domainsデータ・ソースに対して返すことができる出力です。
  • 属性を検索します:
    • 属性: availability_domains:
      • 可用性ドメインのリスト
      • availability_domains:を出力すると、リスト内の可用性ドメインごとに、3つの属性が表示されます:
        • compartment_id
        • id
        • 名前
  • データ・ソース出力ブロックを作成します:
    • キーワード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...
    
    Terraform has been successfully initialized!

    接続エラーまたは「問合せに失敗しました」というエラーが表示され、VPNにいる場合は、プロキシ設定を確認してください。「トラブルシューティング」を参照してください。

  2. tf-providerディレクトリの内容を確認します。
    ls -a

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

プラン
実行計画を作成して、実際のリソースを変更せずに、実行計画に表示される変更が期待どおりであるかどうかを確認します。
Terraform planコマンドを実行します。
terraform plan

出力例:

data.oci_identity_availability_domains.ads: Reading...
data.oci_identity_availability_domains.ads: Read complete after 1s [id=xxx]

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.yyy"
          + name           = "QnsC:US-ASHBURN-AD-2"
        },
      + {
          + compartment_id = "ocid1.tenancy.oc1..xxx"
          + id             = "ocid1.availabilitydomain.zzz"
          + 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. 管理者に問い合わせ、プロキシ設定を更新して、やり直してください。