Terraform v1.14.0 の beta がリリースされています。
リリースノートを見てみると、「List Resources」や「terraform query
コマンド」なるものが追加されているようです。
- List Resources: List resources can be defined in
*.tfquery.hcl
files and allow querying and filterting existing infrastructure.- A new Terraform command
terraform query
: Executes list operations against existing infrastructure and displays the results. The command can optionally generate configuration for importing results into Terraform.
どうやらこれらの新機能を使うと Terraform 管理外の既存リソースの一覧を取得したり、それらを一括で import したりできるようです。
というわけで試してみました。
- Terraform v1.14.0-beta1
- AWS Provider v6.14.0
とりあえず AWS プロバイダの設定を作成します。
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "6.14.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
それでは早速 List Resources を試してみます。.tfquery.hcl
という拡張子でファイルを作成し、 list
ブロックを記述します。
以下は aws_instance
リソース (EC2 インスタンス) の一覧を取得する例です。
main.tfquery.hcl
list "aws_instance" "main" {
provider = aws
}
この状態で terraform query
コマンドを実行すると、リージョン内の全ての EC2 インスタンスが出力されます。
出力
list.aws_instance.main account_id=123456789012,id=i-0011223344556677b,region=ap-northeast-1 instance-b
list.aws_instance.main account_id=123456789012,id=i-1122334455667788c,region=ap-northeast-1 instance-c
list.aws_instance.main account_id=123456789012,id=i-2233445566778899a,region=ap-northeast-1 instance-a
list
ブロックには様々なオプションを指定できます。
-
config
ブロック – プロバイダ固有の引数を指定 -
include_resource
– 利用可能な全てのリソース属性を取得 -
limit
– 取得するリソースの最大数を指定 (デフォルト: 100)
詳しくは以下のドキュメントをご参照ください。
以下は config
ブロックを使って、特定のタグが付与された EC2 インスタンスのみを取得する例です。
main.tfquery.hcl
list "aws_instance" "main" {
provider = aws
+ config {
+ filter {
+ name = "tag:Name"
+ values = ["instance-b", "instance-c"]
+ }
+ }
}
出力
list.aws_instance.main account_id=123456789012,id=i-0011223344556677b,region=ap-northeast-1 instance-b
list.aws_instance.main account_id=123456789012,id=i-1122334455667788c,region=ap-northeast-1 instance-c
terraform query
コマンドに -generate-config-out=
フラグを設定すると、取得したリソース一覧に対応する resource
ブロックおよび import
ブロックが自動生成されます。
$ terraform query -generate-config-out=generated.tf
generated.tf
resource "aws_instance" "main_0" {
provider = aws
ami = "ami-08a59875ad2a26a5f"
tags = {
Name = "instance-b"
}
}
import {
to = aws_instance.main_0
provider = aws
identity = {
account_id = "123456789012"
id = "i-0011223344556677b"
region = "ap-northeast-1"
}
}
resource "aws_instance" "main_1" {
provider = aws
ami = "ami-08a59875ad2a26a5f"
tags = {
Name = "instance-c"
}
}
import {
to = aws_instance.main_1
provider = aws
identity = {
account_id = "123456789012"
id = "i-1122334455667788c"
region = "ap-northeast-1"
}
}
resource "aws_instance" "main_2" {
provider = aws
ami = "ami-08a59875ad2a26a5f"
tags = {
Name = "instance-a"
}
}
import {
to = aws_instance.main_2
provider = aws
identity = {
account_id = "123456789012"
id = "i-2233445566778899a"
region = "ap-northeast-1"
}
}
あとは terraform apply
を実行するだけでこれらのリソースが import され、 Terraform 管理下に置かれます。便利。
GoogleCloudPlatform/terraformer みたいなことが公式にできるようになるんですね〜。
Views: 0