Max*_*is4 0 amazon-web-services terraform terraform-provider-aws
我目前有一段代码,我一直在安静地使用它,该代码调用自定义 S3 模块。今天,我尝试运行相同的代码,但开始收到有关提供程序的错误。
\n\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
\n
\nterraformproviders
进行一些挖掘似乎 terraform 正在寻找模块registry.terraform.io/hashicorp/s3,该模块不存在。
\n到目前为止,我已经尝试了以下方法:
\n进一步阅读,它指的是 terraform 模块的缓存问题。我尝试运行terraformproviderslock并收到此错误。
\n\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
我有点想知道可能出了什么问题。下面是我的 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}\nRun Code Online (Sandbox Code Playgroud)\nS3 模块\n我没有包含局部变量、输出或变量,除非有人认为我们需要查看它们。正如我之前所说,该模块直到今天都正常运行。希望这就是您解决提供商问题所需的全部内容。如果需要其他文件,请告诉我。
\nresource "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}\nRun Code Online (Sandbox Code Playgroud)\n寻找我可以用来解决此问题的任何其他想法。谢谢你!!
\n尽管您没有将其包含在您的问题中,但我猜测在这个 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处理该资源。
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |