terraform 可以简单地用于在不同的 AWS 区域创建资源吗?

can terraform be used simply to create resources in different AWS regions?

我有以下 deploy.tf 文件:

provider "aws" {
  region          = "us-east-1"
}

provider "aws" {
  alias           = "us_west_1"
  region          = "us-west-2"
}

resource "aws_us_east_1" "my_test" {
  # provider        = "aws.us_east_1"
  count           = 1
  ami             = "ami-0820..."
  instance_type   = "t2.micro"
}

resource "aws_us_west_1" "my_test" {
  provider        = "aws.us_west_1"
  count           = 1
  ami             = "ami-0d74..."
  instance_type   = "t2.micro"
}

我正在尝试使用它来部署 2 台服务器,每个区域一台。我不断收到如下错误:

aws_us_east_1.narc_test: Provider doesn't support resource: aws_us_east_1

我已经尝试为两个提供程序块设置别名,并以多种不同方式引用正确的区域。我已经阅读了多区域支持,一些答案表明这可以通过模块来完成,但是,这是一个简单的测试,我想保持简单。目前可以吗?

是的,即使在一个文件中,它也可以用于在不同区域创建资源。您的测试场景无需使用模块。

您的错误可能是由打字错误引起的。如果你想启动一个 ec2 实例,你想创建的资源是 aws_instance 而不是 aws_us_west_1aws_us_east_1

果然 Terraform 不知道这种资源,因为它根本不存在。将其更改为 aws_instance 就可以开始了!此外,您可能应该以不同的方式命名它们,以避免对两种资源使用 my_test 进行双重命名。

步骤 1

在要执行地形规划的 main.tf 文件中添加区域别名。

provider "aws" {
  region = "eu-west-1"
  alias = "main"
}
    
provider "aws" {
  region = "us-east-1"
  alias = "useast1"
}

步骤 2

在模块定义块中添加 providers

module "lambda_edge_rule" {
  providers = {
    aws = aws.useast1
  }
  source            = "../../../terraform_modules/lambda"
  tags              = var.tags
}

步骤 3

在模块中将“aws”定义为 providers。 ( 来源 = ../../../terraform_modules/lambda")

terraform {
    required_providers {
    aws = {
          source  = "hashicorp/aws"
          version = ">= 2.7.0"
        }
      }
    }
    
resource "aws_lambda_function" "lambda" {
  function_name     = "blablabla"
    .
    .
    .
    .
    .
    .
    .
}

注意: Terraform 版本 v1.0.5 截至目前。