Terraformプロバイダのトラブルシューティング

このトピックでは、Oracle Cloud Infrastructure (OCI) Terraformプロバイダの一般的な問題をトラブルシューティングする方法について説明します。

「トラブルシューティングの基本」から始めて、次に示す項を参照してください:

トラブルシューティングの基本

Oracle Cloud Infrastructure (OCI) Terraformプロバイダをトラブルシューティングするか、そのサポートを受ける場合、通常は最初にOCIサービスのステータスとTerraformおよびプロバイダのバージョンを確認し、詳細なロギングを有効にして収集すると役立ちます。

ヒント

サービスのステータスおよび詳細なログ出力を確認すると、問題がTerraformプロバイダまたはプロバイダが使用しているOCIサービスのどちらに関連しているかを判別するのに役立ちます。

基本から開始した後は、一般的な問題のリストを参照してください。

OCIサービスのステータスおよび停止の確認

最新のステータスと、OCIの停止が発生しているかどうかを確認するには、OCIステータスを参照してください。

TerraformおよびOCI Terraformプロバイダ・バージョンの確認

TerraformおよびOCI Terraformプロバイダのバージョンを確認するには、構成が含まれるディレクトリからTerraformを初期化し、-versionコマンドを実行します。例:

terraform init
terraform -version

バージョンが表示されます:

Terraform v0.12.20
+ provider registry.terraform.io/hashicorp/oci v3.95.0
ヒント

新しいバージョンのOCI Terraformプロバイダでは、プロバイダのバージョンがエラー・メッセージに含まれています。

OCI Terraformプロバイダのドキュメントは、最新バージョンを反映しています。HashiCorpのリファレンスにアクセスして特定のバージョンを選択することで、以前のプロバイダ・バージョンのドキュメントを表示できます。プロバイダの特定のバージョンをダウンロードしてインストールすることもできます。

OCI Terraformプロバイダの詳細なロギング

プロバイダの実行時に詳細なコンソール出力を取得するには、Terraformコマンドの前にTF_LOGおよびOCI_GO_SDK_DEBUGフラグを付けます。例:

TF_LOG=DEBUG OCI_GO_SDK_DEBUG=v terraform plan

TF_LOGレベルおよびOCI_GO_SDK_DEBUGフラグは、環境変数としても設定できます。

自動再試行

プランの適用、リフレッシュまたは破棄中に、Terraformで、再試行時に成功する可能性のある断続的なOCIエラー(429または500エラーなど)が発生する場合があります。デフォルトでは、OCI Terraformプロバイダは、このような操作を最大10分間自動的に再試行します。再試行動作をさらに構成するには、providerブロックで次のフィールドを指定します:

  • disable_auto_retries - 再試行可能なエラーの自動再試行を無効にします。
  • retry_duration_seconds - HTTP 429およびHTTP 500エラーに応答してリソース操作を再試行する最小期間(秒単位)。実際の再試行期間は、再試行操作のジッターのために多少長くなることがあります。disable_auto_retriesフィールドがtrueに設定されている場合、この値は無視されます。

再試行バックオフおよびジッターを使用した同時実行性制御

OCIサービスに対するパラレル操作間の競合を軽減するために、OCI Terraformプロバイダは、2次バックオフおよび完全ジッターを使用して再試行をスケジュールします。2次バックオフは後続の再試行間の最大間隔を増やし、完全ジッターはバックオフ範囲内の再試行間隔をランダムに選択します。

たとえば、最初の再試行から2回目の再試行までの待機時間は、1から8秒までの間でランダムに選択されます。2回目の再試行から3回目の再試行までの待機時間は、1から18秒までの間でランダムに選択されます。再試行の回数に関係なく、再試行間隔の時間は12回目の試行後に288秒で制限されます。

retry_duration_secondsフィールドは、HTTP 429および500エラーに対応する再試行期間にのみ影響します。これらのエラーは、再試行期間が長いと成功する可能性が高くなるためです。その他のHTTPエラー(400、401、403、404、409など)は、再試行時に成功する可能性はほとんどありません。retry_duration_secondsフィールドは、このようなエラーの再試行動作に影響しません。

一般的な問題

ノート

Terraformに関連するタグの既知の問題は、タグ付けの既知の問題を参照してください。

変更の適用時にリソースが破棄される

更新不可能なリソース・プロパティをTerraform構成で更新しようとすると、既存のOCIリソースが破棄され、再作成されることがあります。変更によってリソースが破棄される場合、Terraformによって警告が表示されます。変更を適用する前に必ずterraform planを実行し、影響を受けるリソースを確認してください。詳細は、破壊的な変更を参照してください。

依存リソースを更新できない

OCIリソースを更新するときにリソースを強制的に破棄してから再作成する必要がある場合がありますが、別のリソースがそのリソースに依存しているために操作を実行できません。

たとえば、oci_core_instance_configurationリソースを更新する必要があるが、インスタンス・プールがそのインスタンス構成を使用している場合などです。必須の引数でインスタンス・プールがインスタンス構成を参照しているため、このインスタンス構成は削除できません。

このタイプの動作を回避するには、リソース・ブロックでlifecycleおよびcreate_before_destroyメタ引数を使用できます。

この例では、Terraformは更新を含む2番目のoci_core_instance_configurationリソースを作成してから、新しいインスタンス構成を関連インスタンス・プールに割り当てます。最終的に、Terraformは元のインスタンス構成を破棄します。例:

resource "oci_core_instance_configuration" "test_instance_configuration" {
...

 lifecycle {
    create_before_destroy = true
  }
}

詳細は、lifecycleメタ引数および破壊的な変更を参照してください。

リソースを破棄または更新できない

Terraform構成ファイルのresourceブロックにlifecycleおよびprevent_destroy = trueメタ引数を指定すると、OCIリソースが破棄されなくなります。たとえば、次の構成では、オブジェクト・ストレージ・バケットを破棄できません:

resource "oci_objectstorage_bucket" "test_bucket" {
  #Required
  compartment_id = var.tenancy
  name = "test"
  namespace = "exampleNamespace"

  lifecycle {
    prevent_destroy = true
  }
} 

このメタ引数は、terraform destroyを使用できないようにします。特定の構成の更新では、適用前にリソースを破棄する必要があるため、この設定では更新も適用できなくなる可能性があります。この例では、nameは、リソースを破棄して再作成しないと更新できないプロパティです。そのため、lifecycleメタ引数を削除または変更しないと、バケットの名前を更新できません。

詳細は、「The lifecycle Meta-Argument」を参照してください。

リソース引数の設定を解除できない

OCI Terraformプロバイダで管理されるOracle Cloud Infrastructureリソースの多くでは、オプションの構成引数を使用できます。一度設定すると、リソースの作成時であるか後続の更新時であるかに関係なく、空の文字列を渡したり、構成から引数を削除したりしても、これらの引数の設定を解除することはできません。これらの引数の設定を解除しようとしても、Terraformでは無視されます。

OCI Terraformプロバイダのサポートされているリソースおよびデータ・ソースの完全なリファレンスには、使用方法、引数および属性の詳細が含まれます。完全なリファレンスは、docs.oracle.comおよびTerraformレジストリから入手できます。

データ・ソースとリソースは、リファレンス内のサービスごとにグループ化されます。

lifecycleメタ引数のトリガーの参照

Terraform v0.14以降では、構成ファイル内のグローバル変数を、ローカル変数とトリガーの組合せに置換することが必要な場合があります。lifecycleおよびignore_changesメタ引数のトリガーを参照し、後続のTerraform適用操作で構成が実行されないようにするには、次のようにしてトリガーを参照します:

resource "null_resource" "exampleB" {
  depends_on = [null_resource.exampleA]
  triggers = {
    os_user = var.os_user
  }
  lifecycle {
    ignore_changes = [
      triggers["os_user"]
    ]
  }

コンパートメントを削除できない

デフォルトでは、destroyコマンドを使用しても、Terraformプロバイダではコンパートメントは削除されません。

プロバイダでコンパートメントの削除を試行するには、enable_delete引数をtrueに設定する必要があります。例:

resource "oci_identity_compartment" "test_compartment" {
    compartment_id = var.compartment_id
    description = var.compartment_description
    name = var.compartment_name

    enable_delete = true
}
ノート

コンパートメントを破棄するには、コンパートメントも空であることが必要です。depends_on引数を使用して、非表示の依存関係が定義されていることを確認してください。詳細は、「リソース」を参照してください。

「Operation Timeout」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: Operation Timeout
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: timeout while waiting for state to become 'SUCCEEDED, FAILED, CANCELED' (last state: 'IN_PROGRESS', timeout: 15m)

この場合、指定されたOCIサービスは、しばらくポーリングした後で、リソースがまだ予定された状態になっていないことを示しています。

状況によっては、さらにポーリングを続行するため、リソースの操作タイムアウトを増やす必要があります。この実行方法の詳細は、操作タイムアウトを参照してください。

「Unexpected LifeCycle state」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: Unexpected LifeCycle state
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: During deletion, Terraform expected the resource to reach state: TERMINATED, but the service reported unexpected state: RUNNING.
Resource OCID: exampleuniqueID
Suggestion: Please retry or contact support for help with service: <service>

この場合、指定されたOCIサービスで不明なエラーが発生しています。再試行するか、そのサービスに関してサポートに連絡してください。

Terraform CLIの問題

この項では、Terraform CLIのインストールと構成について説明します。

OCI Terraformプロバイダのアップグレード後に「No such file」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error asking for user input: 1 error(s) occurred:

* provider.oci: dial unix /var/folders/6r/8fk5dmbj4_z3sl0mc_y_fhjw0000gn/T/plugin811254328|netrpc: connect: no such file or directory

インストールされているTerraformバイナリと互換性のないOCI Terraformプロバイダのバージョンを使用している可能性があります。OCIプロバイダ・バージョンがv3.x.x以上の場合、v.0.10.1以上のTerraformバージョンが必要です。

プロキシ経由での接続時に「TCP...i/o timeout」メッセージ

Terraform CLIで次のようなエラー・メッセージが返された場合:

* provider.oci: ... dial tcp 134.70.16.0:443: i/o timeout

この場合、プロキシ設定が正しく構成されていない可能性があります。OCI Terraformプロバイダでは、http_proxyhttps_proxyおよびno_proxy変数がサポートされており、包含リストまたは除外リストを次のように定義できます:

export http_proxy=http://www.your-proxy.com:80/
export https_proxy=http://www.your-proxy.com:80/
export no_proxy=localhost,127.0.0.1

「x509: certificate signed by unknown authority」エラー・メッセージ

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: Get https://iaas.<region>.oraclecloud.com/20160918/services: x509: certificate signed by unknown authority
  on ../modules/network/modules/main/main.tf line 3...

Terraformが信頼できるTLS証明書を使用しており、証明書チェーンが有効であることを確認してください。詳細は、「x509: certificate signed by unknown authority」エラーで失敗するTerraformの実行を参照してください。MacOS Catalinaを使用している場合、証明書問題の解決の詳細は、ドキュメントのMacOSの項を参照してください。

「Outdated GPG key...unable to verify new provider releases」エラー・メッセージ

Terraform CLIで次のようなエラー・メッセージが返された場合:

Warning: registry.terraform.io: 
This version of Terraform has an outdated GPG key and is unable to verify new provider releases.
Please upgrade Terraform to at least <version> to receive new provider updates.
For details see: https://discuss.hashicorp.com/t/hcsec-2021-12-codecov-security-event-and-hashicorp-gpg-key-exposure/23512

このメッセージは、新しいGPGキーで署名されたTerraformプロバイダのバージョンが、Terraformレジストリで除外されていることを意味します。Terraform CLIでは、正常に検証できるOCI Terraformプロバイダの最新バージョンがインストールされますが、それが最新バージョンではない場合があります。

このメッセージを削除し、最新バージョンのOCI Terraformプロバイダを使用できることを確認するには、使用している主なTerraformバージョンで使用可能な最新のメンテナンス・リリースにTerraform CLIをアップグレードします。たとえば、Terraform v0.12.21を使用している場合は、使用可能な最新バージョンであるv0.12にアップグレードします。

Terraformプロバイダの問題

この項では、OCI Terraformプロバイダのインストールと構成に関する詳細を説明します。

モジュール使用時の"NotAuthenticated"エラー

モジュールを使用していて、Terraform CLIから次のようなエラー・メッセージが返された場合:

Error: 401-NotAuthenticated, The required information to complete authentication was not provided or was incorrect.

各モジュールが独自のプロバイダ要件を宣言していることを確認します。詳細は、「モジュール内のプロバイダ」を参照してください。

Terraform使用時に「NotAuthenticated」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: 401-NotAuthenticated
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current.
Service: <service>
Error Message: The required information to complete authentication was not provided or was incorrect.
OPC request ID: exampleuniqueID
Suggestion: Please retry or contact support for help with service: <service>
  • user_ocidtenancy_ocidfingerprintおよびprivate_key_pathが正しく設定されていることを確認します。
  • private_key_pathが、対応する公開キーではなく、秘密キーを指していることを確認します。
  • user_ocidで指定したユーザー・アカウントに、対応する公開キーが追加されていることを確認します。
  • 使用している公開キーと秘密キーのペアが正しいフォーマットであることを確認します。正しいフォーマットおよびキーの生成方法の詳細は、必要なキーを参照してください。
  • ユーザー・アカウントが、実行中のプランでアクションを実行するための適切な権限を持つグループに含まれていることを確認します。
  • テナンシが、プランでターゲット指定しているリージョンにサブスクライブされていることを確認します。
  • モジュールを使用している場合は、各モジュールが独自のプロバイダ要件を宣言していることを確認します。詳細は、「モジュール内のプロバイダ」を参照してください。

別名の使用時に「Can not create client, bad configuration: did not find a proper configuration for tenancy」というメッセージ

Terraform CLIが次のようなメッセージを返す場合、環境に問題があることを示している可能性があります:

Error: can not create client, bad configuration: did not find a proper configuration for tenancy

プロバイダ構成に別名が含まれている場合は、provider = "oci.alias_name"を使用して、リソースでプロバイダ別名を明示的に指定する必要があります。リソースでプロバイダの指定に別名を使用しない場合、Terraformでは、そのようなリソースで使用するデフォルトのプロバイダが作成されます。デフォルトのプロバイダでは、環境変数または~/.oci/configファイルから構成値がロードされます。これらの値は、別名で指定されたプロバイダで使用される値と異なる場合があり、構成エラーの原因になります。

プロバイダ構成の別名を削除するか、すべてのリソースで適切な別名でプロバイダが指定されていることを確認してください。aliasの使用方法の詳細はTerraformの公式ドキュメントで確認し、Terraformで環境変数やOCI構成ファイルがどのように使用されるかについての詳細は、「プロバイダの構成」を参照してください。

「Field cannot be set」エラー・メッセージ

Terraform CLIで次のようなエラー・メッセージが返された場合:

* Error: "field_name": this field cannot be set

OCI Terraformプロバイダの古いバージョンを使用している可能性があります。設定しようとしているフィールドは、より新しいバージョンでリリースされています。次のコマンドを使用して、Terraformプロバイダのバージョンを確認してください。

terraform -version

OCI Terraformプロバイダのドキュメントは、最新バージョンを反映しています。

db_homeのインポート時に「Could not get info about the first DbHome in the dbSystem」といエラー・メッセージ

インポート中のoci_database_db_systemにプライマリのdb_homeがない場合は、Terraform状態ファイルにdb_homeの空のプレースホルダが設定されます。インポートされた状態と構成の一貫性を保つため、db_homeの空のプレースホルダを構成に追加します。例:

# Add this placeholder into your oci_database_db_system configuration to indicate that the primary db home is empty. 
db_home {
 database { 
  admin_password = "" 
  } 
}

リソース検出実行時に「Failed to query available provider packages」というエラー・メッセージ

リソース検出の使用時に、Terraform CLIから次のようなエラー・メッセージが返された場合:

Failed to query available provider packages
 
Could not retrieve the list of available versions for provider hashicorp/oci:
the previously-selected version is no longer available

この場合は、provider_bin_path環境変数で既存のローカル・プロバイダ・バイナリの場所を指定することにより、Terraformでは確実にそのバイナリが使用されます。例:

export provider_bin_path=/Users/user/go/bin/

リソース検出を使用すると、Terraformでは、OCI Terraformプロバイダの最新バージョンのダウンロードが試行されます。

適用時にデフォルト・タグが削除される

terraform applyの実行時に、OCI Terraformプロバイダで、既存のタグのデフォルトがリソースから予期せず削除されることがあります。この問題は、特にOracle-Tagsの自動タグのデフォルトに影響します。

この問題を回避するには、プロバイダ・ブロックにignore_defined_tags属性を追加できます。

ignore_defined_tags属性を使用すると、Terraformが計画の一部として無視するか適用する定義済タグのキーをリストアウトできます。ignore_defined_tags属性はプロバイダ・レベルでのみ指定でき、最大許容サイズは100です。この属性で指定したタグは、そのTerraformファイル内のすべてのリソースで無視されます。

次の例で、"Oracle-Tags.CreatedOn"と"Oracle-Tags.CreatedBy"は、リモート・リソースに関連付けられたdefined_tagsマップ内のキーです:

provider "oci" {
    ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"]
}

詳細は、プロバイダ定義および関連するGitHubの問題を参照してください。

サービスAPIのエラー

TerraformプロバイダはユーザーのかわりにOCIサービスとやり取りするため、Terraformプロバイダが表示する多数のエラー・メッセージは、OCIサービスから直接取得されています。APIエラーのリファレンスには、すべてのサービスから返される一般的なエラーがリストされています。

OCI Terraformプロバイダから返されるサービス・エラー・メッセージには、次の情報が含まれます:

  • エラー - HTTPステータスおよびAPIエラー・コード
  • プロバイダのバージョン - リクエストの作成に使用されるOCI Terraformプロバイダのバージョン
  • サービス - エラーで応答するOCIサービス
  • エラー・メッセージ - サービスから返されたエラーに関する詳細
  • OPCリクエストID - リクエストID
  • 推奨 - 推奨される次のステップ

例:

Error: <http_code>-<api_error_code>
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: <error_message>
OPC request ID: exampleuniqueID
Suggestion: <next_steps>

この項では、返されることが多いサービス・エラーのいくつかを詳しく説明します。

「400-InvalidParameter」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: 400-InvalidParameter
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: <error_message>
OPC request ID: exampleuniqueID
Suggestion: Please update the parameter(s) in the Terraform config as per error message: <error_message>

エラー・メッセージで指定されたパラメータを、リソースのTerrform構成で更新します。

「400-LimitExceeded」エラー

Terraformの使用中に、リソースのサービス制限に達したか制限を超えたことを示すエラーが発生する場合があります。例:

Error: 400-LimitExceeded
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: Fulfilling this request exceeds the Oracle-defined limit for this tenancy for this resource type.
OPC request ID: exampleuniqueID
Suggestion: Request a service limit increase for this resource <service>

OCIサービス制限および制限の引上げをリクエストする方法の詳細を理解するには、サービス制限を参照してください。

「404-NotAuthorized」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: 404-NotAuthorizedOrNotFound
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current.
Service: <service>
Error Message: Authorization failed or requested resource not found.
OPC request ID: exampleuniqueID
Suggestion: Either the resource has been deleted or service <service> need policy to access this resource. Policy reference: <link>

ユーザー・アカウントが、実行中のプランでアクションを実行するための適切な権限を持つグループに含まれていることを確認します。詳細は、サービスの「ポリシー・リファレンス」を参照してください。

「500-InternalError」エラー

Terraform CLIで次のようなエラー・メッセージが返された場合:

Error: 500-InternalError
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: Internal error occurred
OPC request ID: exampleuniqueID
Suggestion: The service for this resource encountered an error. Please contact support for help with service <service>

サービスは、Terraformプロバイダからのリクエストに内部エラーで応答しています。この問題についてサポートに連絡する場合は、メッセージ内の情報を参照してください。