【AWS】 Terraformerで複数のリソースを一括importしてみた

10月 11, 2023

お久しぶりです!今回が2022年最後の記事です!


現在の勤務先では今年からAWSの新規リソース作成は基本的にTerraformを利用しています。そしてゆくゆくは既存のリソースもTerraformで管理する計画があり、すでに大きくなったAWSリソース群をどのようにimportするかを検討しています。


既存のterraformコマンドではリソースを一つずつimportする上に先にtfファイルを用意してresourceオブフェクトを記載しておく必要があるため、一定以上のリソース規模では現実的ではありません。


そこで今回は大規模リソースのterraform化における選択肢として挙げられる"Terraformer"を簡単に触ってみたので所感を記事にしておきたいと思います。

準備

まずはterraformerの利用に向けて準備していきます。


今回は2つのs3バケット(バケット名をterraformer-test1, terraformer-test2 とします)をimport用として準備します。


次にterraformerをお使いのPCにインストールしておきます。インストールに関しては下記ページを参照ください。

https://github.com/GoogleCloudPlatform/terraformer#installation

僕はMacOSのPCを使用しているのでhomebrewでさくっとインストールしました。


続いて今回のディレクトリ構成です。

.
└── resources
    └── backend.tf

とは言ってもtf化したファイルを出力するディレクトリを任意の名前で作成するのみです。(今回はresources)


あとはterraformer実行のためにterraform initが必要なのでprovider情報を記載したファイルを上記ディレクトリ内に作成しておけば準備完了です!

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

準備ができたらresorcesディレクトリ内でterraform initしてください。

リソースをimportする

それでは実際にterraformerを利用して2つのs3バケットを一括importしてみましょう。


実行するコマンドは以下です、デフォルトのプロファイルやリージョンを利用する場合は指定の必要はありません。

$ terraformer import aws -r=s3 --profile=<プロファイル名> --regions=<リージョン> 

すると複数のファイルが作成されました。

.
└── resources
    ├── backend.tf
    └── generated
        └── aws
            └── s3
                ├── outputs.tf
                ├── provider.tf
                ├── s3_bucket.tf
                └── terraform.tfstate

generateディレクトリが作成され、その中にimportしたリソースのプロバイダー名とリソース名に一致するディレクトリが作成されています。そしてその中に複数のtfファイルが作成されていることが確認できます。

resource "aws_s3_bucket" "tfer--terrafomer-test1" {
  arn                 = "arn:aws:s3:::terrafomer-test1"
  bucket              = "terrafomer-test1"
  force_destroy       = "false"
  hosted_zone_id      = "Z2M4EHUR26P7ZW"
  object_lock_enabled = "false"
  request_payer       = "BucketOwner"

  versioning {
    enabled    = "false"
    mfa_delete = "false"
  }
}

resource "aws_s3_bucket" "tfer--terrafomer-test2" {
  arn                 = "arn:aws:s3:::terrafomer-test2"
  bucket              = "terrafomer-test2"
  force_destroy       = "false"
  hosted_zone_id      = "Z2M4EHUR26P7ZW"
  object_lock_enabled = "false"
  request_payer       = "BucketOwner"

  versioning {
    enabled    = "false"
    mfa_delete = "false"
  }
}

リソース名は"tfer–<リソース名>"で出力されるようですね。実際に運用する場合はこの辺り一括で修正が必要です。


また、当然各設定の値がハードコーディングされているためlocal変数などを利用して値の一括管理をしておく必要があります。同一リソースはfor_eachで作成するなど色々修正したい部分はあります。


terraformerでimportしすぐに運用開始!とまではさすがにいけませんが、コマンド一つで基本的なリソースをまるっと作成してくれるのは大変便利ですね!

output "aws_s3_bucket_tfer--terrafomer-test1_id" {
  value = "${aws_s3_bucket.tfer--terrafomer-test1.id}"
}

output "aws_s3_bucket_tfer--terrafomer-test2_id" {
  value = "${aws_s3_bucket.tfer--terrafomer-test2.id}"
}

アウトプットも出力されているのは親切ですね!今回はS3バケットIDが自動で出力されています。


あとは基本的なProvider設定ファイルとtfstateが自動出力されています。基本的に必要なファイルはコマンド一つで全て用意してくれていて素敵です。

その他使用方法

今回はS3バケットをimportする非常にシンプルな使用方法でしたが、terraformerにはいくつかオプションが準備されており柔軟に実行できるようになっています。

rオプションでリソース指定、xオプションで除外リソース指定ができることは基本的に押さえておいたほうがいいでしょう。

Usage:
   import [provider] [flags]
   import [provider] [command]

Available Commands:
  list        List supported resources for a provider

Flags:
  -b, --bucket string         gs://terraform-state
  -c, --connect                (default true)
  -С, --compact                (default false)
  -x, --excludes strings      firewalls,networks
  -f, --filter strings        compute_firewall=id1:id2:id4
  -h, --help                  help for google
  -O, --output string         output format hcl or json (default "hcl")
  -o, --path-output string     (default "generated")
  -p, --path-pattern string   {output}/{provider}/ (default "{output}/{provider}/{service}/")
      --projects strings
  -z, --regions strings       europe-west1, (default [global])
  -r, --resources strings     firewall,networks or * for all services
  -s, --state string          local or bucket (default "local")
  -v, --verbose               verbose mode
  -n, --retry-number          number of retries to perform if refresh fails
  -m, --retry-sleep-ms        time in ms to sleep between retries

Use " import [provider] [command] --help" for more information about a command.

■terraformer import aws list
terraformerを利用できるリソース群の確認が可能です。rオプションで指定できるリソース名の確認にもなります。

$ terraformer import aws list
accessanalyzer
acm
alb
api_gateway
...

基本的にはピックアップして紹介したもので操作できますが、いろんなオプションに触れておくと良さそうです。

まとめ

今回はTerraformerによる複数リソースの一括terraform importに挑戦してみました。


上記にも述べた通りimportすればすぐに運用開始できると言うものではありませんが、大規模リソースをterraform化する上での第一歩としては有用だと思いました。


来年から気合入れてterraform化に取り組んでいきたいと思います!


最後まで読んでいただきありがとうございました!

AWS,Terraform

Posted by CY