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

dom*_*ato 2 amazon-web-services terraform 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"
}
Run Code Online (Sandbox Code Playgroud)

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

aws_us_east_1.narc_test: Provider doesn't support resource: aws_us_east_1
Run Code Online (Sandbox Code Playgroud)

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

p0f*_*0fi 9

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

您的错误可能是由拼写错误引起的。如果要启动 ec2 实例,则要创建的资源是aws_instanceand not aws_us_west_1or aws_us_east_1

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


Dus*_*ghe 7

步骤1

在要执行 terraform 计划的 main.tf 文件中添加区域别名。

provider "aws" {
  region = "eu-west-1"
  alias = "main"
}
    
provider "aws" {
  region = "us-east-1"
  alias = "useast1"
}
Run Code Online (Sandbox Code Playgroud)

第2步

providers在模块定义块中添加块

module "lambda_edge_rule" {
  providers = {
    aws = aws.useast1
  }
  source            = "../../../terraform_modules/lambda"
  tags              = var.tags
}
Run Code Online (Sandbox Code Playgroud)

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

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