Terraform importを使って既存のAzureリソース情報を取り込み
Terraformで作成したリソース状態はTerraform内(terraform.tfstate)で独自に管理されています。
直接Azureからリソース情報を取得しているわけではありません。
Azure PortalなどのTerraform以外で新規作成されたリソースはTerraformでは分かりません。
同じリソース名でデプロイしてしまうとエラーになったりします。
Terraform以外で作成したAzureリソースをTerraformで管理したいと言った場合はどうすればよいでしょうか。
この場合はterraform importを使ってAzureのリソース情報を取り込む事でTerraformで扱う事が出来るようになります。
今回はterraform Importを使ったAzureリソース情報の取得をやってみました。併せてterraform.tfstateの確認も併せてやってみました。
TerraformはAzureリソース状態をterraform.tfstateで管理している
Terraformはterraform.tfstateファイルで構成情報を管理している
TerraformはAzure側のリソースを直接確認して実行しているわけではありません。
Terraform自身がterraform.tfstateというファイルでリソースの構成を管理しています。
terraform applyコマンド等でリソース変更した場合にはtfstateファイルが作成・更新されます。
Terraformはこのtfstateファイルを見てAzureのリソース状態を判断します。
※terraform.tfstateはデフォルトのファイル名になります。
Terraform以外でデプロイしたAzureリソースを認識させる場合はterraform import
Terraformに管理されていない既存AzureリソースをTerraformに認識させる為にはterraform importを使います。
terraform importコマンドを使うと、Azureのリソース情報をtfstateファイルに追加する事が出来ます。
Terraform利用前にAzure Portal等でデプロイしたAzureリソース等をTerraformで扱えるようにする事が出来ます。
Azureリソースの設定変更を反映させる場合はterraform apply -refresh-only
新規のリソースではなく、TerraformでデプロイしたリソースをTerraform以外で変更した場合も、tfstateファイルと実際のリソース状態に差異が生まれます。
この差異をtfstateファイルに反映させる場合はterraform apply -refresh-onlyを使います。
terraform importは新規リソースの場合で既存リソースには使えません。
terraform apply -refresh-onlyを使ったtfstateファイルの更新はこちらでやっていますので、併せて見て頂けると大変有難いです。
terraform importを使って既存リソース情報をterraform.tfstateに追加
terraform importを使って既存Azureリソースを取り込み、terraform.tfstate内容の変化を確認します。
-
-
- terraform importコマンドを実行せずに同じ名前のリソースグループをTerraformでデプロイ
- エラーになる事を確認します。
- terraform importコマンドを実行
- terraform planで同じ名前のリソースグループのデプロイ確認
- terraform importコマンドを実行せずに同じ名前のリソースグループをTerraformでデプロイ
-
Azureリソースグループのテンプレートファイル
terraform importの確認なので一番シンプルなAzureリソースグループで確認します。
main.tfですべての定義を行っています。
eastus2にtest-rgというリソースグループを作成します。
main.tf | ||
1つのファイルでAzure リソースグループをデプロイするようにしています。
|
|
terraform import前に同じ名前のリソースグループをTerraformでデプロイ
Azure Portalを使って事前にリソースグループ(test-rg)をデプロイします。
事前に作成したリソースグループ | |
Azure Portal上で作成されたリソースグループを確認します。 |
Terraformを使って同じ名前のリソースグループをデプロイしてみます。
Planの時点ではエラーになりません。これはtfstateファイルにリソースの情報がない為です。
デプロイ作業 | ||
terraform initを実行します。
|
||
terraform applyを実行してみます。
|
terraform importを実行
terraform importコマンドを実行してみます。
terraform importはリソースIDを指定して実行します。
terraform importを実行する為には、リソースブロックを定義したテンプレートファイル(.tf)を準備しておく必要があります。
今回の場合はresource “azurerm_resource_group" “demo" {}と定義されたリソースブロックを準備しています。
terraform.tfstateを確認
テキストエディタでterraform.tfstateを確認してみます。
terraform.tfstateはTerraformコマンド実行したディレクトリに生成されます。
terraform.tfstate | |
terraform.tfstateをテキストエディタで確認するとリソースグループの状態が記録されている事が分かります。 |
terraform.tfstateの中身はterraform showで確認出来る
terraform showを使うとterraform.tfstateの内容を確認出来ます。
terraform show | ||
|
注意点
terraform importコマンド実行時には注意点があります。
.tfファイルのリソース定義は自分でする必要があります。
-
- リソースブロック(.tfファイル)を事前に準備しておく必要がある。
- terraform import azurerm_resource_group.demoの場合にはresource “azurerm_resource_group" “demo" {}とリソースブロックを定義した.tfファイルを準備しておく必要がある。
- リソースブロック(.tfファイル)は更新されない。新規に.tfファイルが生成される事も無い。
- terraform.tfstateの更新のみ。
- リソースを規定した.tfファイルは作成する必要があります。
- リソースブロック(.tfファイル)を事前に準備しておく必要がある。
※今回事前にリソースグループを定義した.tfファイルを利用している為エラーにはなりません。
最後に
Azure Portal等で作成したリソースもterraform importを使う事でTerraformで管理できるようになることが分かりました。
既存のシステムもTerraformで管理できるため非常に便利かと思います。
terraform importでは構成ファイルは生成されませんでしたが、Azure Terrafyを使うと同時に構成ファイルも生成されます。
Azure Terrafyを使った既存AzureリソースのTerraformインポートはこちらでやっています。
併せて見て頂けると大変有難いです。
Terraform関連の記事はこちらになります。
色々試していますので併せて見て頂けると大変有難いです。