服务规范参考¶
要查看 Snowpark Container Services 规范,请参阅 YAML (` https://yaml.org/spec/ (https://yaml.org/spec/) <https://yaml.org/spec/ (https://yaml.org/spec/)>`_)。它为 Snowflake 提供必要信息,用于配置和运行您的服务。您在创建服务时提供规范。
一般语法为:
spec:
containers: # container list
- name: <name>
image: <image-name>
command: # optional list of strings
- <cmd>
- <arg1>
args: # optional list of strings
- <arg2>
- <arg3>
- ...
env: # optional
<key>: <value>
<key>: <value>
...
readinessProbe: # optional
port: <TCP port-num>
path: <http-path>
volumeMounts: # optional list
- name: <volume-name>
mountPath: <mount-path>
- name: <volume-name>
...
resources: # optional
requests:
memory: <amount-of-memory>
nvidia.com/gpu: <count>
cpu: <cpu-units>
limits:
memory: <amount-of-memory>
nvidia.com/gpu: <count>
cpu: <cpu-units>
secrets: # optional list
- snowflakeSecret:
objectName: <object-name> # specify this or objectReference
objectReference: <reference-name> # specify this or objectName
directoryPath: <path> # specify this or envVarName
envVarName: <name> # specify this or directoryPath
secretKeyRef: username | password | secret_string # specify only with envVarName
endpoints: # optional endpoint list
- name: <name>
port: <TCP port-num> # specify this or portRange
portRange: <TCP port-num>-<TCP port-num> # specify this or port
public: <true / false>
protocol : < TCP / HTTP / HTTPS >
- name: <name>
...
volumes: # optional volume list
- name: <name>
source: local | @<stagename> | memory | block
size: <bytes-of-storage> # specify if memory or block is the volume source
blockConfig: # optional
initialContents:
fromSnapshot: <snapshot-name>
iops: <number-of-operations>
throughput: <MiB per second>
uid: <UID-value> # optional, only for stage volumes
gid: <GID-value> # optional, only for stage volumes
- name: <name>
source: local | @<stagename> | memory | block
size: <bytes-of-storage> # specify if memory or block is the volume source
...
logExporters:
eventTableConfig:
logLevel: <INFO | ERROR | NONE>
platformMonitor: # optional, platform metrics to log to the event table
metricConfig:
groups:
- <group-1>
- <group-2>
...
serviceRoles: # Optional list of service roles
- name: <service-role-name>
endpoints:
- <endpoint_name1>
- <endpoint_name2>
- ...
- ...
请注意,spec
和 serviceRoles
是规范中的顶级字段。
spec
:使用此字段提供规范详细信息。它包括以下顶级字段::ref:`spec.containers <label-spcs_spec_ref_spec_containers>`(必填):一个或多个应用程序容器的列表。容器化应用程序必须至少有一个容器。
:ref:`spec.endpoints <label-spcs_spec_ref_spec_endpoints>`(可选):服务显示的端点的列表。您可选择将端点设为公开,以允许网络入口访问该服务。
:ref:`spec.volumes <label-snowpark_containers_spec_volume>`(可选):容器使用的存储卷的列表。
:ref:`spec.logExporters <label-snowpark_containers_spec_reference_spec_logexporters>`(可选):此字段用于管理导出到账户中的事件表的容器日志级别。
serviceRoles
:使用此字段可定义一个或多个服务角色。服务角色是用于管理服务所显示的端点的权限的机制。
一般准则¶
以下格式准则适用于
name
字段(容器、端点和卷名称):最多可包含 63 个字符。
可包含一串小写字母数字或
-
字符。必须以字母字符开头。
必须以字母数字字符结尾。
客户应确保没有个人数据、敏感数据、出口控制数据或其他受监管数据作为元数据输入规范文件。有关更多信息,请参阅 Snowflake 中的元数据字段。
以下各节介绍了每个顶级 spec
字段。
spec.containers
字段(必填)¶
使用 spec.containers
字段描述应用程序中的每个 OCI (https://opencontainers.org/) 容器。
请注意以下事项:
当您创建服务时,Snowflake 会在指定计算池中的单个节点上运行这些容器,共享相同的网络接口。
您可以选择运行多个服务实例,实现传入请求的负载均衡。Snowflake 可能选择在指定计算池中的同一节点或不同节点上运行这些服务实例。给定实例的所有容器始终在一个节点上运行。
目前,Snowpark Container Services 需要 linux/amd64 平台镜像。
以下各节介绍了容器字段的类型。
containers.name
和 containers.image
字段¶
对于每个容器,仅名称和镜像是必填字段。
例如:
spec:
containers:
- name: echo
image: /tutorial_db/data_schema/tutorial_repository/echo_service:dev
containers.command
和 containers.args
字段¶
使用这些可选字段,控制容器中启动的可执行文件以及传递给该可执行文件的实参。您可以在创建镜像时配置这些字段的默认值,通常在 Dockerfile 中进行配置。使用这些服务规范字段,您可以更改这些默认值(从而改变容器行为),而无需重建容器镜像:
containers.command
可替换Dockerfile
ENTRYPOINT
。这允许您在容器中运行不同的可执行文件。containers.args
可替换Dockerfile
CMD
。这允许您为命令(可执行文件)提供不同的实参。
示例
Dockerfile
包括以下代码:
ENTRYPOINT ["python3", "main.py"]
CMD ["Bob"]
这些 Dockerfile
条目执行 python3
命令并传递两个实参:main.py
和 Bob
。您可按如下方式替换规范文件中的这些值:
要替换 ENTRYPOINT,请在规范文件中添加
containers.command
字段:spec: containers: - name: echo image: <image_name> command: - python3.9 - main.py
要替换实参“Bob”,请在规范文件中添加
containers.args
字段:spec: containers: - name: echo image: <image_name> args: - Alice
containers.env
字段¶
使用 containers.env
字段定义容器环境变量。容器中的所有进程都可以访问这些环境变量:
spec:
containers:
- name: <name>
image: <image_name>
env:
ENV_VARIABLE_1: <value1>
ENV_VARIABLE_2: <value2>
…
…
示例
在 教程 1 中,应用程序代码 (echo_service.py
) 读取环境变量,如下所示:
CHARACTER_NAME = os.getenv('CHARACTER_NAME', 'I')
SERVER_PORT = os.getenv('SERVER_PORT', 8080)
请注意,该示例将变量的默认值传递给 getenv
函数。如果未定义环境变量,则使用这些默认值。
CHARACTER_NAME
:当 Echo 服务收到带字符串(例如,“Hello”)的 HTTP POST 请求时,服务默认返回“I said Hello”。 您可在规范文件中覆盖此默认值。例如,将值设置为“Bob”,则 Echo 服务会返回“Bob said Hello”的响应。SERVER_PORT
:在此默认配置中,Echo 服务监听端口 8080。您可以替换该默认值并指定另一端口。
以下服务规范将替换这两个环境变量值:
spec:
containers:
- name: echo
image: <image_name>
env:
CHARACTER_NAME: Bob
SERVER_PORT: 8085
endpoints:
- name: echo-endpoint
port: 8085
请注意,由于您更改了服务监听的端口号,因此规范也必须更新端点(endpoints.port field
值),如上所示。
containers.readinessProbe
字段¶
使用 containers.readinessProbe
字段识别应用程序中的就绪探针。Snowflake 调用此探测以确定应用程序何时准备好处理请求。
Snowflake 在指定的端口和路径上向指定的就绪情况探测发出 HTTP GET 请求,并查找您的服务以返回 HTTP 200 OK 状态,以确保只有正常运行的容器才能提供流量。
使用以下字段提供所需信息:
port
:服务正在监听就绪情况探测请求的网络端口。您无需将此端口声明为端点。path
:Snowflake 使用此路径向服务发出 HTTP GET 请求。
示例
在教程 1 中,应用程序代码 (echo_python.py
) 实现以下就绪情况探测:
@app.get("/healthcheck")
def readiness_probe():
因此,规范文件包括 containers.readinessProbe
字段:
spec:
containers:
- name: echo
image: <image_name>
env:
SERVER_PORT: 8088
CHARACTER_NAME: Bob
readinessProbe:
port: 8088
path: /healthcheck
endpoints:
- name: echo-endpoint
port: 8088
就绪情况探测指定的端口可以不是已配置的端点。服务可以仅出于就绪情况探测的目的来监听不同的端口。
containers.volumeMounts
字段¶
因为 spec.volumes
和 spec.containers.volumeMounts
字段是一起使用的,所以将在一个小节中一起介绍它们。有关更多信息,请参阅 spec.volumes 字段(可选)。
containers.resources
字段¶
计算池定义一组可用资源(CPU、内存和存储),Snowflake 确定在计算池的什么位置运行服务。
建议您在规范中明确指出特定容器的资源需求,并设置适当的限制。请注意,您指定的资源受到计算池中节点的实例系列的约束。有关更多信息,请参阅 CREATE COMPUTE POOL。
使用 containers.resources
字段来指定特定应用程序容器的明确资源要求:
containers.resources.requests
:您指定的请求应是您预计的服务的平均资源使用量。Snowflake 使用此信息来确定服务实例在计算池中的位置。 Snowflake 确保在给定节点上放置的资源请求的总和不会超过节点上的可用资源。containers.resources.limits
:您指定的限制指示 Snowflake 不分配超过指定限制的资源。因此,您可以防止成本超支。
您可以为以下资源指定请求和限制:
memory
:这是应用程序容器所需的内存。您可以使用 小数或二进制单位 来表示值。例如,2G 表示请求 2,000,000,000 个字节,而 2Gi 表示请求 2 x 1024 x 1024 x 1024 个字节。指定内存时,单位是必填项。例如,
100M
或5Gi
。支持的单位有:M、Mi、G、Gi。cpu
:这是指虚拟核心 (vCPU) 单位。例如,1 个 CPU 单位相当于 1 个 vCPU。允许小数请求,例如 0.5,也可表示为 500m。nvidia.com/gpu
:如果需要 GPUs,则必须请求它们,并且对于相同的数量也必须指定limit
。如果容器未指定 GPU 容量的请求和限制,则它无法访问任何 GPUs。您可请求的 GPUs 的数量由您在创建 计算池 时选择的INSTANCE_TYPE
所支持的最大 GPUs 数量限制。
resource.requests
和 resource.limits
与关联的 计算池 的实例系列的节点容量(vCPU 和内存)有关。
如果没有提供资源需求(CPU、内存或两者),Snowflake 会为您派生一个:
对于
cpu
,派生的值要么是 0.5,要么是您提供的cpu
限制,以较小者为准。对于
memory
,派生的值要么是 0.5 GiB,要么是您提供的memory
限制,以较小者为准。
如果未提供资源限制(CPU、内存或两者),Snowflake 默认会将限制设置为相关 计算池 的实例系列的节点容量。
如果您提供
resource.limits
并且超出了节点容量,Snowflake 将设置节点容量上限。Snowflake 独立评估
cpu
和memory
的资源需求。
请注意,如果 Snowflake 理论上无法在给定的计算池上安排服务,CREATESERVICE 将会失败。理论上不可能假设计算池具有允许的最大节点数,并且计算池上没有运行其他服务。也就是说,Snowflake 无法在计算池限制内分配请求的资源。如果理论上可行,但所需资源正在使用中,那么 CREATE SERVICE 将会成功。一些服务实例会报告状态,表明由于资源不足,无法安排服务,直到资源可用为止。
示例 1
在以下规范中,containers.resources
字段描述容器的资源需求:
spec:
containers:
- name: resource-test-gpu
image: ...
resources:
requests:
memory: 2G
cpu: 0.5
nvidia.com/gpu: 1
limits:
memory: 4G
nvidia.com/gpu: 1
在此示例中,要求 Snowflake 为容器至少分配 2 个 GB 内存,1 个 GPU 和 0.5 个 CPU 核心。同时,不允许容器使用超过 4 个 GB 内存和 1 个 GPU。
示例 2
假设:
创建包含两个节点的计算池;每个节点有 27 GB 内存和 1 个 GPU:
CREATE COMPUTE POOL tutorial_compute_pool MIN_NODES = 2 MAX_NODES = 2 INSTANCE_FAMILY = gpu_nv_s
您创建一个服务,该服务要求 Snowflake 运行该服务的两个实例:
CREATE SERVICE echo_service MIN_INSTANCES=2 MAX_INSTANCES=2 IN COMPUTE POOL tutorial_compute_pool FROM @<stage_path> SPEC=<spec-file-stage-path>;
将
MIN_INSTANCES
和MAX_INSTANCES
均设置为 2。因此,Snowflake 将运行该服务的两个实例。
现在,考虑以下场景:
如果服务未在应用程序规范中明确包含资源需求,那么 Snowflake 将决定是在计算池中的同一节点还是不同节点上运行这些实例。
您确实在服务规范中包含了资源要求,并为容器请求 10 GB 内存。
- name: resource-test image: ... resources: requests: memory: 15G
计算池节点有 27 GB 内存,并且 Snowflake 无法在同一节点上运行两个容器。Snowflake 将在计算池中的不同节点上运行这两个服务实例。
您在服务规范中包含资源要求,并为容器请求 1 GB 内存和 1 个 GPU:
spec: containers: - name: resource-test-gpu image: ... resources: requests: memory: 2G nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1
您正在为每个容器请求 1 个 GPU,并且每个节点只有 1 个 GPU。在这种情况下,尽管内存不是问题,但 Snowflake 无法在一个节点上安排两个服务实例。此需求迫使 Snowflake 在两个单独的计算池节点上运行两个服务实例。
containers.secrets
字段¶
secrets: # optional list
- snowflakeSecret:
objectName: <object-name> # specify this or objectReference
objectReference: <reference-name> # specify this or objectName
directoryPath: <path> # specify this or envVarName
envVarName: <name> # specify this or directoryPath
secretKeyRef: username | password | secret_string # specify only with envVarName
- snowflakeSecret: <object-name> # equivalent to snowflakeSecret.objectName
...
在服务规范中使用 containers.secrets
字段,为应用程序容器提供 Snowflake 管理的凭据。首先将凭据存储在 Snowflake 密钥 对象中。然后,在服务规范中,引用密钥对象并指定在容器内放置凭据的位置。
以下是关于如何使用 containers.secrets
字段的摘要:
指定 Snowflake 密钥: 使用
snowflakeSecret
字段指定 Snowflake 密钥对象名称或对象引用。对象引用在使用 Snowpark Container Services 创建原生应用程序(带容器的应用程序)时适用。使用
secretKeyRef
提供 Snowflake 密钥中密钥的名称。
在应用程序容器中指定密钥位置: 使用
envVarName
字段以环境变量或directoryPath
形式传递密钥,或将密钥写入本地容器文件。
有关更多信息,请参阅 使用 Snowflake 密钥将凭据传递到容器。
请注意,创建服务的角色(所有者角色)需要对引用的密钥具有 READ 权限。
spec.endpoints
字段(可选)¶
使用 spec.endpoints
字段指定应用程序显示的 TCP 网络端口的列表。一项服务可能向多个端点显示零。使用以下字段描述端点:
port
:服务正在监听的网络端口。您必须指定此字段或portRange
字段。portRange
:应用程序正在监听的网络端口范围。您必须指定此字段或port
字段。请注意,您只能在
portRange
字段设置为protocol
并且 TCP 字段为 False 时指定public
字段。public
:如果您希望可以从 Internet 访问此端点,请将此字段设置为true
。TCP 协议不支持公共端点。protocol
:端点支持的协议。支持的值为:TCP、HTTP 和 HTTPS。默认情况下,该协议为 HTTP。指定protocol
时,请注意以下事项:当此端点是公共端点或服务函数的目标时(请参阅 使用服务),协议必须为 HTTP 或 HTTPS。
作业服务要求所有指定的端点使用 TCP 协议;不支持 HTTP/HTTPS 协议。
备注
Snowflake 对公共访问执行身份验证和授权检查,只允许有权限的 Snowflake 用户使用该服务。对端点的公共访问需要 Snowflake 身份验证。经过身份验证的用户还必须对该服务端点具有授权(用户对访问该端点的角色拥有使用权限)。
示例
以下是 教程 1 中使用的应用程序规范:
spec:
container:
- name: echo
image: <image-name>
env:
SERVER_PORT: 8000
CHARACTER_NAME: Bob
readinessProbe:
port: 8000
path: /healthcheck
endpoint:
- name: echoendpoint
port: 8000
public: true
此应用程序容器显示一个端点。它还包括一个可选的 public
字段,允许从 Snowflake 外部访问端点(互联网访问)。默认情况下,public
是 false
。
spec.volumes
字段(可选)¶
本节将介绍 spec.volumes
和 spec.containers.volumeMounts
规范字段,因为它们密切相关。
spec.volumes
定义共享文件系统。这些卷可以在您的容器中使用。spec.containers.volumeMount
定义卷在特定容器中显示的位置。
请注意,volumes
字段在 spec
级别指定,但由于多个容器可共享相同的卷,因此 volumeMounts
成为 spec.containers
级别的字段。
使用这些字段来描述卷和卷挂载。
spec.volumes
:可以有零个或多个卷。使用以下字段描述卷:所有卷类型的必填字段:
name
:卷的唯一名称。该名称请参考spec.containers.volumeMounts.name
。source
:这可以是local
、memory
、block
或"@<stagename>"
。下一节将介绍这些卷类型。size`(仅对 ``memory`
和block
卷类型为必需):对于内存和块卷,这是卷的大小(以字节为单位)。对于块存储,该值必须始终是一个整型,使用 Gi 单位后缀指定。例如,5Gi
表示5*1024*1024*1024
个字节。
对于
block
类型的卷,您可以指定以下可选字段。有关更多信息,请参阅 在服务规范中指定块存储。blockConfig.initialContents.fromSnapshot
:指定先前拍摄的另一个卷的快照以初始化块卷。快照必须处于 CREATED 状态,才能用于创建卷,否则服务创建将失败。使用 DESCRIBE SNAPSHOT 命令获取快照的状态。blockConfig.iops
:指定每秒支持的峰值输入/输出操作的数量。在 AWS 中支持的范围为 3000-16000,在 Azure 中支持的范围为 3000-80000,默认值为 3000。请注意,对于块卷,每项操作的数据大小限制为 256 KiB。blockConfig.throughput
:指定峰值吞吐量(以 MiB/秒为单位),以便为卷预置。在 AWS 中支持的范围为 125-1000,在 Azure 中支持的范围为 125-1200,默认值为 125。
spec.containers.volumeMounts
:每个容器可以有零个或多个卷挂载。containers.volumeMounts
也是一个列表。也就是说,每个容器可以有多个卷挂载。使用以下字段来描述卷装载:name
:要挂载的卷的名称。单个容器可以多次引用同一卷。mountPath
:容器中应挂载的卷的文件路径。
关于支持的卷类型¶
Snowflake 支持应用程序容器使用以下这些卷类型:本地、内存、块和 Snowflake 暂存区。
本地卷: 服务实例中的容器可使用本地磁盘来共享文件。例如,如果应用程序有两个容器 – 一个应用程序容器和一个日志分析器,则应用程序可将日志写入本地卷,而日志分析器可读取日志。
请注意,如果您正在运行一个服务的多个实例,则只有属于一个服务实例的容器才能共享卷。属于不同服务实例的容器不共享卷。
内存: 您可以使用 RAM 支持的文件系统供容器使用。
块: 容器也可以使用块存储卷。有关更多信息,请参阅 将块存储卷与服务一起使用。
Snowflake 暂存区: 您还可以让容器方便访问账户中 Snowflake 暂存区上的文件。有关更多信息,请参阅 将 Snowflake 暂存区卷与服务搭配使用。
示例
机器学习应用程序包括以下两个容器:
一个适用于主应用程序的
app
容器一个收集日志并将其上传到 Amazon S3 的
logger-agent
容器
这些容器使用以下两个卷:
local
卷:此应用程序写入日志代理读取的日志。Snowflake 暂存区 –
@model_stage
:主应用程序从此暂存区中读取文件。
在以下示例规范中,app
容器挂载 logs
和 models
两个卷,而 logging-agent
容器仅挂载 logs
卷:
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage"
如果服务的多个实例正在运行,则一个服务实例中的 logging-agent
和 app
容器共享 logs
卷。logs
卷不在服务实例之间共享。
如果除这些卷之外,您的 app
容器还使用一个 2-GB 内存的卷,请修改规范,以将该卷包含在 volumes
列表中,并在 app
容器 volumeMounts
列表中添加另一个卷挂载:
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: my-mem-volume mountPath: /dev/shm - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage" - name: "my-mem-volume" source: memory size: 2G
请注意,当您指定 memory
作为卷 source
时,您还必须指定 volumes.size
字段来表示内存大小。有关您可以指定的内存大小单位的信息,请参阅 关于单位。
关于挂载卷上的文件权限¶
挂载 Snowflake 暂存区或块存储卷的容器通常以根用户身份运行。但是,有时您的容器可能会以非根用户身份运行。例如:
如果应用程序使用第三方库,则该库将使用非根用户在容器内运行应用程序代码。
出于安全性等其他原因,您可以在容器内以非根用户身份运行应用程序。
为避免与文件用户权限相关的潜在错误,将容器的 UID(用户 ID)和 GID(组 ID)设置为规范的一部分非常重要。这对于使用特定用户和组在容器内启动或运行应用程序的容器来说,这一点尤为重要。通过设置适当的 UID 和 GID,您可以使用以非根用户身份运行的容器。例如:
spec:
...
volumes:
- name: stagemount
source: "@test"
uid: <UID-value>
gid: <GID-value>
Snowflake 使用此信息以适当的权限挂载暂存区。
要获取容器的 UID 和 GID,请执行以下步骤:
使用
docker run
在本地运行容器。使用
docker container list
命令查找容器 ID。部分样本输出:CONTAINER ID IMAGE COMMAND —---------------------------------------------------------- a6a1f1fe204d tutorial-image "/usr/local/bin/entr…"
在容器内运行
docker id
命令来获取 UID 和 GID:docker exec -it <container-id> id
示例输出:
uid=0(root) gid=0(root) groups=0(root)
spec.logExporters
字段(可选)¶
Snowflake 会收集应用程序输出到标准输出或标准错误的内容。有关更多信息,请参阅 访问本地容器日志。 使用 spec.logExporters
来配置 Snowflake 将哪些输出导出到 事件表。
logExporters:
eventTableConfig:
logLevel: < INFO | ERROR | NONE >
支持的 logLevel
值为:
:code:`INFO`(默认):导出所有用户日志。
ERROR
:仅导出错误日志。Snowflake 仅导出标准错误 (stderr) 流中的日志。NONE
:不将日志导出到事件表中。
spec.platformMonitor
字段(可选)¶
个别服务发布指标。这些 Snowflake 提供的指标也称为平台指标。您在规范中添加了 spec.platformMonitor
字段,指示 Snowflake 将服务的指标发送到为账户配置的事件表。此功能的目标用例是观察特定服务的资源利用率。
platformMonitor:
metricConfig:
groups:
- <group_1>
- <group_2>
...
group_N
指的是您感兴趣的 预定义指标组。在服务运行期间,Snowflake 将指定组的指标记录到事件表中。然后,您可以从事件表中查询指标。有关更多信息,请参阅 监控服务。
关于单位¶
服务规范在多个地方采用数值。支持使用多种单位来表示这些值。对于大值和小值,您可使用二进制和十进制单位,如下所示。在以下列表中,“#”表示整数值。
二进制单位:
numberKi
表示number*1024
。 例如,4Ki 等于 4096。numberMi
表示number*1024*1024
。numberGi
表示number*1024*1024*1024
。
十进制单位:
numberk
表示number*1000
。例如,4k 等于 4000。numberM
表示number*1000*1000
。numberG
表示number*1000*1000*1000
。
小数单位:
numberm
表示number*0.001
。例如,cpu: 500m
相当于cpu: 0.5
。
serviceRoles
字段(可选)¶
使用规范中的 serviceRoles
顶级字段来定义一个或多个服务角色。对于每个服务角色,提供您希望服务角色授予 USAGE 权限的一个或多个端点的名称和列表(在 spec.endpoints
中定义)。
serviceRoles: # Optional list of service roles
- name: <name>
endpoints:
- <endpoint-name>
- <endpoint-name>
- ...
- ...
请注意以下事项:
name
和endpoints
都是必填项。服务角色名称须遵循以下格式:
必须包含字母数字或
_
字符。必须以字母字符开头。
必须以字母数字字符结尾。
有关更多信息,请参阅 管理对服务端点的访问。