如何解决 AWS CloudFormation 中的“Vpc 对等连接无法保持稳定”错误?

上次更新时间:2020 年 10 月 15 日

当我尝试在接受方 VPC 和请求方 VPC 之间创建 Amazon Virtual Private Cloud (Amazon VPC) 对等连接时,我在 AWS CloudFormation 中收到了一条“Vpc 对等连接无法保持稳定”错误。

简短描述

您可能收到此错误的原因如下:

  • 您的 AWS::EC2::VPCPeeringConnection 资源是在接受方账户中创建的。
  • IPv4 CIDR 范围重叠。
  • 您在不同账户中的 VPC 之间创建 VPC 对等连接时,PeerRoleArn 属性未正确传送。
  • 接受方账户中的 AWS Identity and Access Management (IAM) 角色不拥有正确的权限。
  • 您在不同 AWS 区域的 VPC 之间创建 VPC 对等连接时,PeerRegion 属性未正确传送。

解决方法

如果您的 AWS::EC2::VPCPeeringConnection 资源是在接受方账户中创建的

使用请求方账户而不是接受方账户中的 AWS::EC2::VPCPeeringConnection 资源创建 AWS CloudFormation 堆栈。

如果 IPv4 CIDR 范围重叠

为接受方账户和请求方账户中的 VPC 使用不同的 IPv4 CIDR 块。

如果您在不同账户中的 VPC 之间创建 VPC 对等连接时,PeerRoleArn 属性未正确传送

如果您在不同账户的 VPC 之间创建 VPC 对等连接,则须在 AWS CloudFormation 模板中使用 PeerRoleArn 属性来传送来自接受方账户的跨账户 IAM 角色。有关更多信息,请参阅 AWS::EC2::VPCPeeringConnection。请参阅以下 JSON 和 YAML 示例:

JSON:

{
    "myVPCPeeringConnection": {
        "Type": "AWS::EC2::VPCPeeringConnection",
        "Properties": {
            ......
            "PeerRoleArn": "arn:aws:iam::Accepter-Account-ID:role/PeerRole"
        }
    }
}

YAML:

myVPCPeeringConnection:
  Type: 'AWS::EC2::VPCPeeringConnection'
  Properties:
    .......
    PeerRoleArn: 'arn:aws:iam::Accepter-Account-ID:role/PeerRole'

如果接受方账户中的 IAM 角色不拥有正确的权限

要允许 IAM 角色在接受方账户中接受 VPC 对等连接,该角色应包含以下权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ec2:AcceptVpcPeeringConnection",
            "Resource": "arn:${Partition}:ec2:${Region}:${Account}:vpc-peering-connection/${VpcPeeringConnectionId}",
            "Effect": "Allow"
        }
    ]
}

要允许请求方账户担任该 IAM 角色,应为该 IAM 角色配置信任关系。例如:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::Requester-Account-ID:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

如果您在不同 AWS 区域的 VPC 之间创建 VPC 对等连接时,PeerRegion 属性未正确传送

如果 VPC 位于不同的 AWS 区域,则 AWS CloudFormation 模板中必须包含 PeerRegion 属性。然后指定接受方账户 VPC 所在的 AWS 区域。请参阅以下 JSON 和 YAML 示例:

JSON:

{
    "myVPCPeeringConnection": {
        "Type": "AWS::EC2::VPCPeeringConnection",
        "Properties": {
            ......
            "PeerRegion": Accepter-VPC-Region-Code
        }
    }
}

YAML:

myVPCPeeringConnection:
  Type: 'AWS::EC2::VPCPeeringConnection'
  Properties:
    ......
    PeerRegion: Accepter-VPC-Region-Code

这篇文章对您有帮助吗?


您是否需要账单或技术支持?