Closed5

terraform import を生成してくれる君

sogaohsogaoh

で、爆誕したのが以下のコード

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周りのやつとか。

sogaohsogaoh

周辺で取り込まないとならないものを洗い出した

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"
}

うひー

sogaohsogaoh
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ヶ月前にクローズされました