みち草

Azure中心にまとめる技術情報ブログ

Azure Export for Terraform で既存リソースから tf ファイルを生成する

はじめに

Azure リソースから Terraform の tf ファイル、tfstate ファイルを生成するツールがあることを知ったので、試してみました。

目次

Azure Export for Terraform

名前のとおり、Terraform のファイルとして Azure リソースのエクスポートが可能なツールです。

learn.microsoft.com

エクスポート対象の指定には、以下の 3 つの方法があります。

  • 単体のリソース (リソース ID) を指定
  • リソース グループを指定
  • Azure Resource Graph を使用した指定

インストール

事前に、Azure CLI と Terraform のインストールが必要です。

MSI や Package Manager など、方法はこちらにまとまっています。

github.com

エクスポート

以下のクイックスタートを参考に、各指定方法でエクスポート、 terraform plan まで実行してみます。

learn.microsoft.com

単体リソースの指定

エクスポート先の空ディレクトリを作成しておき、コマンド プロンプトでそのディレクトリに移動します。
※既存の状態ファイルへ追加する --append オプションなどもありますが、ここではすべて新規ディレクトリで試しています。

Azure ポータルにて、エクスポート対象リソースのリソース ID をコピーしておきます。

今回は適当な VNet を使います。

az login コマンドにてログイン後、以下のエクスポートコマンドを実行します。

aztfexport resource <リソース ID>

エクスポート対象のリソースと対応する Terraform リソースの種類が表示されるため、対象に誤りがなければ w キーを押します。

エクスポートが始まります。

この画面になったら完了です。

ディレクトリには、tf ファイルや tfstate ファイルがエクスポートされています。

確認で以下のコマンドを実行します。

terraform init --upgrade
terraform plan

No changes なのでこれでエクスポート完了です。

リソース グループの指定

別のディレクトリを作成し、リソース グループでのエクスポートを指定してみます。

以下のエクスポート コマンドを実行します。

aztfexport resource-group <リソース グループ名>

そのままだと、リソース グループ内のリソースすべてが対象になります。

十字キーで選択し Delete キーを押すことで、各リソース毎にエクスポートに含めるかどうか (skip 対象かどうか) を個別指定できます。

すべて対象とは書きましたが、一部、エクスポートできないリソースが含まれる場合には自動で Skip になっていました。 (Log Analytics ワークスペースのテーブルとか)

下の方に行くとスキップがたくさんあります

エクスポート中はかわいいアイコンが出てきます。

対象が多いためか少し時間はかかりました。10 分くらい?

エクスポートが完了したら以下のコマンドを実行します。

terraform init --upgrade
terraform plan

こちらはエラーがありました。 VM のパスワードに当たる変数に指定された文字列が、複雑性の要件を満たしていないことが原因のようです。

パスワードまではエクスポートされないので、VM をエクスポートした場合は毎回こうなりそうです。

適当なパスワードに変更して、再度 plan を実行したらうまくいきました。

Azure Resource Graph での指定

最後に、Resource Graph での指定を試してみます。

ディレクトリを作成し、移動しておくところまでは同様です。

以下のコマンドを実行し、Network 系のリソースのみをエクスポートしてみます。

aztfexport query "type contains 'Microsoft.Network'"

LB や VNet など、Network 系リソースのみがエクスポートされたファイルが作成されました。

終わりに

ツールがどんな感じなのか試してみましたが、コマンドで対象を指定してエクスポートするだけなので、非常に簡単でした。

Terraform で管理したいけど既にリソースは存在している、コード化の手間を省きたい、というときには便利そうです。