從 Terraform 1.5 版本開始,您可以使用 import
區塊來直接在配置中管理資源的導入。此功能簡化了將現有基礎設施導入 Terraform 狀態的過程,消除了需要使用單獨的 CLI terraform import
命令的需求。
在本文中,我們將解釋 import 區塊以及如何使用它來導入不同的資源。
什麼是 Terraform Import 區塊?
Terraform v1.5.0 中引入的 Terraform import
區塊提供了一種聲明式方法,用於將現有基礎設施資源導入到 Terraform 狀態文件中。它允許資源導入成為 Terraform 計劃過程的一個組成部分,類似於其他受管理的資源,而不是被視為直接的狀態操作。
因此,import 區塊提高了透明度,並使資源導入與基礎設施即代碼(IaC)的核心原則保持一致,使用戶能夠更有效和可預測地管理其基礎設施。
Terraform 中 import 區塊的語法如下:
import {
to = <resource_address>
id = <resource_identifier>
}
to
: 指定您配置中將導入的資源映射到的資源地址。id
:定義供應商 API 中現有資源的唯一識別符。請確保您的Terraform 提供者已正確配置以訪問被導入的資源。
請注意,某些資源類型可能對導入有額外要求或限制。
導入區塊 vs. Terraform 導入命令
Terraform中的import
區塊可讓您直接在配置文件中定義資源,簡化現有基礎設施的管理。
相較之下,當使用terraform import
命令時沒有import
區塊,它會將現有資源連結到 Terraform 狀態,但不會自動生成相應的配置在您的程式碼中。您必須在之後手動添加此配置。導入命令特別適用於一次性導入或將基礎設施轉換為 Terraform 管理。
這兩種方法都需要仔細處理,以確保 Terraform 狀態與實際基礎設施之間的一致性。Import
區塊通常更適用於持續資源管理,而獨立命令則適用於偶爾導入。
範例1:使用Terraform Import區塊來導入一個S3存儲桶
假設我們有一個現有的AWS S3存儲桶(my-existing-bucket
),您想要用Terraform管理。
resource
區塊指定了S3存儲桶(aws_s3_bucket.example
),bucket
屬性定義了現有存儲桶的名稱:
resource "aws_s3_bucket" "example" {
bucket = "my-existing-bucket"
}
import {
to = aws_s3_bucket.example
id = "my-existing-bucket"
}
import
區塊將現有的S3存儲桶與Terraform資源關聯起來。
to
:將導入的資源映射到resource
區塊的地址(aws_s3_bucket.example
)id
:指定存儲桶的唯一ID(my-existing-bucket
)。
執行terraform plan
時,Terraform讀取import
區塊,檢查現有S3存儲桶的狀態,並顯示將對狀態文件進行的更改預覽。然後,在執行terraform apply
後,Terraform會更新狀態文件,將現有存儲桶映射到aws_s3_bucket.example
資源中。
執行terraform apply
並成功導入資源後,最佳做法是刪除import
區塊。保留它不會導致任何損害,但刪除它有助於保持清潔的配置並在未來狀態管理過程中減少潛在混淆。
範例2:使用 Terraform Import 區塊導入 EC2 實例
讓我們考慮另一個範例:我們有一個現有的 EC2 實例,其ID為i-1234567890abcdef0
,並希望將其納入 Terraform 管理之下。
我們在resource
區塊中定義我們希望 Terraform 管理的aws_instance
資源。確保屬性(例如ami
、instance_type
)與現有實例的配置相符:
resource "aws_instance" "example" {
ami = "ami-0abcdef1234567890" # Replace with the actual AMI ID
instance_type = "t2.micro"
}
import {
to = aws_instance.example
id = "i-1234567890abcdef0"
}
在import
區塊中:
to
:將您配置中的資源(aws_instance.example
)映射到現有資源。id
:指定要導入的 EC2 實例的唯一ID。
將資源區塊和導入語句添加到您的 Terraform 配置文件後,執行terraform plan
以預覽更改。接著,執行terraform apply
將資源導入到 Terraform 的狀態文件中。
導入後,Terraform 將管理現有的 EC2 實例,確保其配置保持聲明式。
範例3:使用Terraform Import區塊導入Azure資源群組
在下一個範例中,我們將導入一個Azure資源群組。
我們有一個現有的Azure資源群組,名為example-resource-group
,位於East US
區域,我們希望用Terraform來管理它。
首先,在resource
區塊中,我們定義Terraform將管理的azurerm_resource_group
資源:
resource "azurerm_resource_group" "example" {
name = "example-resource-group"
location = "East US"
}
import {
to = azurerm_resource_group.example
id = "/subscriptions/<subscription_id>/resourceGroups/example-resource-group"
}
導入區塊:
to
:將您配置中的資源(azurerm_resource_group.example
)與現有的Azure資源進行映射。id
:指定資源群組的完全合格的Azure資源ID。請記得用您的實際訂閱ID替換<subscription_id>
。
將資源和導入區塊添加到您的Terraform配置文件中。接著運行terraform plan
命令來預覽變更,並執行terraform apply
來應用變更並將資源導入到Terraform的狀態文件中。
您可以有條件地使用Terraform Import區塊嗎?
Terraform 的 import 塊被設計為聲明式的,需要在計劃時知道特定值。因此,它無法在 Terraform 代碼中有條件地使用。
import 塊不支持基於條件確定 import ID 的動態表達式或變量。在 import 塊內使用像 count 或變量這樣的結構將導致錯誤,因為 Terraform 不允許在此上下文中使用這些參數。
要點
Terraform 1.5+ 中引入 import 塊簡化了資源管理,通過在配置文件中直接進行導入和定義資源。這符合IaC 原則,通過減少複雜性並使將現有基礎設施整合到 Terraform 配置中變得更容易。
Source:
https://dzone.com/articles/how-to-use-terraform-import-block