AWS S3 存储桶的 Terraform 文件不断收到错误:提供程序配置无效

Lim*_*mbo 1 amazon-s3 amazon-web-services terraform terraform-provider-aws

编辑:我现在已经修改了问题以显示整个 main.tf 文件。

\n

我有一个 Terraform 文件,该文件应该创建一个 AWS S3 存储桶,但每次运行时我不断收到的错误之一terraform plan是:

\n
\xe2\x94\x82 Error: Invalid provider configuration\n\xe2\x94\x82 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.\n
Run Code Online (Sandbox Code Playgroud)\n

main.tf 文件:

\n
terraform {\n    backend  "s3" {\n    region         = "us-east-1"\n    bucket         = "bucketname"\n    key            = "path/terraform.tfstate" \n    dynamodb_table = "tf-state-lock" \n    access_key = "<access_key>"\n    secret_key = "<secret_key"\n    }\n\n    required_providers {\n      aws = {\n        version = " ~> 3.0"\n        source = "registry.terraform.io/hashicorp/aws"\n      }\n    }\n\n} \n\nprovider "aws" {\n  alias  = "east" \n  region = "us-east-1"\n  access_key = "access_key"\n  secret_key = "secret_key"\n}\n\nresource "aws_s3_bucket" "tf-remote-state" {\n  bucket = "bucketname" \n\n  versioning {\n    enabled = true\n  }\n\n  lifecycle {\n    prevent_destroy = true\n  }\n}\n\nresource "aws_dynamodb_table" "dynamodb-tf-state-lock" {\n  name            = "tf-state-lock" \n  hash_key        = "LockID"\n  read_capacity   = 20\n  write_capacity = 20\n\n  attribute {\n    name = "LockID"\n    type = "S"\n  }\n\n  tags = {\n    name = "state lock"\n  }\n} \n
Run Code Online (Sandbox Code Playgroud)\n

我究竟做错了什么?

\n

Mar*_*o E 5

由于您在块中使用alias[1] ,当前设置资源的方式将导致 Terraform 期望您要创建的资源存在provider无别名块:provider

默认情况下,资源使用从资源类型名称的第一个单词推断的默认提供程序配置(没有别名参数的配置)。

换句话说,由于您没有在两个资源块(对于 S3 和 DynamoDB)中指定别名提供程序的名称,Terraform 希望默认使用非别名提供程序配置。由于您没有没有 的提供程序块alias,因此修复它的最简单方法可能是将以下内容添加到两个资源块 [2]:

provider = aws.east
Run Code Online (Sandbox Code Playgroud)

整个块将如下所示:

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果没有任何特殊原因需要使用别名(即无论如何都会在一个区域中创建资源),则仅设置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