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

Max*_*is4 0 amazon-web-services terraform terraform-provider-aws

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

\n
\n

\xe2\x95\xb7 \xe2\x94\x82 错误: 无法查询可用的提供程序包 \xe2\x94\x82 \xe2\x94\x82 无法\n检索提供程序 hashicorp/s3 的可用版本列表:\n提供程序注册表registry.terraform.io 没有名为\n\xe2\x94\x82 的提供程序registry.terraform.io/hashicorp/s3 \xe2\x94\x82 \xe2\x94\x82 所有模块都应指定\n其 required_providers,以便外部消费者在使用模块时将获得\n正确的提供者。要查看 \xe2\x94\x82 当前依赖于 hashicorp/s3 的模块,请运行以下命令: \xe2\x94\x82
\nterraformproviders

\n
\n

进行一些挖掘似乎 terraform 正在寻找模块registry.terraform.io/hashicorp/s3,该模块不存在。

\n

到目前为止,我已经尝试了以下方法:

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

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

\n
\n

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

\n
\n

我有点想知道可能出了什么问题。下面是我的 version.tf 的副本,我根据我关注的另一篇文章从providers.tf 更改了它:

\n

版本.tf

\n
# Configure the AWS Provider\nprovider "aws" {\n  region            = "us-east-1"\n  use_fips_endpoint = true\n}\n\n\nterraform {\n  required_providers {\n    aws = {\n      source  = "hashicorp/aws"\n      version = ">= 4.9.0"\n    }\n\n    local = {\n      source  = "hashicorp/local"\n      version = "~> 2.2.1"\n\n    }\n  }\n\n  required_version = ">= 1.2.0" #required terraform version\n}\n
Run Code Online (Sandbox Code Playgroud)\n

S3 模块\n我没有包含局部变量、输出或变量,除非有人认为我们需要查看它们。正如我之前所说,该模块直到今天都正常运行。希望这就是您解决提供商问题所需的全部内容。如果需要其他文件,请告诉我。

\n
resource "aws_s3_bucket" "buckets" {\n  count         = length(var.bucket_names)\n  bucket        = lower(replace(replace("${var.bucket_names[count.index]}-s3", " ", "-"), "_", "-"))\n  force_destroy = var.bucket_destroy\n  tags          = local.all_tags\n}\n\n# Set Public Access Block for each bucket\nresource "aws_s3_bucket_public_access_block" "bucket_public_access_block" {\n  count                   = length(var.bucket_names)\n  bucket                  = aws_s3_bucket.buckets[count.index].id\n  block_public_acls       = var.bucket_block_public_acls\n  ignore_public_acls      = var.bucket_ignore_public_acls\n  block_public_policy     = var.bucket_block_public_policy\n  restrict_public_buckets = var.bucket_restrict_public_buckets\n}\n\nresource "aws_s3_bucket_acl" "bucket_acl" {\n  count  = length(var.bucket_names)\n  bucket = aws_s3_bucket.buckets[count.index].id\n  acl    = var.bucket_acl\n}\n\nresource "aws_s3_bucket_versioning" "bucket_versioning" {\n  count  = length(var.bucket_names)\n  bucket = aws_s3_bucket.buckets[count.index].id\n  versioning_configuration {\n    status = "Enabled"\n  }\n}\n\nresource "aws_s3_bucket_lifecycle_configuration" "bucket_lifecycle_rule" {\n  count  = length(var.bucket_names)\n  bucket = aws_s3_bucket.buckets[count.index].id\n  rule {\n    id = "${var.bucket_names[count.index]}-lifecycle-${count.index}"\n    status = "Enabled"\n    expiration {\n      days = var.bucket_backup_expiration_days\n    }\n       \n    transition {\n      days          = var.bucket_backup_days\n      storage_class = "GLACIER"\n    }\n  }\n}\n\n# AWS KMS Key Server Encryption\nresource "aws_s3_bucket_server_side_encryption_configuration" "bucket_encryption" {\n  count  = length(var.bucket_names)\n  bucket = aws_s3_bucket.buckets[count.index].id\n  rule {\n    apply_server_side_encryption_by_default {\n      kms_master_key_id = aws_kms_key.bucket_key[count.index].arn\n      sse_algorithm     = var.bucket_sse\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Mar*_*ins 5

尽管您没有将其包含在您的问题中,但我猜测在这个 Terraform 模块的其他地方您有一个像这样的块:

resource "s3_bucket" "example" {

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

resource "aws_s3_bucket" "example" {

}
Run Code Online (Sandbox Code Playgroud)

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