リモート実行の使用

リソース・マネージャでは、Terraformのリモート実行機能を使用して、リモート・コンピュータ上のスクリプトまたはコマンドを実行できます。また、この方法は、リモート・リソースへのアクセスが必要な他のプロビジョナにも使用できます。

詳細は、remote-exec Provisioner (terraform.io)を参照してください。

開始する前に

  • スクリプトがリモートで実行される場所は、次のいずれかの構成を持つOracle Cloud Infrastructureリソースである必要があります。
  • Windowsで、WinRMを有効にする必要があります。LinuxまたはUnixでは、SSHを有効にする必要があります。
  • 公開キーがOracleにアップロードされた、APIリクエストの署名に使用されるキー・ペア。キーの生成およびアップロードの詳細は、必要なキーおよびOCIDを参照してください。

認証

ボールト・サービスへのアクセス権があるかどうかに応じて、次のいずれかのアプローチを使用することをお薦めします。詳細は、ボールトの概要を参照してください。

ボールトあり

最初に、ボールトを使用して秘密キーを暗号化します。詳細は、キーの管理およびマスター暗号化キーの使用を参照してください。

次に、暗号化された秘密キーをリソース・マネージャに指定します。復号化データ・ソースを使用して復号化できます。

次のコード・サンプルは、このプロセスを示しています。

data "oci_kms_decrypted_data" "private_key_decrypted" {
    #Required
    ciphertext = "${file(var.encrypted_private_key_path)}"
    crypto_endpoint = "${var.decrypted_data_crypto_endpoint}"
    key_id = "${var.kms_encryption_key_id}"
}
  
  
resource "oci_core_instance" "TFInstance1" {
  availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[var.availability_domain - 1],"name")}"
  compartment_id      = "${var.compartment_ocid}"
  display_name        = "TFInstance"
  hostname_label      = "instance3"
  shape               = "${var.instance_shape}"
  subnet_id           = "${oci_core_subnet.ExampleSubnet.id}"
  
  source_details {
    source_type = "image"
    source_id   = "${var.instance_image_ocid[var.region]}"
  }
  
  extended_metadata {
    ssh_authorized_keys = "${var.ssh_public_key}"
  }
}
  
resource "null_resource" "remote-exec" {
  depends_on = ["oci_core_instance.TFInstance1"]
  provisioner "remote-exec" {
    connection {
      agent       = false
      timeout     = "30m"
      host        = "${oci_core_instance.TFInstance1.public_ip}"
      user        = "${var.opc_user_name}"
      private_key = "${data.oci_kms_decrypted_data.test_decrypted_data.plaintext}"
    }
  
    inline = [
      "touch ~/IMadeAFile.Right.Here"
    ]
  } 
}

ボールトなし

ボールト・サービスへのアクセス権がない場合は、キー・ペアを動的に生成して、状態ファイルに格納することができます。

  1. TLSリソースを使用してキー・ペアを生成します。
  2. コンピュート・インスタンスを起動する際は、TLSリソースの公開キーを使用してください。
  3. SSH接続を確立するときに、秘密キーを指定します。
注意

秘密キーは安全な場所ではないため、Terraform構成ファイルに保存しないでください。

次の例は、TLS秘密キー・リソースを使用してコンピュート・インスタンスをプロビジョニングし、そのインスタンスでリモート実行を実行する方法を示しています。

resource "tls_private_key" "public_private_key_pair" {
  algorithm   = "RSA"
}
  
resource "oci_core_instance" "TFInstance1" {
  availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[var.availability_domain - 1],"name")}"
  compartment_id      = "${var.compartment_ocid}"
  display_name        = "TFInstance"
  hostname_label      = "instance3"
  shape               = "${var.instance_shape}"
  subnet_id           = "${oci_core_subnet.ExampleSubnet.id}"
  
  source_details {
    source_type = "image"
    source_id   = "${var.instance_image_ocid[var.region]}"
  }
  
  extended_metadata {
    ssh_authorized_keys = "${tls_private_key.public_private_key_pair.public_key_openssh}"
  }
}
  
resource "null_resource" "remote-exec" {
  depends_on = ["oci_core_instance.TFInstance1"]
  provisioner "remote-exec" {
    connection {
      agent       = false
      timeout     = "30m"
      host        = "${oci_core_instance.TFInstance1.public_ip}"
      user        = "${var.opc_user_name}"
      private_key = "${tls_private_key.public_private_key_pair.private_key_pem}"
    }
  
    inline = [
      "touch ~/IMadeAFile.Right.Here"
    ]
  } 
}

接続作成

この例では、リモート実行でconnection作成を使用する方法を示します。Terraformでは、リソースへの接続に多数のデフォルトが使用されますが、resourceまたはprovisionerのいずれかでconnectionブロックを使用すると上書きできます。詳細は、プロビジョナ接続を参照してください。