我正在构建需要与两个不同的AWS帐户进行通信的代码,文档说这应该起作用。这在0.11.14下工作
主要是在我的provider.tf文件中:
provider "aws" {
alias = "ca-central-1"
region = "ca-central-1"
profile = var.aws_profile
}
provider "aws" {
alias = "other-ca-central-1"
region = "ca-central-1"
profile = var.aws_other_profile
}
(这些变量在我的凭据文件中设置了正确的配置文件。)
在根目录中,在调用模块的代码中,
module "obfuscated" {
source = "./modules/obfuscated"
providers = {
aws.main = "aws.ca-central-1"
aws.other = "aws.other-ca-central-1"
}
#other stuff
}
在./modules/obfuscated/main.tf中,我有
provider "aws" {
alias = "main"
}
provider "aws" {
alias = "other"
}
文档中所说的是一个占位符,只能为空或具有别名。没有它,它会抱怨提供者不存在。 但是有了它,它抱怨我没有指定与文档冲突的区域。
文档肯定不会错,不,那不可能。.帮助我obi-wan-overflow ..
答案 0 :(得分:0)
我也遇到了同样的问题,只是扮演了一个角色。因此,就我而言,我提供了要使用的角色。在模块目录中,例如 my_module ,我在提供程序中有一个tf文件。在块提供程序内部,我有这个:
variable "role_arn" {}
provider "aws" {
alias = "first"
region = "eu-west-1"
version = "2.24.0"
assume_role {
role_arn = "${var.role_arn}"
}
}
例如,在my_module目录中的tf文件中,使用提供程序来创建EC2实例,
resource "aws_instance" "my_instance" {
[...]
provider = "aws.first"
}
在我项目的根目录中,我有这个:
module "using_my_module" {
source = "modules/my_module"
role_arn = "arn:aws:iam::123456789012:role/role_to_assume"
}
我承认这是一种技术性解决方法,因此它看上去可能很难看,但对我有用!
我希望它能对您有所帮助!
答案 1 :(得分:0)
以下是我如何处理此问题的示例
#af-south-1
data aws_vpcs af-south-1 {
provider = aws.af-south-1
}
module af-south-1 {
source = "./modules/flow_log"
providers = {
aws = aws.af-south-1
}
iam_role_arn = aws_iam_role.vpc_flow_log.arn
log_destination = aws_s3_bucket.vpc_flow_log.arn
log_destination_type = "s3"
traffic_type = "REJECT"
aws_vpc_ids = data.aws_vpcs.af-south-1.ids
depends_on = [ aws_s3_bucket.vpc_flow_log ]
}
#ap-east-1
data aws_vpcs ap-east-1 {
provider = aws.ap-east-1
}
module ap-east-1 {
source = "./modules/flow_log"
providers = {
aws = aws.ap-east-1
}
iam_role_arn = aws_iam_role.vpc_flow_log.arn
log_destination = aws_s3_bucket.vpc_flow_log.arn
log_destination_type = "s3"
traffic_type = "REJECT"
depends_on = [ aws_s3_bucket.vpc_flow_log ]
aws_vpc_ids = data.aws_vpcs.ap-east-1.ids
}
#ap-northeast-1
data aws_vpcs ap-northeast-1 {
provider = aws.ap-northeast-1
}
....
在此示例中,我为每个提供者区域创建一个数据源aws_vpcs
。然后,我将每个区域的ID列表传递到模块中。此时,除非使用默认提供程序,否则必须指定要使用的模块的提供程序。
答案 2 :(得分:0)
主要问题可能是您试图将提供者值作为字符串传递,而不是对实际提供者的引用。 "aws.<alias>"
vs aws.<alias>
我可能错了,但我认为您需要在模块 required_providers
块中包含 terraform
。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 2.7.0"
}
}
}
然后您可以使用一个空的 provider
或一个带有 alias
的将提供程序声明为要在模块 providers
配置中传递的必需项。