因此,我们在我们的组织中广泛使用terraform,我对其他人如何进行VPC对等有一些疑问。连接的初始创建非常简单。我们从刚刚创建的VPC拉入并引用另一个VPC,然后它填充路由表等。问题出在我们刚才看到的VPC上。现在,我们必须手动转到另一个网络堆栈,并手动添加CIDR/PCX id作为变量。我写了一个脚本,可以让我们更轻松地处理这个问题,但我想问一下,是否有人在AWS上动态查找任何现有的VPC,并自动将现有的PCX添加到该VPC的路由表中。
在运维VPC中就是一个很有价值的例子。我们有OPS,然后是dev、prod、qa、stg、uat、cte等。因此,当我们创建CTE vpc时,它会自动创建pcx,并将其链接到运维和路由到运维。然而,ops并不知道这个新的pcx。所以我们必须手动添加它。我希望运维能够自己执行资源查找,并为找到的任何新VPC/PCX配置自己的资源。
TLDR;双向VPC对等更具动态性的方法
发布于 2017-02-19 05:30:21
假设您正在使用remote state backend,您可以将运维网络堆栈作为remote state data source,然后从您希望它能够路由到的任何临时堆栈中对其路由表进行更改。
我会试着做一个最小的例子(显然缺少很多样板):
# my_ops_stack.tf
provider "aws" {
region = "eu-west-1"
}
module "ops_stack" {
source = "/my/modules/ops_stack"
cidr = "10.1.0.0/16"
// other vars probably
}
// the outputs which will be accessible
// via the remote state data source:
output "routing_table_id" {
value = "${module.ops_stack.routing_table_id}"
}
output "vpc_id" {
value = "${module.ops_stack.vpc_id}"
}
output "vpc_cidr" {
value = "10.1.0.0/16"
}
现在我将使用terraform cli (this will soon be possible in config)为这个堆栈configure一个远程状态后端:
# Run in the same folder as my_ops_stack.tf
terraform remote config \
-backend=s3 \
-backend-config="bucket=my-state-bucket" \
-backend-config="key=ops-stack/terraform.tfstate" \
-backend-config="region=eu-west-1"
现在状态后端已配置,您应用于堆栈的任何更改都将同步到该后端:
terraform apply
# the usual stuff... but now synced with s3!
现在,在新的临时堆栈(dev、prod、qa、stg、uat、cte等)的模板中:
# my_dev_stack.tf
provider "aws" {
region = "eu-west-1"
}
// Pull in your ops stack from the remote backend:
data "terraform_remote_state" "ops_stack" {
backend = "s3"
config {
bucket = "my-state-bucket"
key = "ops-stack/terraform.tfstate"
region = "eu-west-1"
}
}
// Create your dev stack
module "dev_stack" {
source = "/my/modules/dev_stack"
cidr = "10.2.0.0/16"
// The ops_stack vpc id for creating the peering connection:
ops_vpc_id = "${data.terraform_remote_state.ops_stack.vpc_id}"
// Maybe some security group rules you wanna setup
allow_access_from = "${data.terraform_remote_state.ops_stack.vpc_cidr}"
// other vars probably
}
// And use its outputs to add a route to the
// ops vpc routing table from the dev stack!
resource "aws_route" "ops_to_dev" {
route_table_id = "${data.terraform_remote_state.ops_stack.routing_table_id}"
destination_cidr_block = "10.2.0.0/16" // dev_stack's cidr
vpc_peering_connection_id = "${module.dev_stack.vpcx_id}"
}
一旦你完成了临时堆栈,你就可以安全地销毁它,它甚至会清理它在操作堆栈中的路由。
希望这就是你想要的!
发布于 2017-01-28 02:56:58
我们最终只是围绕这一点编写了一个包装器脚本。每当我们添加新的VPC时,我们都会转到ops VPC目录并执行此脚本,它将使用所有必要的变量动态填充variables.tf文件,以设置OPS vpc对等连接/路由。
示例脚本:
#!/bin/bash
region=$(find . -name "*vars.tf"|cut -d/ -f2|cut -d- -f1-3)
profile=$(find . -name "*vars.tf" -exec grep 'variable "profile"' {} \; |awk '{print $6}'|tr -d '"')
account=$(pwd|cut -d/ -f5|cut -d- -f1)
getData(){
for id in ${ids[@]}; do
output=$(aws ec2 describe-vpc-peering-connections --region $region --profile $account --vpc-peering-connection-ids $id)
cidr=$(echo "$output"|jq '.VpcPeeringConnections[].RequesterVpcInfo.CidrBlock'|tr -d '"')
if [[ $1 == cidr ]]; then
echo $cidr
elif [[ $1 == id ]]; then
echo $id
fi
done
}
checkOps() {
pwd|grep 'ops' &>/dev/null
}
populateRoutes() {
if ! checkOps; then
echo "Must be run from the ops directory"
exit 1
fi
ids=($(aws ec2 describe-vpc-peering-connections --region $region --profile $account --filters "Name=status-code,Values=active"|jq '.VpcPeeringConnections[].VpcPeeringConnectionId'|tr -d '"'))
if (( ${#ids[@]} == 0 )); then
echo "No update necessary"
exit 0
fi
cidr_list=($(getData cidr))
cidr_format=$(echo "${cidr_list[@]}"|tr ' ' ',')
echo $cidr_format
id_list=($(getData id))
id_format=$(echo "${id_list[@]}"|tr ' ' ',')
echo $id_format
if (( ${#cidr_list[@]} != ${#id_list[@]} )); then
echo "CIDR List and ID List do not match"
exit 1
fi
sed -i "/pcx_count/c\variable\ \"pcx_count\"\ \{\ default \=\ \"${#ids[@]}\" \}" ./variables.tf
sed -i "/ops_cidrs/c\variable\ \"ops_cidrs\"\ \{\ default\ \=\ \"$cidr_format\"\ \}" ./variables.tf
sed -i "/pcx_ids/c\variable\ \"pcx_ids\"\ \{\ default\ \=\ \"$id_format\"\ \}" ./variables.tf
}
populateRoutes
发布于 2018-10-09 23:40:26
我也对执行自动化部分感兴趣,当我们提供一些标准时,terraform会自动接受对等请求(主要集中在账户间VPC对等)。我相信为待处理的vpc对等请求创建查找资源是相当容易的。使用aws cli,这是可以通过像aws ec2 describe-vpc-peering-connections
这样的东西,通过一些过滤器,比如--filter Name=status-code,Values=pending-acceptance
,但不幸的是,我没有看到terraform提供这样的资源。我最初的想法是查找挂起的对等请求,并接受具有特定条件的请求: requester_account_id、requester_vpc_id、accepter_vpc_id。到目前为止,唯一的办法是要么手动接受对等请求,要么手动向aws_vpc_peering_connection_accepter
提供对等请求ID
https://stackoverflow.com/questions/41818231
复制相似问题