[英]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 ,它不存在。
到目前为止,我已经尝试了以下事情:
进一步阅读,它指的是 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.