リソース検出によるスクリプトおよび状態ファイルの作成

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

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

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

このチュートリアルでは、リソース検出機能を使用して、アカウント内のリソースのスクリプトおよび状態ファイルを作成します。次に、Terraformを使用してリソースを管理します。

主なタスクは:

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

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

開始前

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

要件
  • Oracle Cloud Infrastructureアカウント。無料Oracle Cloudプロモーションのリクエストおよび管理を参照してください。
  • MacOS、LinuxまたはWindowsコンピュータ。
  • Terraformチュートリアル・リソース:
    • リソース検出の設定のすべてのステップを実行します。
    • OCI Terraformプロバイダ・コマンドをノートにとります:
      • クラウド・シェル: /usr/binからのterraform-provider-oci_<version>
      • コンピュート・インスタンスまたはローカル環境: コマンドterraform-provider-oci_<version>のかわりに使用するには、前のチュートリアルで作成した<shorter-alias>を使用します。
        • 例: tf-oci
  • Terraform v1.1.3+:
    • Cloud Shellを使用している場合は、Terraformをインストールする必要はありません。Terraformはすでにインストールされています。
    • コンピュート・インスタンスまたはローカル環境を使用している場合は、Terraformのインストールのステップに従います。

1. リソースの作成

コンソールを使用してテナンシにバケットを作成します。このバケットにはTerraformスクリプトがありません。後で、リソース検出を使用して、バケットのTerraformスクリプトおよび状態ファイルを作成します。

コンパートメント・ポリシーの追加

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

allow group <a-group-your-username-belongs-to> to manage compartments in tenancy

この権限を持つユーザーは、チュートリアルのすべてのリソースのコンパートメントを作成できます。

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

リファレンス: 動詞とリソース・タイプの組合せの詳細(compartmentsリソース・タイプを参照)

コンパートメントを作成します

このチュートリアルで作成するリソースのコンパートメントを作成します。

  1. コンソールで、ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」を選択します。「アイデンティティ」で、「コンパートメント」を選択します。
  2. 「コンパートメントの作成」を選択します。
  3. 次の値を入力します:
    • 名前: <your-compartment-name>
    • 説明: Compartment for <your-description>.
    • 親コンパートメント: <your-tenancy>(root)
  4. 「コンパートメントの作成」を選択します。

参照: コンパートメントの作成

リソース・ポリシーの追加

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

allow group <a-group-your-username-belongs-to> to manage all-resources in compartment <your-compartment-name>

この権限を使用すると、コンパートメント内のすべてのリソースを管理でき、そのコンパートメントでの管理権限が付与されます。

ポリシーを追加するステップ
  1. コンソールで、ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」を選択します。「アイデンティティ」にある「ポリシー」を選択します。
  2. コンパートメントを選択します。
  3. 「ポリシーの作成」を選択します。
  4. 「ポリシーの作成」ページで、次の値を入力します:
    • 名前: manage-<your-compartment-name>-resources
    • 説明: Allow users to list, create, update, and delete resources in <your-compartment-name>.
    • コンパートメント: <your-tenancy>(root)
  5. 「ポリシー・ビルダー」に、次の値を入力します:
    • ポリシー・ユース・ケース: コンパートメント管理
    • 共通ポリシー・テンプレート: コンパートメント管理者がコンパートメントを管理できるようにします
    • アイデンティティ・ドメイン: <identity-domain>
    • グループ: <a-group-your-username-belongs-to>
    • 場所: <your-compartment-name>
  6. 「作成」を選択します。

参照: 共通ポリシー

バケットの作成

コンパートメントにバケットを作成します。

  1. ナビゲーション・メニューを開き、「ストレージ」を選択します。「オブジェクト・ストレージおよびアーカイブ・ストレージ」で、「バケット」を選択します。
  2. コンパートメントを選択します: <your-compartment-name>
  3. 「Create Bucket」を選択します。
  4. 次の値を入力します:
    • バケット名: <your-bucket-name>
    • 残りはデフォルトのままにします。
  5. 「作成」を選択します。
プライベート・バケットが正常に作成されました。
ノート

<your-compartment-name>にバケットを作成していることを確認してください。

2. リソースの検出

コンパートメントに作成したバケットを検出します。

バケットの検出
  1. $HOMEディレクトリから、チュートリアルリソース検出の設定で作成したresource-discoveryディレクトリを削除して再作成します。
    cd
    rm -R resource-discovery
    mkdir resource-discovery
  2. 次のコマンドを実行します:
    tf-oci -command=export -compartment_name=<your-compartment-name> -services=object_storage -output_path=$HOME/resource-discovery
    Cloud Shell:
    terraform-provider-oci_<version> -command=export -compartment_name=<your-compartment-name> -services=object_storage -output_path=$HOME/resource-discovery
    • <your-compartment-name>をコンパートメントの名前に置き換えます。
    サンプル出力:
    ...
    INFO <date> [INFO] ===> Generating resource 'oci_objectstorage_namespace.export_namespace'
    INFO <date> [INFO] ===> Generating resource 'oci_objectstorage_bucket.export_<your-bucket-name>'
    INFO <date> [INFO] Optional TF attribute 'kms_key_id' not found in source
    INFO <date> Found 2 'object_storage' resources. Generated under '/<home-directory>/resource-discovery/object_storage.tf'.
    INFO <date> === COMPLETED ===
    ノート

    次のメッセージが表示される場合があります:
    <date> ERROR IN GET: Service error: LifecyclePolicy NotFound. The bucket '<your-bucket-name>' does not define a lifecycle policy.. http status code: 404. Opc request id: iad-1:xxx

    このチュートリアルでは、ライフサイクル・ポリシーの欠如は問題ありません。このバケットを自動的にアーカイブまたは削除するようにサービスを計画するには、オブジェクト・ライフサイクル管理の使用を参照してください。

  3. 生成されたTerraformスクリプトを確認します。
    cd resource-discovery
    ls
    • object_storage.tf
    • provider.tf
    • vars.tf
  4. object_storage.tfスクリプトを表示します。
    cat object_storage.tf
    ## This configuration was generated by terraform-provider-oci
    
    data oci_objectstorage_namespace export_namespace {
      compartment_id = var.compartment_ocid
    }
    resource oci_objectstorage_bucket export_<your-bucket-name> {
      access_type    = "NoPublicAccess"
      auto_tiering   = "Disabled"
      compartment_id = var.compartment_ocid
      defined_tags = {
      }
      freeform_tags = {
      }
      #kms_key_id = <<Optional value not found in discovery>>
      metadata = {
      }
      name                  = "<your-bucket-name>"
      namespace             = data.oci_objectstorage_namespace.export_namespace.namespace
      object_events_enabled = "false"
      storage_tier          = "Standard"
      versioning            = "Disabled"
    }
オブジェクト・ストレージ・リソースがコンパートメントで正常に検出されました。
説明
  • Usage (Resource Discovery)に進みます。

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

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

      tf-oci

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

        -command=export

      • リソースを検出するコンパートメントの名前を入力します:

        -compartment_name=<your-compartment-name>

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

        例: -output_path=$HOME/resource-discovery

  • パラメータの説明の項の次のパラメータをベース・コマンドに追加します:
    • services
  • servicesにリストされているサービス名から:
    • object_storage
    • 例: -services=object_storage
    • 複数のサービスを検出するには、サービス名をカンマで区切ります。
    • 例: -services=object_storage,core
    • サービス名を囲む引用符は必要ありません。
  • コマンドを作成します:

    次に例を示します:

    tf-oci -command=export -compartment_name=<your-compartment-name> -services=object_storage -output_path=$HOME/resource-discovery
    ノート

    トラブルシューティング
    [ERROR] output_path does not exist: stat /$HOME/resource-discovery: no such file or directory

    リソース検出コマンドでは、検出されたリソースのディレクトリは作成されません。ディレクトリを作成し、コマンドにパスを指定します。

    [ERROR] no output directory specified

    パーサーは、ダッシュのないパラメータで停止します。各パラメータの先頭にダッシュが追加されていることを確認します。たとえば、-servicesのかわりにservicesを使用すると、パーサーは出力ディレクトリに到達しません。

状態ファイルの生成
リソースを追跡するために、Terraformはリソースの状態を状態ファイルに格納します。その後、Terraformを使用してリソースを更新するたびに、Terraformはその変更で状態ファイルを更新します。
  1. -generate_stateフラグを指定してリソース検出コマンドを実行します:
    • クラウド・シェルで:
    • terraform-provider-oci_<version> -command=export -compartment_id=<tenancy-ocid> -command=export -compartment_name=<your-compartment-name> -services=object_storage -generate_state -output_path=$HOME/resource-discovery
    • コンピュート・インスタンスまたはローカル環境:
      tf-oci -command=export -compartment_name=<your-compartment-name> -services=object_storage -generate_state -output_path=$HOME/resource-discovery
    サンプル出力:
    ...
    Terraform has been successfully initialized!
    ...
    Import successful!
    
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    
    INFO <date> [INFO] ===> Generating resource 'oci_objectstorage_namespace.export_namespace'
    INFO <date> [INFO] ===> Generating resource 'oci_objectstorage_bucket.export_<your-bucket-name>'
    INFO <date> [INFO] Optional TF attribute 'kms_key_id' not found in source
    INFO <date> Found 2 'object_storage' resources. Generated under '/<home-directory>/resource-discovery/object_storage.tf'.
    INFO <date> === COMPLETED ===
    
    ノート

    トラブルシューティング:
    • エラー: 使用可能なプロバイダ・パッケージの問合せに失敗しました:
      • VPNを使用している場合は、プロキシ設定を確認してください。
  2. resource-discoveryディレクトリの内容を表示します。
    ls

    サンプル出力:

    • object_storage.tf
    • provider.tf
    • terraform.tfstate
    • vars.tf
    ノート

    リソース検出コマンドを実行するたびに、<resource>.tfファイルが上書きされます。サービスを指定しない場合、指定したコンパートメント内のすべてのリソースに対して<resource>.tfファイルが作成されます。
  3. 生成されたTerraform状態ファイルを表示します。
    cat terraform.tfstate

    サンプル出力:

    ...
    "instances": [
      {
          "bucket_id": "ocid1.bucket.xxx",
          "compartment_id": "ocid1.compartment.xxx",
          "created_by": "ocid1.user.xxx",
          "id": "xxx/<your-bucket-name>",
    ...

完了!バケット・リソースの状態ファイルが作成されました。

参照:

3. リソースの更新

object_storage.tfファイルでバケットの名前を更新し、Terraformスクリプトを実行します。アカウントがスクリプトを認証してから、Terraformがバケット名を更新します。コンソールで新しいバケット名を確認します。

バケット名の変更
  1. エディタでobject_storage.tfファイルを開き、バケット名を<your-bucket-name>から<your-bucket-name>-2に変更します。
    ノート

    名前を変更できるのは、空のバケットのみです。
    ## This configuration was generated by terraform-provider-oci
    
    data oci_objectstorage_namespace export_namespace {
      compartment_id = var.compartment_ocid
    }
    resource oci_objectstorage_bucket export_<your-bucket-name> {
      access_type    = "NoPublicAccess"
      auto_tiering   = "Disabled"
      compartment_id = var.compartment_ocid
      defined_tags = {
      }
      freeform_tags = {
      }
      #kms_key_id = <<Optional value not found in discovery>>
      metadata = {
      }
      name                  = "<your-bucket-name>-2"
      namespace             = data.oci_objectstorage_namespace.export_namespace.namespace
      object_events_enabled = "false"
      storage_tier          = "Standard"
      versioning            = "Disabled"
    }
  2. object_storage.tfファイルを保存します。
初期化
状態ファイルを作成すると、リソース検出によって、Terraform構成ファイルを含む作業ディレクトリが初期化されます。Terraformスクリプトを更新するたびに、このコマンドを実行するように習慣を付けます。
  1. resource-discoveryディレクトリの内容を確認します。
    ls -a

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

  2. Terraformがインストールされていることを確認します。
    terraform -v
  3. initコマンドを実行します:
    terraform init

    出力例:

    Initializing the backend...
    
    Initializing provider plugins...
    - Using previously-installed hashicorp/oci vx.x.x
    ...
    Terraform has been successfully initialized!
プラン
実行計画は、Terraformがアカウントへの適用を計画する変更のリストです。
  1. 実行計画を作成します:
    terraform plan
  2. 実行計画を確認します。

    コマンドterraform planを使用して、実際のリソースに変更を加えずに、実行計画に表示される変更が期待どおりであるかどうかを確認します。出力例:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
    -/+ destroy and then create replacement
    
    Terraform will perform the following actions:
    
      # oci_objectstorage_bucket.export_<your-bucket-name> must be replaced
    -/+ resource "oci_objectstorage_bucket" "export_<your-bucket-name>" {
    ...
        ~ name = "<your-bucket-name>" -> "<your-bucket-name>-2" # forces replacement
            namespace = "<your-tenancy>"
            ...
    
    Plan: 1 to add, 0 to change, 0 to destroy.
適用

バケットの更新

  1. Terraformスクリプトを実行します:
    terraform apply
  2. 確認を求められた場合は、置換するバケット名にyesを入力します。

    出力例:

    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

コンソールでの新規バケット名の検索

  1. ナビゲーション・メニューを開き、「ストレージ」を選択します。「オブジェクト・ストレージおよびアーカイブ・ストレージ」で、「バケット」を選択します。
  2. コンパートメント<your-compartment-name>を選択します。
  3. バケットのリストで、バケット名を確認します。

    バケットの名前は、<your-bucket-name>-2になります。