如何将手动创建的AWS Glue Crawler导入Terraform状态?
AWS Glue Crawler Terraform导入失败:Cannot import non-existent remote object
问题场景
已通过Terraform模块成功部署AWS Glue Crawler,现在尝试将手动创建的、与tfvars配置完全一致的dynamodb-vw-dashboard-home Crawler导入Terraform状态,执行导入命令后收到错误提示目标对象不存在。
执行的导入命令:
terraform import -var-file=sanbox.tfvars 'module.crawlers.aws_glue_crawler.crawler["dynamodb-vw-dashboard-home"]' arn:aws:glue:us-east-1:xxxxxxxx:crawler/dynamodb-vw-dashboard-home
错误输出:
╷ │ Error: Cannot import non-existent remote object │ │ While attempting to import an existing object to │ "module.crawlers.aws_glue_crawler.crawler[\"dynamodb-vw-dashboard-home\"]", the provider detected that no object │ exists with the given id. Only pre-existing objects can be imported; check that the id is correct and that it is │ associated with the provider's configured region or endpoint, or use "terraform apply" to create a new remote object │ for this resource. ╵
相关配置代码
模块main.tf
resource "aws_glue_crawler" "crawler" { for_each = var.crawler_list database_name = each.value.database_name name = "${each.value.crawler_name}" role = var.crawler_role_arn table_prefix = each.value.table_prefix # 其他配置项(模块已能正常创建Crawler) }
variables.tf
variable "crawler_list" { description = "crawler list" type = map(object({ database_name = string crawler_name = string table_prefix = optional(string, "") s3_target = optional(object({ s3_create_target = optional(bool,false) s3_target_path = optional(string, "") s3_exclusions = optional(list(string),[]) }),{}) dynamodb_target = optional(object({ dynamodb_create_target = optional(bool,false) dynamodb_target_path = optional(string, "") }),{}) jdbc_target = optional(object({ jdbc_create_target = optional(bool,false) jdbc_connection_name = optional(string, "") jdbc_target_path = optional(string, "") jdbc_exclusions = optional(list(string),[]) }),{}) })) default = {} }
根目录main.tf
module "crawlers" { source = "./modules/crawlers" service = var.service crawler_list = var.crawler_list crawler_role_arn = "arn:aws:iam::xxxxxxxxxx:role/role-glue" }
tfvars配置
crawler_list = { dynamodb-aud-load-audit = { database_name = "dm_web" crawler_name = "dynamodb-aud-load-audit" table_prefix = "vw_" dynamodb_target = { dynamodb_create_target = true dynamodb_target_path = "vw_dim_geographies" } } dynamodb-vw-dashboard-home = { database_name = "dm_web" crawler_name = "dynamodb-vw-dashboard-home" dynamodb_target = { dynamodb_create_target = true dynamodb_target_path = "vw_dim_geographies" } } }
排查与解决步骤
1. 验证Crawler的存在性与区域匹配
用AWS CLI直接确认目标Crawler是否存在于指定区域:
aws glue get-crawler --name dynamodb-vw-dashboard-home --region us-east-1
如果返回Crawler的详细信息,说明资源存在;如果报错,检查名称拼写、区域是否与Terraform配置的AWS区域一致。
2. 改用Crawler名称作为导入ID
Terraform的aws_glue_crawler资源支持直接使用Crawler名称而非ARN作为导入ID,修改导入命令:
terraform import -var-file=sanbox.tfvars 'module.crawlers.aws_glue_crawler.crawler["dynamodb-vw-dashboard-home"]' dynamodb-vw-dashboard-home
3. 确认资源映射键的一致性
检查tfvars中crawler_list的键名dynamodb-vw-dashboard-home与导入命令中的索引完全一致,无大小写或拼写错误。
4. 验证AWS凭证权限
确保Terraform使用的AWS凭证拥有glue:GetCrawler权限,避免因权限不足导致无法识别远程资源。
5. 对比手动创建与Terraform配置的细节
逐一核对手动创建的Crawler与Terraform配置的所有属性:
- 角色ARN是否完全匹配
- 数据库名称、表前缀、目标配置是否一致
- 调度规则、额外配置项等是否与模块定义对齐
内容的提问来源于stack exchange,提问作者Leonardo Arango
相关产品推荐
相关产品推荐

