Closed5
terraform import を生成してくれる君
後で記事にまとめようとは思うのですが、↓あたりの話を実践に移してみている。
で、爆誕したのが以下のコード
generate-import.tf
generate-import.tf
# S3バケット名をCSVファイルから読み込む
variable "s3_bucket_file" {
type = string
default = "s3_bucket_names.csv" # CSVファイルのパス
}
# CSVからリストを作成し、バケット名リストを取得
locals {
s3_bucket_names = csvdecode(file(var.s3_bucket_file))
s3_bucket_names_list = [for bucket in local.s3_bucket_names : bucket.name] # CSVに"name"という列があると仮定
# ハイフンをアンダースコアに置換する
bucket_resource_names = {
for name in local.s3_bucket_names_list :
name => replace(name, "-", "_")
}
# インポートコマンドのテンプレート
import_commands = [
for name in local.s3_bucket_names_list :
"terraform import aws_s3_bucket.${local.bucket_resource_names[name]} ${name}"
]
}
# インポートコマンドの出力
output "import_s3_buckets" {
value = join("\n", local.import_commands)
}
# importブロックの生成
output "import_blocks" {
value = join("\n", [
for name in local.s3_bucket_names_list :
<<EOF
import {
to = aws_s3_bucket.${local.bucket_resource_names[name]}
id = "${name}"
}
EOF
])
}
- s3_bucket_names.csv の中身は非公開とさせてください
- provider とか、そのあたりは適宜足してください
準備できたら、terraform init
-> terraform plan
Outputs を見て、全俺が泣いた(前回知ってればー)
まだ、周辺で取り込まないとならないものはあるだろうけど。acl周りのやつとか。
なお、template は非推奨らしい。
周辺で取り込まないとならないものを洗い出した
refs https://github.com/terraform-aws-modules/terraform-aws-s3-bucket/blob/master/main.tf
こんだけありそう
import {
to = aws_s3_bucket_acl.example
id = "bucket-name,private"
}
import {
to = aws_s3_bucket_versioning.example
id = "bucket-name"
}
import {
to = aws_s3_bucket_server_side_encryption_configuration.example
id = "bucket-name"
}
import {
to = aws_s3_bucket_logging.example
id = "bucket-name"
}
import {
to = aws_s3_bucket_public_access_block.example
id = "my-bucket"
}
import {
to = aws_s3_bucket_ownership_controls.example
id = "my-bucket"
}
import {
to = aws_s3_bucket_lifecycle_configuration.example
id = "bucket-name"
}
import {
to = aws_s3_bucket_website_configuration.example
id = "bucket-name"
}
うひー
aws_cloudwatch_log_group 版
genarate-impot-cwlogs.tf
# リソース名をCSVファイルから読み込む
variable "names_file" {
type = string
default = "names.csv" # CSVファイルのパス
}
# CSVからリストを作成し、バケット名リストを取得
locals {
resource_names = csvdecode(file(var.names_file))
resource_names_list = [for res in local.resource_names : res.name] # CSVに"name"という列があると仮定
# スラッシュをダブルアンダースコアに、ドットを_dot_に、ハイフンをアンダースコアに置換する
adjusted_resource_names = {
for name in local.resource_names_list :
name => replace(replace(replace(name, "/", "__"), ".", "_dot_"), "-", "_")
}
# インポートコマンドのテンプレート
import_commands = [
for name in local.resource_names_list :
"terraform import aws_cloudwatch_log_group.${local.adjusted_resource_names[name]} \"${name}\""
]
}
# インポートコマンドの出力
output "import_resources" {
value = join("\n", local.import_commands)
}
# importブロックの生成
output "import_blocks" {
value = join("", [
for name in local.resource_names_list :
<<EOF
import {
to = aws_cloudwatch_log_group.${local.adjusted_resource_names[name]}
id = "${name}"
}
EOF
])
}
このスクラップは4ヶ月前にクローズされました