Terraform file for AWS S3 bucket keeps getting Error: Invalid provider configuration
Terraform file for AWS S3 bucket keeps getting Error: Invalid provider configuration
编辑:我现在修改了问题以显示整个 main.tf 文件。
我有一个应该创建 AWS S3 存储桶的 Terraform 文件,但我每次 运行 terraform plan
时都会遇到的错误之一是:
│ Error: Invalid provider configuration
│ Provider "registry.terraform.io/hashicorp/aws" requires explicit configuration. Add a provider block to the root module and configure the provider's required arguments as described in the provider documentation.
main.tf 文件:
terraform {
backend "s3" {
region = "us-east-1"
bucket = "bucketname"
key = "path/terraform.tfstate"
dynamodb_table = "tf-state-lock"
access_key = "<access_key>"
secret_key = "<secret_key"
}
required_providers {
aws = {
version = " ~> 3.0"
source = "registry.terraform.io/hashicorp/aws"
}
}
}
provider "aws" {
alias = "east"
region = "us-east-1"
access_key = "access_key"
secret_key = "secret_key"
}
resource "aws_s3_bucket" "tf-remote-state" {
bucket = "bucketname"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
resource "aws_dynamodb_table" "dynamodb-tf-state-lock" {
name = "tf-state-lock"
hash_key = "LockID"
read_capacity = 20
write_capacity = 20
attribute {
name = "LockID"
type = "S"
}
tags = {
name = "state lock"
}
}
我做错了什么?
由于您在 provider
块中使用 alias
[1],当前设置资源的方式将导致 Terraform 期望 un-aliased provider
块为您要创建的资源而存在:
By default, resources use a default provider configuration (one without an alias argument) inferred from the first word of the resource type name.
换句话说,由于您没有在两个资源块(对于 S3 和 DynamoDB)中指定别名提供程序的名称,Terraform 默认情况下希望使用 un-aliased 提供程序配置。由于您没有没有 alias
的提供程序块,可能最简单的修复方法是将以下内容添加到两个资源块 [2]:
provider = aws.east
整个块看起来像这样:
resource "aws_s3_bucket" "tf-remote-state" {
provider = aws.east
bucket = "bucketname"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
resource "aws_dynamodb_table" "dynamodb-tf-state-lock" {
provider = aws.east
name = "tf-state-lock"
hash_key = "LockID"
read_capacity = 20
write_capacity = 20
attribute {
name = "LockID"
type = "S"
}
tags = {
name = "state lock"
}
}
但是,如果没有任何特殊原因需要使用别名(即无论如何都会在一个区域中创建资源),则仅设置 region
(就像您已经做的那样)也可以解决问题.如果您不想使用别名,只需将 alias = "east"
从 provider
块中删除,然后您就不必更改资源块中的任何内容,代码将按原样运行。
[1] https://www.terraform.io/language/providers/configuration#alias-multiple-provider-configurations
编辑:我现在修改了问题以显示整个 main.tf 文件。
我有一个应该创建 AWS S3 存储桶的 Terraform 文件,但我每次 运行 terraform plan
时都会遇到的错误之一是:
│ Error: Invalid provider configuration
│ Provider "registry.terraform.io/hashicorp/aws" requires explicit configuration. Add a provider block to the root module and configure the provider's required arguments as described in the provider documentation.
main.tf 文件:
terraform {
backend "s3" {
region = "us-east-1"
bucket = "bucketname"
key = "path/terraform.tfstate"
dynamodb_table = "tf-state-lock"
access_key = "<access_key>"
secret_key = "<secret_key"
}
required_providers {
aws = {
version = " ~> 3.0"
source = "registry.terraform.io/hashicorp/aws"
}
}
}
provider "aws" {
alias = "east"
region = "us-east-1"
access_key = "access_key"
secret_key = "secret_key"
}
resource "aws_s3_bucket" "tf-remote-state" {
bucket = "bucketname"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
resource "aws_dynamodb_table" "dynamodb-tf-state-lock" {
name = "tf-state-lock"
hash_key = "LockID"
read_capacity = 20
write_capacity = 20
attribute {
name = "LockID"
type = "S"
}
tags = {
name = "state lock"
}
}
我做错了什么?
由于您在 provider
块中使用 alias
[1],当前设置资源的方式将导致 Terraform 期望 un-aliased provider
块为您要创建的资源而存在:
By default, resources use a default provider configuration (one without an alias argument) inferred from the first word of the resource type name.
换句话说,由于您没有在两个资源块(对于 S3 和 DynamoDB)中指定别名提供程序的名称,Terraform 默认情况下希望使用 un-aliased 提供程序配置。由于您没有没有 alias
的提供程序块,可能最简单的修复方法是将以下内容添加到两个资源块 [2]:
provider = aws.east
整个块看起来像这样:
resource "aws_s3_bucket" "tf-remote-state" {
provider = aws.east
bucket = "bucketname"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
resource "aws_dynamodb_table" "dynamodb-tf-state-lock" {
provider = aws.east
name = "tf-state-lock"
hash_key = "LockID"
read_capacity = 20
write_capacity = 20
attribute {
name = "LockID"
type = "S"
}
tags = {
name = "state lock"
}
}
但是,如果没有任何特殊原因需要使用别名(即无论如何都会在一个区域中创建资源),则仅设置 region
(就像您已经做的那样)也可以解决问题.如果您不想使用别名,只需将 alias = "east"
从 provider
块中删除,然后您就不必更改资源块中的任何内容,代码将按原样运行。
[1] https://www.terraform.io/language/providers/configuration#alias-multiple-provider-configurations