リモート実行の使用
リソース・マネージャでは、Terraformのリモート実行機能を使用して、リモート・コンピュータ上のスクリプトまたはコマンドを実行できます。また、この方法は、リモート・リソースへのアクセスが必要な他のプロビジョナにも使用できます。
詳細は、remote-exec Provisioner (terraform.io)を参照してください。
開始前
- スクリプトがリモートで実行される場所は、次のいずれかの構成を持つOracle Cloud Infrastructureリソースである必要があります。
- プライベート・エンドポイント。詳細は、Private Remote Execを参照してください。
- リモートログインをサポートするパブリックIPアドレス。
- Windowsで、WinRMを有効にする必要があります。LinuxまたはUnixでは、SSHを有効にする必要があります。
- 公開キーがOracleにアップロードされた、APIリクエストの署名に使用されるキー・ペア。キーの生成およびアップロードの詳細は、必要なキーおよびOCIDを参照してください。
認証
ボールト・サービスへのアクセス権があるかどうかに応じて、次のいずれかのアプローチを使用することをお薦めします。詳細は、ボールトの概要を参照してください。
Vaultを使用
最初に、ボールトを使用して秘密キーを暗号化します。詳細は、キーの管理およびマスター暗号化キーの使用を参照してください。
次に、暗号化された秘密キーをリソース・マネージャに指定します。復号化データ・ソースを使用して復号化できます。
次のコード・サンプルは、このプロセスを示しています。
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"
]
}
}
Vaultなし
ボールト・サービスへのアクセス権がない場合は、キー・ペアを動的に生成して、状態ファイルに格納することができます。
- TLSリソースを使用してキー・ペアを生成します。
- コンピュート・インスタンスを起動する際は、TLSリソースの公開キーを使用してください。
- SSH接続を確立するときに、秘密キーを指定します。
注意
安全な場所ではないため、Terraform構成ファイルに秘密キーを保存しないでください。
安全な場所ではないため、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
ブロックを使用すると上書きできます。詳細は、プロセッサ接続設定を参照してください。