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

[2]https://www.terraform.io/language/providers/configuration#selecting-alternate-provider-configurations