繁体   English   中英

Terraform 提供商问题:registry.terraform.io/hashicorp/s3

[英]Terraform Provider issue: registry.terraform.io/hashicorp/s3

我目前有一段时间一直在安静使用的代码,它调用自定义 S3 模块。 今天我尝试运行相同的代码,但我开始收到有关提供程序的错误。

╷ │ 错误:无法查询可用的提供程序包 │ │ 无法检索提供程序 hashicorp/s3 的可用版本列表:提供程序注册表 registry.terraform.io 没有名为 │ registry.terraform.io/hashicorp/s3 的提供程序 │ │ 所有模块应该指定它们的 required_providers 以便外部消费者在使用模块时能够获得正确的提供者。 要查看哪些模块 │ 当前依赖于 hashicorp/s3,请运行以下命令:│
terraform 供应商

做一些挖掘似乎 terraform 正在寻找一个模块registry.terraform.io/hashicorp/s3 ,它不存在。

到目前为止,我已经尝试了以下事情:

  • 验证 S3 资源代码符合 Hashicorp 今年升级到 4.x 的标准。 另外,我已经使用它几个月了,没有任何问题。
  • 删除.terraform目录,重新运行terraform init(没有成功同样的错误)
  • 删除.terraform 目录和.terraform.hcl 锁定并运行 terraform init -upgrade (No Success)
  • 我已尝试更新我的提供商的文件以尝试强制升级(未成功)
  • 我试图将提供程序更改为 >= 当前版本以拉取最新版本但没有成功

进一步阅读,它指的是 terraform 模块的缓存问题。 我尝试运行terraform providers lock并收到此错误。

错误:无法检索用于锁定的提供程序 │ Terraform 无法获取 darwin_amd64 的请求提供程序以计算其校验和:无法安装某些提供程序:│ - registry.terraform.io/hashicorp/s3:提供程序注册表 registry.terraform.io没有名为 registry.terraform.io/hashicorp/s3 的提供程序。

有点在我的智慧可能是错的。 下面是我的 version.tf 的副本,我根据我关注的另一篇文章从 providers.tf 更改而来:

版本.tf

# Configure the AWS Provider
provider "aws" {
  region            = "us-east-1"
  use_fips_endpoint = true
}


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

    local = {
      source  = "hashicorp/local"
      version = "~> 2.2.1"

    }
  }

  required_version = ">= 1.2.0" #required terraform version
}

S3 模块我不包括局部变量、输出或变量,除非有人认为我们需要看到它们。 正如我之前所说,该模块直到今天都在正常运行。 希望这就是提供商问题所需的全部内容。 让我知道是否需要其他文件。

resource "aws_s3_bucket" "buckets" {
  count         = length(var.bucket_names)
  bucket        = lower(replace(replace("${var.bucket_names[count.index]}-s3", " ", "-"), "_", "-"))
  force_destroy = var.bucket_destroy
  tags          = local.all_tags
}

# Set Public Access Block for each bucket
resource "aws_s3_bucket_public_access_block" "bucket_public_access_block" {
  count                   = length(var.bucket_names)
  bucket                  = aws_s3_bucket.buckets[count.index].id
  block_public_acls       = var.bucket_block_public_acls
  ignore_public_acls      = var.bucket_ignore_public_acls
  block_public_policy     = var.bucket_block_public_policy
  restrict_public_buckets = var.bucket_restrict_public_buckets
}

resource "aws_s3_bucket_acl" "bucket_acl" {
  count  = length(var.bucket_names)
  bucket = aws_s3_bucket.buckets[count.index].id
  acl    = var.bucket_acl
}

resource "aws_s3_bucket_versioning" "bucket_versioning" {
  count  = length(var.bucket_names)
  bucket = aws_s3_bucket.buckets[count.index].id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_lifecycle_configuration" "bucket_lifecycle_rule" {
  count  = length(var.bucket_names)
  bucket = aws_s3_bucket.buckets[count.index].id
  rule {
    id = "${var.bucket_names[count.index]}-lifecycle-${count.index}"
    status = "Enabled"
    expiration {
      days = var.bucket_backup_expiration_days
    }
       
    transition {
      days          = var.bucket_backup_days
      storage_class = "GLACIER"
    }
  }
}

# AWS KMS Key Server Encryption
resource "aws_s3_bucket_server_side_encryption_configuration" "bucket_encryption" {
  count  = length(var.bucket_names)
  bucket = aws_s3_bucket.buckets[count.index].id
  rule {
    apply_server_side_encryption_by_default {
      kms_master_key_id = aws_kms_key.bucket_key[count.index].arn
      sse_algorithm     = var.bucket_sse
    }
  }
}

寻找我可以用来解决这个问题的任何其他想法。 谢谢你!!

虽然你没有把它包含在你的问题中,但我猜你在这个 Terraform 模块的其他地方有一个这样的块:

resource "s3_bucket" "example" {

}

为了与为 Terraform 的旧版本编写的模块向后兼容, terraform init有一些启发式方法,可以在遇到不属于模块的required_providers块中的提供程序之一的资源时猜测提供程序的意图。 默认情况下,通过将资源类型名称的前缀(在本例中为s3 )与required_providers块中选择的本地名称相匹配,资源“属于”提供者。

给定一个像上面这样的资源块, terraform init会注意到required_providers没有条目s3 = {... }因此会猜测这是一个旧模块,试图使用一个名为“s3”的假想遗留官方提供者(现在称为hashicorp/s3 ,因为官方提供者始终属于hashicorp/命名空间)。

这种资源类型的正确名称是aws_s3_bucket ,因此在声明这种类型的资源时包含aws_前缀很重要:

resource "aws_s3_bucket" "example" {

}

此资源现在默认与提供程序本地名称“aws”相关联,它确实与您的required_providers块中的条目之一匹配,因此terraform init将看到您打算使用hashicorp/aws来处理此资源。

我和我的同事终于找到了问题所在。 事实证明,我们对 S3 存储桶进行了数据调用。 该模块没有任何问题,但我调用该模块的地方有一个 local.tf 操作,我在其中以旧格式调用 s3,请参见下面的更改:

曾是

data "s3_bucket" "MyResource" {} 

data "aws_s3_bucket" "MyResource" {}

感谢大家的回应。 资源是问题的根源,但忘记了数据也是要检查的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM