vpc-peering
This component is responsible for creating a peering connection between two VPCs existing in different AWS accounts.
Usage
Stack Level: Regional
Here's an example snippet for how to use this component.
Default VPC peering settings for all accounts:
# stacks/catalog/vpc-peering/defaults.yaml
components:
terraform:
vpc-peering/defaults:
settings:
spacelift:
workspace_enabled: true
metadata:
component: vpc-peering
type: abstract
vars:
enabled: true
requester_allow_remote_vpc_dns_resolution: true
accepter_allow_remote_vpc_dns_resolution: true
Use case: Peering v1 accounts to v2
# stacks/catalogs/vpc-peering/ue1-prod.yaml
import:
- catalog/vpc-peering/defaults
components:
terraform:
vpc-peering-use1:
metadata:
component: vpc-peering
inherits:
- vpc-peering/defaults
vars:
accepter_region: us-east-1
accepter_vpc_id: vpc-xyz
accepter_aws_assume_role_arn: arn:aws:iam::<LEGACY ACCOUNT ID>:role/acme-vpc-peering
Use case: Peering v2 accounts to v2
vpc-peering/<stage>-vpc0:
metadata:
component: vpc-peering
inherits:
- vpc-peering/defaults
vars:
requester_vpc_component_name: vpc
accepter_region: us-east-1
accepter_stage_name: <fill-in-with-accepter-stage-name>
accepter_vpc:
tags:
# Fill in with your own information
Name: acme-<tenant>-<environment>-<stage>-<name>
Legacy Account Configuration
The vpc-peering
component peers the dev
, prod
, sandbox
and staging
VPCs to a VPC in the legacy account.
The dev
, prod
, sandbox
and staging
VPCs are the requesters of the VPC peering connection, while the legacy VPC
is the accepter of the peering connection.
To provision VPC peering and all related resources with Terraform, we need the following information from the legacy account:
- Legacy account ID
- Legacy VPC ID
- Legacy AWS region
- Legacy IAM role (the role must be created in the legacy account with permissions to create VPC peering and routes).
The name of the role could be
acme-vpc-peering
and the ARN of the role should look likearn:aws:iam::<LEGACY ACCOUNT ID>:role/acme-vpc-peering
Legacy Account IAM Role
In the legacy account, create IAM role acme-vpc-peering
with the following policy:
NOTE: Replace <LEGACY ACCOUNT ID>
with the ID of the legacy account.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ec2:CreateRoute", "ec2:DeleteRoute"],
"Resource": "arn:aws:ec2:*:<LEGACY ACCOUNT ID>:route-table/*"
},
{
"Effect": "Allow",
"Action": [
"ec2:DescribeVpcPeeringConnections",
"ec2:DescribeVpcs",
"ec2:ModifyVpcPeeringConnectionOptions",
"ec2:DescribeSubnets",
"ec2:DescribeVpcAttribute",
"ec2:DescribeRouteTables"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:AcceptVpcPeeringConnection",
"ec2:DeleteVpcPeeringConnection",
"ec2:CreateVpcPeeringConnection",
"ec2:RejectVpcPeeringConnection"
],
"Resource": [
"arn:aws:ec2:*:<LEGACY ACCOUNT ID>:vpc-peering-connection/*",
"arn:aws:ec2:*:<LEGACY ACCOUNT ID>:vpc/*"
]
},
{
"Effect": "Allow",
"Action": ["ec2:DeleteTags", "ec2:CreateTags"],
"Resource": "arn:aws:ec2:*:<LEGACY ACCOUNT ID>:vpc-peering-connection/*"
}
]
}
Add the following trust policy to the IAM role:
NOTE: Replace <IDENTITY ACCOUNT ID>
with the ID of the identity
account in the new infrastructure.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::<IDENTITY ACCOUNT ID>:root"]
},
"Action": ["sts:AssumeRole", "sts:TagSession"],
"Condition": {}
}
]
}
The trust policy allows the identity
account to assume the role (and provision all the resources in the legacy
account).
Provisioning
Provision the VPC peering connections in the dev
, prod
, sandbox
and staging
accounts by executing the following
commands:
atmos terraform plan vpc-peering -s ue1-sandbox
atmos terraform apply vpc-peering -s ue1-sandbox
atmos terraform plan vpc-peering -s ue1-dev
atmos terraform apply vpc-peering -s ue1-dev
atmos terraform plan vpc-peering -s ue1-staging
atmos terraform apply vpc-peering -s ue1-staging
atmos terraform plan vpc-peering -s ue1-prod
atmos terraform apply vpc-peering -s ue1-prod
Variables
Required Variables
accepter_region
(string
) requiredAccepter AWS region
accepter_vpc
(any
) requiredAccepter VPC map of id, cidr_block, or default arguments for the data source
region
(string
) requiredAWS Region
Optional Variables
accepter_allow_remote_vpc_dns_resolution
(bool
) optionalAllow accepter VPC to resolve public DNS hostnames to private IP addresses when queried from instances in the requester VPC
Default value:
true
accepter_aws_assume_role_arn
(string
) optionalAccepter AWS assume role ARN
Default value:
null
accepter_stage_name
(string
) optionalAccepter stage name if in v1
Default value:
null
add_attribute_tag
(bool
) optionalIf
true
will add additional attribute tag to the requester and accceptor resourcesDefault value:
true
auto_accept
(bool
) optionalAutomatically accept peering request
Default value:
true
requester_allow_remote_vpc_dns_resolution
(bool
) optionalAllow requester VPC to resolve public DNS hostnames to private IP addresses when queried from instances in the accepter VPC
Default value:
true
requester_role_arn
(string
) optionalRequester AWS assume role ARN, if not provided it will be assumed to be the current terraform role.
Default value:
null
requester_vpc_component_name
(string
) optionalRequester vpc component name
Default value:
"vpc"
requester_vpc_id
(string
) optionalRequester VPC ID, if not provided, it will be looked up by component using variable
requester_vpc_component_name
Default value:
null
Context Variables
The following variables are defined in the context.tf
file of this module and part of the terraform-null-label pattern.
context.tf
file of this module and part of the terraform-null-label pattern.Outputs
vpc_peering
VPC peering outputs
Dependencies
Requirements
terraform
, version:>= 1.0.0
aws
, version:>= 3.0
Providers
aws
, version:>= 3.0
Modules
Name | Version | Source | Description |
---|---|---|---|
iam_roles | latest | ../account-map/modules/iam-roles | n/a |
requester_vpc | 1.8.0 | cloudposse/stack-config/yaml//modules/remote-state | n/a |
this | 0.25.0 | cloudposse/label/null | n/a |
vpc_peering | 1.0.0 | cloudposse/vpc-peering-multi-account/aws | n/a |
Resources
The following resources are used by this module:
Data Sources
The following data sources are used by this module:
aws_vpc.accepter
(data source)
- cloudposse/terraform-aws-components - Cloud Posse's upstream component