edit-icon download-icon

VPC资源访问

更新时间: 2018-06-01

函数计算访问 VPC 内资源的功能目前在新加坡集群、悉尼集群开放,供您试用。6 月底会发布到所有集群。

专有网络 VPC 是用户基于阿里云创建的自定义私有网络。您可以在自己创建的 VPC 网络内创建并使用云产品实例。通常,您在 VPC 内部创建资源,以便这些资源不被公共互联网访问,默认情况下,函数计算无法访问 VPC 中的资源,要让函数计算能够访问私有 VPC 中的资源,需要您提供 VPC ID,安全组 ID,交换机 ID 等配置信息,函数计算使用这些信息配置 弹性网卡 ENI ,您的函数可以通过 ENI 安全访问 VPC 中的资源。

本文主要就以下几点进行介绍

VPC 配置

函数计算访问 VPC 的配置是在服务级别的,为一个服务配置了访问 VPC 的能力后,那么此服务下的所有函数都可以访问 VPC。

授权

因为函数计算是通过 ENI 访问 VPC 中的资源的,因此您需要授予需要访问 VPC 的服务对 ENI 的创建、描述、删除等权限,想了解更多权限介绍可以参考文章 RAM

需要为函数计算对应 Service Role 授予以下权限

  • vpc:DescribeVSwitchAttributes
  • ecs:CreateNetworkInterface
  • ecs:DeleteNetworkInterface
  • ecs:DescribeNetworkInterfaces
  • ecs:CreateNetworkInterfacePermission
  • ecs:DescribeNetworkInterfacePermissions

RAM 提供了一个包含以上权限的系统模板 AliyunECSNetworkInterfaceManagementAccess ,您只需将 AliyunECSNetworkInterfaceManagementAccess 绑定到您需要访问 VPC 资源服务的角色上即可。

VPC Config

为服务设置 vpcConfig 即表示允许此服务下的所有函数访问 VPC。 vpcConfig 下有三个字段 vpcId , vSwitchIds, securityGroupId,每一个字段都不允许为空。

  • vpcId:要访问的 VPC ID
  • vSwitchIds: 一系列交换机的列表, 至少要提供一个 vSwitchId
  • securityGroupId: 安全组的 ID

    1. "vpcConfig": {
    2. "vpcId": "string",
    3. "vSwitchIds": [ "string" ],
    4. "securityGroupId": "string"
    5. }

    其中

  • vSwitchIds 限定了函数计算可以访问的子网,建议在 vSwitchIds 中设置两个或多个 vSwitch,如果一个可用区出现故障或 IP 地址不足,您的函数可以在其他子网下运行
  • securityGroupId 限定了函数计算在 VPC 中的出入站规则

  • VPC 的配置是在服务层面的,一旦为服务设置了 vpcConfig,那么此服务下的所有函数都可以访问 VPC

  • 如果 vSwitchIds 中指定了多个 vSwitchId,函数计算在创建 ENI 的时候会随机选取一个
  • 函数计算通过 ENI 访问 VPC 中的资源,安全组是 ENI 在 VPC 中的访问权限控制。用户对安全组的配置有完全的配置权限,如果安全组没有正确设置,会导致函数计算无法成功访问 VPC

访问公网

函数计算的服务中有 internetAccess 字段,布尔类型,用于表示此服务是否可以访问公网,默认是 true,表示此服务可以访问互联网。可以将internetAccess 字段设置为 false 用户表示此服务下的所有函数都无法连接互联网。

  1. "internetAccess": boolean

网络访问能力

设置了 "internetAccess": true 后,函数可以访问公网,设置了 vpcConfig 后,函数可以访问相应的 VPC ,函数现在有四种类型的网络访问能力,可以根据您的需求进行设置。

internetAccess vpcConfig 网络访问能力
True 已设置 函数可以访问公网,也可以访问 vpc
True 未设置 函数可以访问公网,不可以访问 vpc
False 已设置 函数不访问公网,不可以访问 vpc
False 未设置 函数不可以访问公网,也不可以访问 vpc

注意事项

使用 VPC 的场景

使用 VPC 会带来一些额外的开销,所以需要在配置 VPC 前,对此场景是否需要使用 VPC 进行判断。下面的图表可以帮助您判断是否应该使用VPC。vpc judge

  • 使用 VPC Config 可以访问 VPC 中的资源,同时会带来一些额外的开销。可以使用 RAM 授权方式访问的资源不建议使用 VPC Config。例如函数计算访问 OTS,可以通过授予函数计算访问 OTS 的权限的方式完成,这种情况不建议使用 VPC Config。

问题诊断

函数计算无法成功接入 VPC 调试

如果您的服务中已经设置了 vpcConfig ,但却无法成功接入 VPC ,可能是如下原因导致的,可以按照以下步骤调试

  • 可能是交换机所在的子网故障或子网中的 IP 地址用尽,建议配置 VPC 时提供两个或者多个 vSwitchIds ,一旦一个可用区出现故障,您的函数可以在其他可用区运行,提高容错能力
  • 可能是 安全组 配置不正确
    • 首先提供一个使用默认的出站规则的安全组,默认出站行为即允许 ENI 访问 VPC 中的任意资源;
    • 然后将我们使用的安全组的入站规则设置为允许以上的安全组访问。

错误类型

函数计算无法在设置 vpcConfig 时对访问 VPC 的权限进行检测,需要在执行函数时检测,因此会在 invoke function 时引入一些新的错误类型。下面对接入 VPC 时一些常见的错误进行解释和说明。

错误码 状态码 问题原因 解决方案
InvalidArgument 400 函数计算不支持您提供的 vSwitchId 所在的可用区 重新设置 vSwitchId
400 未找到 vpcConfig 中的 vpcId、vSwitchIds 或 securityGroupId 对应的资源 检查 vpcConfig 参数设置
400 设置的 VSwitch 或 security group 不在相应的 VPC 中 检查 vpcConfig 参数设置,确保 vSwitchId 和 securityGroupId 对应的资源在 vpcId 对应的 VPC 中
AccessDenied 403 未提供对 ENI 的操作授权 检查服务的权限,参考 授权
ResourceExhausted 429 VPC 中 ENI 资源耗尽,函数计算无法创建更多的 ENI 提供更多的 ENI

使用示例

示例 1 . 使用控制台示例

使用控制台设置服务访问 VPC 中资源是在 创建服务更新服务 时设置的。根据控制台设置 VPC 配置即可。vpc-console

示例 2 . 使用 SDK 示例

使用 Python SDK 为服务创建 VPC Config 示例:

  1. def test_vpcConfig(self):
  2. name = 'test_vpcConfig'
  3. vpcConfig = {
  4. 'vpcId': 'my-vpcId',
  5. 'vSwitchIds': [ids],
  6. 'securityGroupId': 'my-securityGroupId'
  7. }
  8. # create vpcConfig when creating the service
  9. logging.info('Create service: {0}'.format(name))
  10. service = self.client.create_service(name, role=self.vpcRole, vpcConfig=vpcConfig)
谢谢!我们已经收到了您的反馈。