リソース検出の設定

リソース検出を設定して、コンパートメント内の既存のリソースのTerraformファイルを生成します。

OCIリソース検出機能を使用して、次のことを行います。

  • コンソールで既存のリソースの状態ファイルを作成し、それらのリソースをTerraform設定に追加します。
  • 既存のインフラストラクチャを新しいテナントまたはリージョンで複製します。
  • 更新されたリソースの状態ドリフトを検出します。

このチュートリアルでは、ローカル環境にOracle Cloud Infrastructure Terraformプロバイダのリソース検出機能を設定します。設定を確認するには、リソース検出を実行してテナンシから情報をフェッチし、そのスクリプトを作成します。

主なタスクは:

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

詳細は、ユースケースおよび利点を参照してください。

開始前

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

MacOSまたはLinux

1. 準備

リソース検出コマンドを認証および実行するための環境を準備します。また、アカウントがコマンドの認証に必要な情報を収集します。

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

    例(抜粋):

    -----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 OCIプロバイダ・コマンドの認証に必要な情報を準備し、メモ帳にコピーします。

ノート

クラウド・シェルを使用している場合は、次のステップから<tenancy-ocid>のみを検索する必要があります。
  1. Oracle Cloudコンソールから次の資格証明情報を収集します。
    • テナントOCID: <tenancy-ocid>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、「テナンシ: <your_tenancy_name>を選択します。
    • ユーザーOCID: <user-ocid>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
      • OCIDのコピー。
    • 指紋: <fingerprint>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
      • 「APIキー」を選択します。
      • RSAキーの作成の項で作成したRSA公開キーに関連付けられているフィンガープリントをコピーします。フォーマットはxx:xx:xx...xxです。
    • リージョン: <region-identifier>
  2. ご使用の環境から次の情報を収集します。
    • 秘密キーのパス: <rsa-private-key-path>
      • RSAキーの作成で作成したRSA秘密キーへのパス。例: $HOME/.oci/<your-rsa-key-name>.pem
Terraform OCIプロバイダのインストール
ノート

クラウド・シェルを使用している場合は、この項をスキップしてください。

最新バージョンのTerraform OCIプロバイダ・バイナリv4.2以上をインストールします:

  1. ブラウザから、HashiCorp Releasesに進みます。
  2. 最新のリンクを選択します。
  3. ご使用の環境に適したリンクを見つけて、そのリンク・アドレスをコピーします。Linux 64ビットの場合の例:
    https://releases.hashicorp.com/terraform-provider-oci/4.59.0/terraform-provider-oci_4.59.0_linux_amd64.zip
  4. ご使用の環境で、一時ディレクトリを作成し、そのディレクトリに移動します:
    mkdir temp
    cd temp
  5. Terraform zipファイルをダウンロードします。例:
    wget https://releases.hashicorp.com/terraform-provider-oci/4.59.0/terraform-provider-oci_4.59.0_linux_amd64.zip
  6. ファイルを展開します。例:
    unzip terraform-provider-oci_4.59.0_linux_amd64.zip
  7. 解凍したフォルダを/usr/local/binに移動します。例:
    sudo mv terraform-provider-oci_v4.59.0_x4 /usr/local/bin
    ノート

    コマンドを実行できない場合は、/usr/local/binディレクトリにsudoを使用します。
  8. シンボリック・リンクを使用して、terraform-provider-oci_<version>コマンドを短縮します:
    sudo ln -s <source-executable> <shorter-alias>
    cd /usr/local/bin/
    sudo ln -s terraform-provider-oci_<version> tf-oci

    このチュートリアルでは、<source-executable>ではなく<shorter-alias>tf-ociを使用します。

  9. ホーム・ディレクトリに戻ります:
    cd
  10. Terraform OCIプロバイダのバージョンを確認します:
    ノート

    MacOSでは、実行可能ファイルのセキュリティ例外を作成する必要があります。
    tf-oci

    出力例: [INFO] terraform-provider-oci 4.59.0

2. 認証スクリプトの作成

認証情報をOCIプロバイダ認証変数に割り当てるシェル・スクリプトを作成します。Oracle Cloud Infrastructureアカウントは、これらのパラメータに割り当てられた値を使用してOCIプロバイダ・コマンドを認証します。

認証の追加
ノート

クラウド・シェルまたはリソース・マネージャを使用している場合は、認証を追加する必要はありません。3項に進みます。リソースを検出します。
  1. PATH内の任意の場所に実行可能スクリプト・ファイルを作成し、provider-oci.shという名前を付けます。たとえば、PATHに~/binがある場合、ステップは次のようになります:
    cd ~/bin
    touch provider-oci.sh
    chmod 755 provider-oci.sh
    ls -l

    次のように表示されます:

    -rwxr-xr-x 1 <your-username> <your-username> 0 <date> provider-oci.sh
  2. provider-oci.shに、次のコードを追加します。

    大括弧で囲まれたフィールドを、Gather Required Informationで収集した情報に置き換えます。

    #!/bin/bash
    export TF_VAR_tenancy_ocid="<tenancy-ocid>"
    export TF_VAR_user_ocid="<user-ocid>"
    export TF_VAR_fingerprint="<fingerprint>"
    export TF_VAR_private_key_path="<rsa-private-key-path>"
    export TF_VAR_region="<region-identifier>"
  3. provider-oci.shファイルを保存します。
説明
  • Authentication (Resource Discovery)に進みます。
  • APIキー・ベースの認証用に次の環境変数を設定します:
    • TF_VAR_tenancy_ocid
    • TF_VAR_user_ocid
    • TF_VAR_fingerprint
    • TF_VAR_private_key_path
    • TF_VAR_region
環境変数のエクスポート

この項では、provider-oci.shファイルを実行して、OCIプロバイダ認証変数を環境変数に追加します。

  1. $HOME/binディレクトリから、provider-oci.shファイルを実行します。
    source provider-oci.sh
  2. OCIプロバイダ認証変数が環境変数に追加されていることを確認します。
    env | sort

    変数はアルファベット順に表示されます。次に例を示します:

    ...
    TF_VAR_fingerprint=<fingerprint>
    TF_VAR_private_key_path=<rsa-private-key-path>
    TF_VAR_region=<region-identifier>
    TF_VAR_tenancy_ocid=<tenancy-ocid>
    TF_VAR_user_ocid=<user-ocid>
    ...
  3. 環境変数をロードするには、新しいシェルの起動時に、source ~/bin/provider-oci.shコマンドを.bashrcに追加します。
    source ~/bin/provider-oci.sh

3. リソースの検出

テナント内の可用性ドメインを検出します。

リソース検出の実行

すべてのテナンシには可用性ドメインのリストがあります。リージョン内の可用性ドメインを検出することで、次のことを確認します:

  • Oracle Cloud Infrastructureアカウントは、Oracle Cloud Infrastructureプロバイダ・コマンドを認証できます。
  • リソース検出機能を使用して、アカウントから情報を取得できます。
  1. $HOMEディレクトリに、resource-discoveryというディレクトリを作成します。
    cd
    mkdir resource-discovery
  2. クラウド・シェルを使用している場合は、インストールされているOCI Terraform Providerファイルを/usr/binディレクトリで検索します。
    ls /usr/bin

    ファイル名は次のとおりです。

    terraform-provider-oci_<version>

    サンプル・ファイル名:

    terraform-provider-oci_v5.2.1
  3. 次のコマンドを実行します:
    • クラウド・シェルで:
      terraform-provider-oci_<version> -command=export -compartment_id=<tenancy-ocid> -services=availability_domain -output_path=$HOME/resource-discovery
    • コンピュート・インスタンスまたはローカル環境:
      tf-oci -command=export -compartment_id=<tenancy-ocid> -services=availability_domain -output_path=$HOME/resource-discovery
    重要

    • <tenancy-ocid>「必要な情報の収集」の情報に置き換えます。
    • クラウド・シェルを使用している場合は、terraform-provider-oci_<version>をステップ2で見つけたファイル名に置き換えます。

    サンプル出力:

    ...
    INFO <date> [INFO] ===> Generating resource 'oci_identity_availability_domain.export_QnsC-US-ASHBURN-AD-1'
    INFO <date> [INFO] ===> Generating resource 'oci_identity_availability_domain.export_QnsC-US-ASHBURN-AD-2'
    INFO <date> [INFO] ===> Generating resource 'oci_identity_availability_domain.export_QnsC-US-ASHBURN-AD-3'
    ...
    INFO <date> Found 6 'availability_domain' resources. Generated under '/<home-directory>/resource-discovery/availability_domain.tf'.
    INFO <date> === COMPLETED ===
    ノート

    • テナントOCIDは、ルート・コンパートメントのコンパートメントOCIDです。特定の<compartment-ocid>または<tenancy-ocid>を指定すると、同じ可用性ドメインが出力されます。
    • アイデンティティ・リソースを検出するために、コンパートメントOCIDを指定する必要はありません。前述の例では、コマンドからcompartment_idを削除した場合も同じ結果になります。compartment_idは、他のサービスの構文を学習するためのものです。
トラブルシューティング
  • エラー・メッセージ: Failed to query available provider packages:
    • VPNを利用している場合は、プロキシーの設定を確認してください。
  • 401エラー- (Service error:NotAuthenticated):
    • 次のいずれかの値が正しくありません:
      • テナンシOCID
      • ユーザーOCID
      • フィンガープリント
      • RSA秘密キー(パスまたはキー)
  • そのようなホストはありません:
    • 次の値が正しくありません:
      • リージョン識別子
説明
  • Usage (Resource Discovery)に進みます。

    2つのコマンドオプションが表示されます。

  • compartment_idをベース・コマンドとして使用するコマンド・オプションを選択します。
    terraform-provider-oci -command=export -compartment_id= -output_path=
  • ベース・コマンドを更新します:
    • terraform-provider-ociのかわりに、シンボリック・リンク・コマンドを使用します:

      tf-oci

    • パラメータの説明の項を確認して、ベース・コマンドのパラメータに適切な値を追加します:
      • exportコマンドを使用して、リソース検出を実行します:

        -command=export

      • リソースを検出するコンパートメントのOCIDを追加します:

        -compartment_id=<tenancy-ocid>

      • 検出されたリソースのディレクトリを作成してから指定します:

        例: -output_path=$HOME/resource-discovery

  • availability_domainというフレーズを検索し、次の情報を確認します。
    Resources that are dependent on availability domains will be generated under availability_domain.tf file. These include:
    
        oci_core_boot_volume
        oci_file_storage_file_system
        oci_file_storage_mount_target
        oci_file_storage_snapshot
    
  • サービスには、次を使用します:
    • availability_domain (サービスではありませんが、サービスと連携します。)
    • 例: -services=availability_domain
    • サービス名を囲む引用符は必要ありません。
  • コマンドを作成します:

    次に例を示します:

    tf-oci -command=export -compartment_id=<tenancy-ocid> -services=availability_domain -output_path=$HOME/resource-discovery
    ノート

    リソース検出コマンドでは、検出されたリソースのディレクトリは作成されません。ディレクトリを作成し、コマンドにパスを指定します。
検出されたリソースの確認
  1. $HOMEディレクトリから、resource-discoveryディレクトリに移動します。
    cd resource-discovery
  2. ディレクトリの内容を表示します。
    ls

    サンプル出力:

    availability_domain.tf  provider.tf  vars.tf
  3. 可用性ドメインのTerraformスクリプトを確認します:
    cat availability_domain.tf

    サンプル出力:

    ## This configuration was generated by terraform-provider-oci
    
    data oci_identity_availability_domain export_QnsC-US-ASHBURN-AD-1 {
      compartment_id = var.compartment_ocid
      ad_number      = "1"
    }
    data oci_identity_availability_domain export_QnsC-US-ASHBURN-AD-2 {
      compartment_id = var.compartment_ocid
      ad_number      = "2"
    }
    data oci_identity_availability_domain export_QnsC-US-ASHBURN-AD-3 {
      compartment_id = var.compartment_ocid
      ad_number      = "3"
    }
    resource oci_file_storage_file_system export_JennFS ... <some info>
    resource oci_file_storage_snapshot export_Snapshot-1 ... <some info>
    resource oci_file_storage_mount_target export_MountTarget-xxx ... <some info>
    ノート

    availability_domain.tf Terraformスクリプトは、compartment_ocidという変数を使用します。vars.tfでこの変数の値を見つけます。
  4. 変数を確認します:
    cat vars.tf

    サンプル出力:

    variable compartment_ocid { default = "<tenancy-ocid>" }
    variable region { default = "us-ashburn-1" }
  5. プロバイダ・スクリプト情報を確認します:
    cat provider.tf

    サンプル出力:

    provider oci {
            region = var.region
    }
    ノート

    • provider.tfでは、provider oci { }でTerraform OCIプロバイダを使用していることを示します。
    • provider.tfファイルには認証情報が含まれていません。これは、環境変数を使用して認証情報を指定するためです。

完了!これで、Oracle Cloud Infrastructureアカウントは、Terraform OCIプロバイダ・コマンドを認証できます。また、ご使用の環境でリソース検出コマンドを実行する準備が整いました。

参照: