通过企业版转发路由器实现ECS私网访问跨地域的OSS服务

本文介绍如何通过企业版转发路由器实现专有网络VPC(Virtual Private Cloud)中的云服务器ECS(Elastic Compute Service)私网访问跨地域的对象存储OSS(Object Storage Service)服务。

说明

本教程所含示例代码支持一键运行,您可以直接运行代码。一键运行

场景示例

image

本文以上图场景为例。某企业在华东2(上海)地域下拥有一个VPC1,VPC1中使用ECS部署了一些应用服务。企业在华东1(杭州)地域部署了OSS服务,企业希望VPC1下的ECS实例可以私网访问华东1(杭州)地域下的OSS服务以获取相关资源。

企业可以在OSS服务所属的地域(即华东1(杭州)地域)创建一个VPC2,然后将要访问OSS服务的VPC1VPC2都连接至云企业网下的企业版转发路由器中,VPC1VPC2可以通过企业版转发路由器实现跨地域私网互通,VPC1下的ECS实例可以通过企业版转发路由器和VPC2实现私网访问跨地域的OSS服务。

说明

VPC下的ECS实例通过企业版转发路由器访问跨地域的OSS服务时,OSS服务所属的地域下需至少拥有一个VPC实例,ECS实例将通过企业版转发路由器和该VPC实例访问OSS服务。在本文中如果您在华东1(杭州)地域已有VPC实例,则您可以将此VPC实例连接至企业版转发路由器,无需新建VPC2。华东2(上海)地域的ECS实例可通过华东1(杭州)地域下的任意一个VPC实例访问OSS服务。

网段规划

重要

在您规划网段时,请确保VPC之间要互通的网段没有重叠。

资源

VPC所属地域

网段及IP地址

VPC1

华东2(上海)

主网段:192.168.0.0/16

  • 交换机1网段:192.168.0.0/24,交换机1位于可用区M。

  • 交换机2网段:192.168.20.0/24,交换机1位于可用区N。

  • ECS IP地址:192.168.0.1,ECS实例位于交换机1下。

VPC2

华东1(杭州)

主网段:172.16.0.0/16

  • 交换机1网段:172.16.1.0/24,交换机1位于可用区J。

  • 交换机2网段:172.16.2.0/24,交换机2位于可用区K。

操作步骤

本文提供控制台和Terraform两种配置方式,请按需选择。

控制台

准备工作

在开始配置前,请确保您已完成以下操作:

  • 您已经在华东1(杭州)地域部署了OSS服务。具体操作,请参见开始使用OSS

  • 您已经在华东2(上海)地域创建了VPC1,VPC1中使用ECS部署了相关应用服务。具体操作,请参见搭建IPv4专有网络

  • 您已经在华东1(杭州)地域创建了VPC2。具体操作,请参见创建和管理专有网络

    请确保每个VPC在企业版转发路由器支持的可用区中拥有足够的交换机实例,且每个交换机实例拥有至少一个空闲的IP地址。

    • 对于企业版转发路由器仅支持一个可用区的地域(例如华东5(南京-本地地域)地域),VPC实例需在当前可用区下拥有至少一个交换机实例。

    • 对于企业版转发路由器支持多个可用区的地域(例如华东2(上海)地域),VPC实例需在这些可用区中拥有至少2个交换机实例,2个交换机实例需位于不同的可用区。

    更多信息,请参见VPC连接原理

  • 您已经了解VPC1VPC2所应用的安全组规则,并确保安全组规则允许VPC1中的ECS实例可以通过VPC2访问OSS服务。具体操作,请参见查询安全组规则添加安全组规则

  • 您已经创建了一个云企业网实例。具体操作,请参见创建云企业网实例

  • 您已经在云企业网实例下的华东2(上海)和华东1(杭州)地域分别创建了企业版转发路由器。具体操作,请参见创建转发路由器实例

    创建企业版转发路由器实例时均使用默认配置即可。

步骤一:创建VPC连接

VPC1连接至华东2(上海)地域的企业版转发路由器,将VPC2连接至华东1(杭州)地域的企业版转发路由器。

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,找到目标云企业网实例,单击云企业网实例ID。

    本文中的目标云企业网实例指在准备工作中创建的云企业网实例。

  3. 基本信息 > 转发路由器页签,找到任意一个转发路由器实例,在操作列单击创建网络实例连接

  4. 连接网络实例页面,根据以下信息进行配置,然后单击确定创建

    请根据下表中的信息,将VPC1连接至华东2(上海)地域的企业版转发路由器,将VPC2连接至华东1(杭州)地域的企业版转发路由器。

    配置项

    配置项说明

    VPC1

    VPC2

    实例类型

    选择待连接的网络实例类型。

    专有网络(VPC)

    专有网络(VPC)

    地域

    选择待连接的网络实例所在的地域。

    华东2(上海)

    华东1(杭州)

    转发路由器

    系统自动显示该地域下已创建的转发路由器实例ID。

    资源归属UID

    选择待连接的网络实例所属的账号类型。

    同账号

    同账号

    付费方式

    默认值按量付费

    连接名称

    输入网络实例连接的名称。

    VPC1连接

    VPC2连接

    网络实例

    选择待连接的网络实例。

    选择VPC1

    选择VPC2

    交换机

    在转发路由器支持的可用区选择一个交换机实例。

    如果您在转发路由器支持的多个可用区均拥有交换机实例,您可以同时选择多个可用区并在每个可用区下选择一个交换机实例以实现可用区级别的容灾。

    • 上海 可用区F:选择交换机1

    • 上海 可用区G:选择交换机2

    • 杭州 可用区H:选择交换机1

    • 杭州 可用区I:选择交换机2

    高级配置

    VPC1VPC2均保持默认配置,即选中所有高级配置选项。

步骤二:创建跨地域连接

由于VPC1连接的企业版转发路由器和VPC2连接的企业版转发路由器位于不同的地域,跨地域的VPC实例默认无法互通。您需要在华东1(杭州)和华东2(上海)地域的企业版转发路由器实例之间创建跨地域连接,实现VPC1VPC2之间的跨地域互通。

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,找到目标云企业网实例,单击目标实例ID。
  3. 基本信息 > 转发路由器页签下,找到任意一个转发路由器实例,在转发路由器实例的操作列单击创建网络实例连接

  4. 连接网络实例页面,配置跨地域连接信息,然后单击确定创建

    以下仅列举本文强相关的配置项,其余配置项保持默认状态。更多信息,请参见使用企业版转发路由器创建跨地域连接

    配置项

    说明

    实例类型

    选择跨地域连接

    地域

    选择要互通的地域。

    本文选择华东2(上海)

    对端地域

    选择要互通的对端地域。

    本文选择华东1(杭州)

    带宽分配方式

    选择跨地域连接的带宽分配方式。

    本文选择按流量付费,系统将按照跨地域连接实际使用的流量计费。

    带宽

    输入跨地域连接的带宽值。单位:Mbps。

    按流量付费的带宽分配方式下,该配置项表示跨地域连接的限速带宽值。

    默认链路类型

    选择跨地域连接的链路类型。

    本文保持默认值。链路类型说明,请参见链路类型

    高级配置

    本文保持默认配置,即选择开启三种高级功能。

步骤三:在VPC中配置OSS服务的路由

创建跨地域连接后,VPC1VPC2可以通过企业版转发路由器实现私网互通,但是VPC1中的ECS实例依旧无法通过企业版转发路由器和VPC2私网访问OSS服务,您需要在VPC1的路由表中添加OSS服务的路由,引导VPC1访问OSS服务的流量进入企业版转发路由器。

  1. 登录专有网络管理控制台
  2. 在顶部菜单栏,选择VPC1实例所属的地域。

    本文选择华东2(上海)地域。

  3. 在左侧导航栏,单击路由表

  4. 路由表页面,找到VPC1实例的路由表,单击路由表实例ID。

    本文中VPC1仅拥有一张系统路由表,如果您的VPC中拥有多张路由表,请选择ECS实例所在交换机关联的路由表。

  5. 路由条目列表页签下单击自定义路由条目页签,然后单击添加路由条目

  6. 添加路由条目面板,配置以下信息,然后单击确定

    请根据以下信息将华东1(杭州)地域下OSS服务所有网段的路由均添加至VPC1的路由表中。

    华东1(杭州)地域下OSS服务所有网段的信息,请参见OSS内网域名与VIP网段对照表

    配置项

    配置项说明

    路由条目1

    路由条目2

    路由条目3

    路由条目4

    名称

    输入自定义路由条目的名称。

    OSS网段1

    OSS网段2

    OSS网段3

    OSS网段4

    目标网段

    输入目标网段。

    100.118.28.0/24

    100.114.102.0/24

    100.98.170.0/24

    100.118.31.0/24

    下一跳类型

    选择自定义路由条目的下一跳类型,并选择下一跳。

    选择转发路由器,然后选择VPC1连接。

    选择转发路由器,然后选择VPC1连接。

    选择转发路由器,然后选择VPC1连接。

    选择转发路由器,然后选择VPC1连接。

步骤四:在转发路由器中配置OSS服务的路由

您还需要在华东1(杭州)地域的企业版转发路由器路由表下添加OSS服务的路由,在VPC1ECS实例访问OSS服务的流量进入企业版转发路由器后,企业版转发路由器可以根据OSS服务的路由将流量引导至VPC2,然后ECS实例可通过VPC2私网访问OSS服务。

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,找到目标云企业网实例,单击云企业网实例ID。

  3. 基本信息 > 转发路由器页签,找到华东1(杭州)地域下的转发路由器实例,单击实例ID。

  4. 在转发路由器实例详情页面,单击转发路由器路由表页签,在页签左侧选择目标转发路由器路由表。

    由于VPC1连接和VPC2连接均采用了默认高级配置,均与转发路由器的默认路由表建立了关联转发关系,因此本文选择转发路由器的默认路由表(即系统路由表)。

  5. 路由条目页签下,单击创建路由条目

  6. 添加路由条目对话框,根据以下信息进行配置,然后单击确定

    请根据以下信息将华东1(杭州)地域下OSS服务所有网段的路由均添加至转发路由器的路由表中。

    配置项

    配置项说明

    路由条目1

    路由条目2

    路由条目3

    路由条目4

    路由条目名称

    输入路由条目的名称。

    OSS网段1

    OSS网段2

    OSS网段3

    OSS网段4

    目的地址CIDR

    输入路由条目的目标网段。

    100.118.28.0/24

    100.114.102.0/24

    100.98.170.0/24

    100.118.31.0/24

    是否为黑洞路由

    选择当前路由条目是否为黑洞路由。

    • :表示该路由为黑洞路由,所有去往该路由的流量均会被丢弃。

    • :表示该路由不为黑洞路由,需要您设置路由的下一跳连接。

    选择

    选择

    选择

    选择

    下一跳连接

    选择路由条目的下一跳连接。

    选择VPC2连接

    选择VPC2连接

    选择VPC2连接

    选择VPC2连接

步骤五:测试连通性

完成上述配置后,VPC1中的ECS实例可以私网访问跨地域的OSS服务了。本文以ECS下载OSS服务中的一张图片为例测试VPC1ECS实例和OSS服务之间的连通性。

  1. 登录VPC1实例下的ECS实例。具体操作,请参见ECS远程连接操作指南

  2. ECS实例中尝试下载OSS服务下一张名为OSStest.jgp的图片。

    说明

    在您测试前请确保目标文件拥有的读写权限允许其被ECS实例访问。更多信息,请参见权限控制

    wget https://zxtXXXXX.oss-cn-hangzhou-internal.aliyuncs.com/OSStest.jpg
    
    #“zxtXXXXX.oss-cn-hangzhou-internal.aliyuncs.com”为OSS服务访问域名。
    #“OSStest.jpg”为目标文件名称。

    关于OSS访问域名的更多信息,请参见OSS访问域名使用规则

    如果ECS可以收到如下所示的回复,则证明ECS已经可以私网访问跨地域的OSS服务了。ECS访问跨地域OSS-测试连通性

Terraform

您可以使用Terraform搭建本文示例环境,关于Terraform的安装和配置,请参考Provider 使用

下面步骤以Linux主机运行Terraform v1.9.8为例进行介绍,操作前请确保您已经完成Terraform 身份认证

说明

本教程示例包含的部分资源会产生一定费用,请在不需要时及时进行释放或退订。

第一步:创建资源

  1. 为本文的实践场景创建一个目录,并进入该目录。

    mkdir tf-cen-oss && cd tf-cen-oss
  2. 创建一个main.tf文件,用于定义资源信息。

    touch main.tf
  3. 打开main.tf文件,复制如下代码,粘贴到文件中并保存。此文件包含了本文实践场景中需要用到的资源和对应配置。

    variable "pname" {
      description = "The prefix name for resources"
      type        = string
      default     = "tf-cen-oss"
    }
    
    variable "region_id_hangzhou" {
      description = "The region id of hangzhou"
      type        = string
      default     = "cn-hangzhou"
    }
    
    variable "region_id_shanghai" { #
      description = "The region id of shanghai"
      type        = string
      default     = "cn-shanghai"
    }
    
    variable "az_hangzhou" {
      description = "List of availability zones to use"
      type        = list(string)
      default     = ["cn-hangzhou-j", "cn-hangzhou-k"]
    }
    
    variable "az_shanghai" {
      description = "List of availability zones to use"
      type        = list(string)
      default     = ["cn-shanghai-m", "cn-shanghai-n"]
    }
    
    variable "cidr_list" {
      description = "List of VPC CIDR block"
      type        = list(string)
      default     = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]
    }
    
    # --- provider ---
    provider "alicloud" { # default region hangzhou
      region = var.region_id_hangzhou
    }
    
    provider "alicloud" {
      alias  = "hangzhou"
      region = var.region_id_hangzhou
    }
    
    provider "alicloud" {
      alias  = "shanghai"
      region = var.region_id_shanghai
    }
    
    # ---  oss ---
    resource "random_uuid" "default" {
    }
    resource "alicloud_oss_bucket" "bucket1" {
      provider = alicloud.hangzhou
      bucket   = substr("${var.pname}-${replace(random_uuid.default.result, "-", "")}", 0, 32)
    }
    
    resource "alicloud_oss_bucket_policy" "default" {
      provider = alicloud.hangzhou
      policy   = jsonencode({ "Version" : "1", "Statement" : [{ "Action" : ["oss:GetObject"], "Effect" : "Allow", "Resource" : ["acs:oss:*:*:${alicloud_oss_bucket.bucket1.bucket}"] }] })
      bucket   = alicloud_oss_bucket.bucket1.bucket
    }
    
    resource "alicloud_oss_bucket_object" "obj1" {
      provider = alicloud.hangzhou
      bucket   = alicloud_oss_bucket.bucket1.bucket
      key      = "example.txt"                     # Name of the file in the bucket
      content  = "this is example text content \n" # Content of the file
      acl      = "public-read"
    }
    
    # --- vpc ---
    resource "alicloud_vpc" "vpc1" {
      provider   = alicloud.shanghai
      vpc_name   = "${var.pname}-1"
      cidr_block = "192.168.0.0/16"
    }
    
    resource "alicloud_vpc" "vpc2" {
      provider   = alicloud.hangzhou
      vpc_name   = "${var.pname}-2"
      cidr_block = "172.16.0.0/16"
    }
    
    resource "alicloud_vswitch" "vsw1-1" {
      provider     = alicloud.shanghai
      vpc_id       = alicloud_vpc.vpc1.id
      cidr_block   = "192.168.0.0/24"
      zone_id      = var.az_shanghai[0]
      vswitch_name = "${var.pname}-vsw1-1"
    }
    resource "alicloud_vswitch" "vsw1-2" {
      provider     = alicloud.shanghai
      vpc_id       = alicloud_vpc.vpc1.id
      cidr_block   = "192.168.1.0/24"
      zone_id      = var.az_shanghai[1]
      vswitch_name = "${var.pname}-vsw1-2"
    }
    resource "alicloud_vswitch" "vsw2-1" {
      provider     = alicloud.hangzhou
      vpc_id       = alicloud_vpc.vpc2.id
      cidr_block   = "172.16.0.0/24"
      zone_id      = var.az_hangzhou[0]
      vswitch_name = "${var.pname}-vsw2-1"
    }
    resource "alicloud_vswitch" "vsw2-2" {
      provider     = alicloud.hangzhou
      vpc_id       = alicloud_vpc.vpc2.id
      cidr_block   = "172.16.1.0/24"
      zone_id      = var.az_hangzhou[1]
      vswitch_name = "${var.pname}-vsw2-2"
    }
    
    # --- cen ---
    # cen
    resource "alicloud_cen_instance" "cen1" {
      cen_instance_name = "${var.pname}-cen1"
    }
    
    # tr
    resource "alicloud_cen_transit_router" "tr1" {
      provider            = alicloud.shanghai
      transit_router_name = "${var.pname}-tr1"
      cen_id              = alicloud_cen_instance.cen1.id
    }
    resource "alicloud_cen_transit_router" "tr2" {
      provider            = alicloud.hangzhou
      transit_router_name = "${var.pname}-tr2"
      cen_id              = alicloud_cen_instance.cen1.id
    }
    data "alicloud_cen_transit_router_route_tables" "tr1" { # get tr sys table
      transit_router_id               = alicloud_cen_transit_router.tr1.transit_router_id
      transit_router_route_table_type = "System"
    }
    data "alicloud_cen_transit_router_route_tables" "tr2" {
      transit_router_id               = alicloud_cen_transit_router.tr2.transit_router_id
      transit_router_route_table_type = "System"
    }
    
    # tr-peer
    resource "alicloud_cen_transit_router_peer_attachment" "peer" {
      provider                      = alicloud.shanghai
      cen_id                        = alicloud_cen_instance.cen1.id
      transit_router_id             = alicloud_cen_transit_router.tr1.transit_router_id
      peer_transit_router_region_id = var.region_id_hangzhou
      peer_transit_router_id        = alicloud_cen_transit_router.tr2.transit_router_id
      bandwidth_type                = "DataTransfer"
      bandwidth                     = 1
      auto_publish_route_enabled    = true # default is false
    }
    resource "alicloud_cen_transit_router_route_table_association" "ass_peer1" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id
    }
    resource "alicloud_cen_transit_router_route_table_propagation" "propa_peer1" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id
    }
    resource "alicloud_cen_transit_router_route_table_association" "ass_peer2" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id
    }
    resource "alicloud_cen_transit_router_route_table_propagation" "propa_peer2" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id
    }
    
    # attach1  
    resource "alicloud_cen_transit_router_vpc_attachment" "attach1" {
      provider          = alicloud.shanghai
      cen_id            = alicloud_cen_instance.cen1.id
      transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id
      vpc_id            = alicloud_vpc.vpc1.id
      zone_mappings {
        zone_id    = var.az_shanghai[0]
        vswitch_id = alicloud_vswitch.vsw1-1.id
      }
      zone_mappings {
        zone_id    = var.az_shanghai[1]
        vswitch_id = alicloud_vswitch.vsw1-2.id
      }
      transit_router_vpc_attachment_name = "attach1"
    }
    resource "alicloud_cen_transit_router_route_table_association" "ass1" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
    }
    resource "alicloud_cen_transit_router_route_table_propagation" "propa1" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
    }
    resource "alicloud_route_entry" "vpc1_to_tr1" {
      provider              = alicloud.shanghai
      count                 = 3
      route_table_id        = alicloud_vpc.vpc1.route_table_id
      destination_cidrblock = var.cidr_list[count.index]
      nexthop_type          = "Attachment"
      nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
    }
    
    # attach2
    resource "alicloud_cen_transit_router_vpc_attachment" "attach2" {
      provider          = alicloud.hangzhou
      cen_id            = alicloud_cen_instance.cen1.id
      transit_router_id = alicloud_cen_transit_router.tr2.transit_router_id
      vpc_id            = alicloud_vpc.vpc2.id
      zone_mappings {
        zone_id    = var.az_hangzhou[0]
        vswitch_id = alicloud_vswitch.vsw2-1.id
      }
      zone_mappings {
        zone_id    = var.az_hangzhou[1]
        vswitch_id = alicloud_vswitch.vsw2-2.id
      }
      transit_router_vpc_attachment_name = "attach2"
    }
    resource "alicloud_cen_transit_router_route_table_association" "ass2" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
    }
    resource "alicloud_cen_transit_router_route_table_propagation" "propa2" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
    }
    resource "alicloud_route_entry" "vpc2_to_tr2" {
      provider              = alicloud.hangzhou
      count                 = 3
      route_table_id        = alicloud_vpc.vpc2.route_table_id
      destination_cidrblock = var.cidr_list[count.index]
      nexthop_type          = "Attachment"
      nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
    }
    
    # oss_cidr
    variable "oss_cidr" {
      description = "The OSS CIDR block"
      type        = list(string)
      default     = ["100.118.28.0/24", "100.114.102.0/24", "100.98.170.0/24", "100.118.31.0/24"]
    }
    
    # vpc entry
    resource "alicloud_route_entry" "entry" {
      provider              = alicloud.shanghai
      count                 = 4
      route_table_id        = alicloud_vpc.vpc1.route_table_id
      destination_cidrblock = var.oss_cidr[count.index]
      nexthop_type          = "Attachment"
      nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
    }
    
    # tr entry 
    resource "alicloud_cen_transit_router_route_entry" "tr2_rt1_entry1" {
      count                                             = 4
      transit_router_route_table_id                     = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id
      transit_router_route_entry_destination_cidr_block = var.oss_cidr[count.index]
      transit_router_route_entry_next_hop_type          = "Attachment"
      transit_router_route_entry_next_hop_id            = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
    }
    
    # --- ecs ---
    resource "alicloud_instance" "main" {
      provider             = alicloud.shanghai
      depends_on           = [alicloud_cen_transit_router_route_entry.tr2_rt1_entry1]
      instance_name        = "${var.pname}-ecs"
      instance_type        = "ecs.e-c1m1.large"
      security_groups      = [alicloud_security_group.default.id]
      vswitch_id           = alicloud_vswitch.vsw1-1.id
      image_id             = "aliyun_3_x64_20G_qboot_alibase_20230727.vhd"
      system_disk_category = "cloud_essd"
      private_ip           = "192.168.0.1"
      instance_charge_type = "PostPaid"
      user_data = base64encode(<<-EOT
        #!/bin/bash
        curl  https://${alicloud_oss_bucket.bucket1.bucket}.${alicloud_oss_bucket.bucket1.intranet_endpoint}/${alicloud_oss_bucket_object.obj1.key}  > /root/curl.txt
      EOT
      )
    }
    
    # sg
    resource "alicloud_security_group" "default" {
      provider = alicloud.shanghai
      name     = var.pname
      vpc_id   = alicloud_vpc.vpc1.id
    }
    
    resource "alicloud_security_group_rule" "allow_inbound_ssh" {
      provider          = alicloud.shanghai
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "22/22"
      priority          = 1
      security_group_id = alicloud_security_group.default.id
      cidr_ip           = "0.0.0.0/0"
    }
    
    resource "alicloud_security_group_rule" "allow_inbound_icmp" {
      provider          = alicloud.shanghai
      type              = "ingress"
      ip_protocol       = "icmp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "-1/-1"
      priority          = 1
      security_group_id = alicloud_security_group.default.id
      cidr_ip           = "0.0.0.0/0"
    }
    
    # --- output ---
    output "ecs_login_address" {
      value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.region_id_shanghai}&instanceId=${alicloud_instance.main.id}"
    }
    
    output "test_command" {
      value = "curl ${alicloud_oss_bucket.bucket1.bucket}.${alicloud_oss_bucket.bucket1.intranet_endpoint}/${alicloud_oss_bucket_object.obj1.key}"
    }
  4. 初始化目录,完成Terraform的初始化配置。

    terraform init
  5. 创建资源。执行后Terraform会先预览将要创建的资源,确认无误后,输入yes正式开始创建。

    terraform apply

第二步:验证测试

  1. 登录ECS实例(名称为tf-cen-oss-ecs)。

    您可以在TerraformOutputs输出中,找到对应ECS的登录地址并复制到浏览器打开,登录时注意认证方式选择临时SSH密钥认证

    image

  2. Outputs输出中,复制curl开头的命令:

    image

  3. ECS实例中执行curl命令:

    curl tf-cen-oss-xxxxxx.oss-cn-hangzhou-internal.aliyuncs.com/example.txt

    image

    如上图,如果能获取到文本内容,则说明访问成功。

第三步:释放资源

验证完毕后,如果您不再使用资源,请执行以下命令释放资源,防止继续计费。

terraform destroy --auto-approve

路由说明

在本文中,创建VPC连接、创建跨地域连接时均采用默认路由配置,默认路由配置下云企业网会自动完成路由的分发和学习以实现VPC1VPC2之间的相互通信。默认路由配置说明如下:

VPC实例

创建VPC连接时如果采用默认路由配置(即开启所有高级配置),则系统会自动对VPC实例进行以下路由配置:

  • 自动关联至转发路由器的默认路由表

    开启本功能后,VPC连接会自动关联至转发路由器的默认路由表,转发路由器通过查询默认路由表转发VPC实例的流量。

  • 自动传播系统路由至转发路由器的默认路由表

    开启本功能后,VPC实例会将自身的系统路由传播至转发路由器的默认路由表中,用于网络实例的互通。

  • 自动为VPC的所有路由表配置指向转发路由器的路由

    开启本功能后,系统将在VPC实例的所有路由表内自动配置10.0.0.0/8、172.16.0.0/12、192.168.0.0/16三条路由条目,其下一跳均指向VPC连接。

跨地域连接

创建跨地域连接时如果采用默认路由配置(即开启所有高级配置),则系统会自动对跨地域连接进行以下路由配置:

  • 自动关联至转发路由器的默认路由表

    开启本功能后,跨地域连接将与两个地域的转发路由器的默认路由表建立关联转发关系,两个地域的转发路由器将会通过查询默认路由表转发跨地域间的流量。

  • 自动传播系统路由至转发路由器的默认路由表

    开启本功能后,跨地域连接将与两个地域的转发路由器的默认路由表建立路由学习关系。

  • 自动发布路由到对端地域

    开启本功能后,即允许跨地域连接将本端转发路由器路由表(指与跨地域连接建立关联转发关系的路由表)下的路由自动传播至对端转发路由器的路由表(指与跨地域连接建立路由学习关系的路由表)中,用于网络实例跨地域互通。

查看路由条目

您可以在阿里云管理控制台查看对应实例的路由条目信息: