-
云上一分钟,上云更轻松。当您使用华为云弹性云服务器搭建了一个应用,想让别人访问时,发现…..咦?怎么访问不了呢?回忆一下,是不是购买弹性云服务器进行网络配置时,安全组直接是默认配置了? 那么问题来了安全组是什么呢?怎么配置呢?猛戳以下视频一起学习如何配置安全组~ 点击“了解更多”,学习更多安全组知识。加关注,不迷路!下期见~
-
作者 : 华为云CC服务团队1 网络拓扑结构拓扑结构如图 1.1 组网规划北京4 VPC:同VPC内两个子网网段192.168.0.0/24、192.168.30.0/24OpenVPN主机:属于北京四VPC,双网卡配置、其中一个网卡绑定EIPSSL Server:OpenVPN提供服务,下发DHCP 10.8.0.0/16,通过入云接入服务香港VPC:客户员工希望跨Region访问的VPC,VPC子网10.0.0.0/241.2 实现目标个人PC可通过OpenVPN客户端连接Server端通过建立的SSLVPN练练可访问Server所在VPC资源;可通过CC访问云上其它Region的VPC资源2 Server端部署2.1 基础环境建设按照图示拓扑,在北京四创建VPC,指定相应子网,创建ECS。推荐ECS规格4vCPUs | 8GB以上,选择两块网卡分别隶属于不同的子网,主网关绑定EIP。完成CC服务创建,按照子网规划添加网络实例和路由,完成基础配置后开始部署OpenVPN Server,部署前请在安全组规则中放通所需协议端口。2.2 安装Server端通过yum install安装最新版本的server和密钥软件,本实例按照软件版本分别为openvpn-2.4.9-1.el8.x86_64与easy-rsa-3.0.7-1.el8.noarch。yum 安装命令如下:yum -y install openvpnyum -y install easy-rsa2.3 配置证书密钥cp -r /usr/share/easy-rsa/3.0.7 /etc/openvpn/server/easy-rsacd /etc/openvpn/server/easy-rsa./easyrsa init-pki #初始化pki目录./easyrsa build-ca nopass #创建CA证书./easyrsa build-server-full server nopass #生成服务器端秘钥./easyrsa build-client-full client1 nopass #生成客户端密钥./easyrsa build-client-full client2 nopass #可选,创建第二个客户端证书./easyrsa gen-dh #生成Diffie-Hellman文件openvpn --genkey --secret ta.key #HMAC防火墙,防止DDOS攻击2.4 创建目录与配置文件创建日志存放目录mkdir -p /var/log/openvpn/创建用户管理目录mkdir -p /etc/openvpn/server/user配置权限chown openvpn:openvpn /var/log/openvpn在/etc/openvpn/server目录下使用vi service.conf创建配置文件,并添加配置信息如下################################################## This file is for the server side ## of a many-clients <-> one-server ## OpenVPN configuration. ## ## Comments are preceded with '#' or ';' ##################################################port 2238proto udpdev tunuser rootgroup rootca /etc/openvpn/server/easy-rsa/pki/ca.crtcert /etc/openvpn/server/easy-rsa/pki/issued/server.crtkey /etc/openvpn/server/easy-rsa/pki/private/server.keydh /etc/openvpn/server/easy-rsa/pki/dh.pemtls-auth /etc/openvpn/server/easy-rsa/ta.key 0 auth-user-pass-verify /etc/openvpn/server/user/checkpsw.sh via-envscript-security 3verify-client-certusername-as-common-name client-to-clientduplicate-cnserver 10.8.0.0 255.255.0.0 push "route 192.168.30.0 255.255.255.0"push "redirect-gateway def1" “慎用”push "dhcp-option DNS 8.8.8.8"push "dhcp-option DNS 8.8.4.4" compress lzoauth SHA512cipher AES-256-CBC;ncp-ciphers "AES-256-GCM:AES-128-GCM" keepalive 10 120 max-clients 100persist-keypersist-tunverb 3log /var/log/openvpn/server.loglog-append /var/log/openvpn/server.logstatus /var/log/openvpn/status.log2.5 设置环境变量注意!这里创建完配置文件后,需要做个配置文件的软连接,因为当前版本的 openvpn systemd 启动文件中读取的是.service.conf配置。cd /etc/openvpn/server/ln -sf server.conf .service.confCentos默认没有使能MD5,Centos 7移除了Openssl的MD5支持,openssl仍然默认以md5作为散列算法并且可以正确识别md5散列算法export OPENSSL_ENABLE_MD5_VERIFY=1export NSS_HASH_ALG_SUPPORT=+MD52.6 创建用户密码文件格式是用户、密码以空格分割即可tee /etc/openvpn/server/user/psw-file << EOFmytest mytestpassEOFchmod 660 /etc/openvpn/server/user/psw-filechown root:root /etc/openvpn/server/user/psw-file 不校验密码检查脚本vi /etc/openvpn/server/user/checkpsw.sh#!/bin/bashexitchmod o+x /etc/openvpn/server/user/checkpsw.sh2.7 启动server及调试查看service名rpm -ql openvpn | grep service/usr/lib/systemd/system/openvpn-client@.service/usr/lib/systemd/system/openvpn-server@.service启动systemctl start openvpn-server@.service.service echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #开启路由转发能力/sur/sbin/sysctl –p #验证开启功能检查服务状态systemctl status openvpn-server@.service.service查看服务日志vim /var/log/openvpn/server.log2.8 选择模式[主推]代理模式:在openvpn server虚拟机中,配置iptables规则,需要进行源地址转换策略添加。openvpn server虚拟机网卡不用关闭源目的地址检查透传模式:设置VPC路由,找到openvpn-server-vpc 路由表,添加vpc路由openvpn server:需要关闭openvpn server 网卡的源目的地址检测。2.9 Server端策略路由配置策略路由表/etc/iproute2/rt_tables配置策略路由/etc/rc.local查看策略路由source /etc/rc.local 查看结果2.10 CC配置更新:北京4 云连接实例,增加10.8.0.0/16 为openvpn tunnel网络路由3 Client端部署3.1 Linux client配置执行yum -y install openvpn,软件包版本openvpn-2.4.9-1.el8.x86_64,依赖包:pkcs11-helper-1.22-7.el8.x86_64。将server端 /etc/openvpn/server目录及子目录下的ca.crt、client1.crt、client1.key、ta.key文件下载到client虚拟机 /etc/openvpn/目录,122.112.*.*为client 虚拟机公网地址/etc/openvpn/client.ovpn 可以自己写一个,也可以参考下面内容 client #客户端标识dev tun proto udp auth-user-passremote 121.36.*.* 2**8 server端EIP地址及端口resolv-retry infinitenobindpersist-keypersist-tunca ca.crtcert client1.crtkey client1.keyremote-cert-tls server;ns-cert-type servercomp-lzoauth SHA512cipher AES-256-CBCtls-auth ta.key 1verb 3执行启动openvpn client端的命令,如下:openvpn --daemon --config /etc/openvpn/client.ovpn --log-append /var/log/openvpn.log 在上述文件夹中写一个passwd.txt,第一行输入用户名,第二行输入密码。修改client.ovpn中auth-user-pass –> auth-user-pass passwd.txt 回显日志信息 /var/log/openvpn.log 查看路由信息:Linux client 虚拟机DNS 解析地址需要修改3.2 Windows client配置上传软件包:openvpn-install-2.4.9-I601-Win10将软件包安装后,找到其文件位置:将模板文件C:\Program Files\OpenVPN\sample-config\sample.ovpn 复制到C:\Program Files\OpenVPN\config,重命名为client.ovpn 进行修改文件内容, 配置文件内容:和linux client客户端配置文件内容一致完成虚拟网卡命名:控制面板 -> 所有控制面板项-> 网络连接,将新添加的虚拟网卡,命名为tap2配置DNS地址解析及结果验证:在主网卡上进行,以及需要重启虚拟机,打开客户端软件,进行连接,成功标志查看路由信息:会把默认流量通过出接口重定向公网出口,默认路由分为0.0.0.0/1和128.0.0.0/1两个段,本端隧道地址:10.8.0.14,对端隧道地址:10.8.0.13<测试没什么作用,不影响。4 附件-配置参数说明4.1 Server配置参数解释/etc/openvpn/server/server.conf文件client-to-client如果允许openvpn客户端之间通信需要配置这个选项,如果不允许openvpn客户端之间互相通信可以注释掉这个配置选项。duplicate-cn允许一个openvpn客户端账号同时多个系统/电脑登陆。类似于一个qq账号同时手机和电脑登陆。只不过这个功能更厉害,是多个电脑同时登陆。 如果想一个客户端只允许同时在线一个客户端,可以注释掉这个配置max-clients 100定义最大客户端并发连接数量keepalive 10 120openvpn server 10秒尝试连接一次客户端,检查客户端是否存活。如果OpenVPN server连续120秒没有收到客户端回复则认为客户端掉线。 ifconfig-pool-persist ipp.txtopenvpn客户端登陆的账号和分配的IP记录在这个文件中。这样客户端再次登陆时可以使用相同的IP地址。ipp.txt文件默认10分钟回写一次,如果想要两秒回写,那么在后面加个2:ifconfig-pool-persist ipp.txt 2ipp.txt记录格式:CN用户名,子网网络地址。这个子网网络地址一般都是30位地址。例如:10.8.0.4,这个网络地址的第一个IP是10.8.0.5,这是这个子网段的dhcp,然后下一个才是客户端的IP,也就是10.8.0.6 comp-lzo数据传输之前使用lzo压缩数据,这样节约链路带宽,但是会加大服务器的CPU开销。persist-key通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。persist-tun通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的。否则网络连接,会先linkdown然后再linkup。proto udpopenvpn客户端和服务器数据传输使用udp协议。使用什么协议根据具体应用结合分析。一般语音会使用udp,如果使用tcp会因为 丢包重传而出现杂音现象。在多机房数据备份时建议使用tcp协议,不建议使用udp,因为udp协议没有重传机制。port 2238openvpn客户端连接openvpn server时的openvpn server的服务端口。类似ssh的22端口。默认是:1194,建议修改成10000以上的自定义端口。dev tun定义openvpn运行时使用哪一种模式,openvpn有两种运行模式一种是tap模式,一种是tun模式。 tap模式也就是桥接模式,通过软件在系统中模拟出一个tap设备,该设备是一个二层设备,同时支持链路层协议。 tun模式也就是路由模式,通过软件在系统中模拟出一个tun路由,tun是ip层的点对点协议。 一般网络电话等语音通信因为运营商屏蔽而使用openvpn时会使用tap,如果日常使用基本区别不大。verb 3日志冗余级别。 ca /etc/openvpn/keys/ca.crtcert /etc/openvpn/keys/server.crtkey /etc/openvpn/keys/server.key # This file should be kept secretdh /etc/openvpn/keys/dh1024.pemca定义ca证书文件路径,cert定义服务器证书路径,key定义服务器端key文件,dh定义哈夫曼散列值文件。这些文件可以用相对路径或绝对路径定义。auth SHA512认证算法cipher AES-256-CBC加密算法server 10.8.0.0 255.255.255.0定义openvpn链接后客户端和服务器通信使用的局域网IP的地址池范围。可以自定义。push “redirect-gateway def1”使客户端改变默认路由指向push “route 192.168.10.0 255.255.255.0”向客户端推送的路由信息,假如客户端的IP地址为10.8.0.2,要访问192.168.10.0网段的话,使用这条命令就可以了。tls-auth /etc/openvpn/keys/ta.key 0开启TLS,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。user nobodygroup nogroup定义openvpn运行时使用的用户及用户组log-append openvpn.log记录日志,每次重新启动openvpn后追加原有的log信息。mute 20重复日志记录限额log /var/log/openvpn/server.loglog-append /var/log/openvpn/server.logstatus /var/log/openvpn/status.log4.2 Client 配置参数解释client定义这是一个client,配置从server端pull拉取过来,如IP地址,路由信息之类,Server使用push指令推送过来。dev tun定义openvpn运行的模式,这个地方需要严格和Server端保持一致。proto tcp定义openvpn使用的协议,这个地方需要严格和Server端保持一致。remote 121.36.88.201 2238设置Server的IP地址和端口,这个地方需要严格和Server端保持一致。 如果有多台机器做负载均衡,可以多次出现remote关键字。可以使用域名remote-random随机选择一个Server连接,否则按照顺序从上到下依次连接。该选项默认不启用。resolv-retry infinite始终重新解析Server的IP地址(如果remote后面跟的是域名),保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址。这样无需人为重新启动,即可重新接入VPN。nobind定义在本机不邦定任何端口监听incoming数据。persist-keypersist-tunca ca.crt定义CA证书的文件名,用于验证Server CA证书合法性,该文件一定要与服务器端ca.crt是同一个文件。cert client1.crt定义客户端的证书文件。key client1.key定义客户端的密钥文件。ns-cert-type serverServer使用build-key-server脚本生成的,在x509 v3扩展中加入了ns-cert-type选项。防止client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server,因为他们的CA里没有这个扩展。comp-lzo启用允许数据压缩,这个地方需要严格和Server端保持一致。auth SHA512认证算法cipher AES-256-CBC加密算法tls-auth ta.key 1开启TLS,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。verb 3设置日志记录冗长级别。
shangwubadian
发表于2020-09-15 09:36:18
2020-09-15 09:36:18
最后回复
shangwubadian
2020-09-15 09:36:18
7602 0 -
常常有童鞋做完任务领了奖励就挥一挥衣袖不带走一片云彩但是!!创建的资源没有删,它它它就一直在扣费啊,心痛!所以小助手在这出个删除【ELB+集群+VPC】的教程,避免大家有不必要的损失。删除资源秘笈一、首先删除我们创建的环境(这个免费)二、其次删除ELB负载均衡器(这个正在扣钱)先删除监听器:listener-test01和listener-HTTP然后返回负载均衡器页面删除ELB,记得一定要勾选【释放该负载均衡绑定的弹性公网IP,不然要再去删一遍弹性IP,切记】三、然后删除k8s集群(这个扣钱最多)注意:如果是购买的包年包月,则无需操作,包租期类型的资源到期之后会自动释放先在基础设施下找到K8S集群,单击要删除集群的“更多”下的删除集群然后勾选图上内容,输入“DELETE”确认删除即可四、再然后删除弹性IP(扣钱ing)先在左上角服务下找到虚拟私有云VPC,并进入控制台然后在弹性公网IP和带宽下找到弹性公网IP,如果操作需要解绑,那就先解绑再删除,如果不需要解绑,就直接点更多里面的删除即可。五、最后删除VPC(这个免费)先在基础设施下找到虚拟私有云(VPC),单击要VPC的名称找到子网并删除,才能删除VPC注意,出现如下提示,是因为集群还没完全删除,需要【休息休息一下】,等待集群删除完成就可以啦!集群删除成功后,单击操作中的删除,子网也可以删除了最后在虚拟私有云页面删除VPC即可好啦,本次的保姆级删除资源教程就到这里,还有啥问题可以直接社区发帖求助哦,小助手不会的,大神来帮忙!
-
资源创建之创建VPC、CCE集群和ELB创建虚拟私有云以及子网 步骤 1 登录控制台,选择“虚拟私有云”。 步骤 2 单击“创建虚拟私有云”。 步骤 3 在“创建虚拟私有云”页面,根据界面提示配置虚拟私有云参数。 表1-1 创建虚拟私有云参数配置 其它使用默认配置,单击“立即创建”。 ----结束 至此您已经快速创建一个虚拟私有云。快速创建Kubernetes混合集群 步骤 1 登录控制台,在左侧导航栏中单击“基础设施 > K8S集群(CCE)”,单击“创建Kubernetes集群”,单击 “创建混合集群”,进入购买混合集群页面。 步骤 2 在购买混合集群页面的“服务选型”步骤中配置集群参数: 表1-2 创建集群参数配置 其它使用默认配置,单击“下一步:创建节点”进入“创建节点”步骤。 步骤 1 在“创建节点”步骤中,配置如下参数: l 计费模式:跟随集群的计费方式。 l 可用区:选择“可用区1”。 l 节点名称:cluster-test01-node01。 l 节点规格选择“2核8GB”,如下图: l 其它使用默认配置 步骤 2 单击“下一步:安装插件”,使用默认配置。 步骤 3 单击“下一步:配置确认”,勾选“使用说明”的“我已知晓上述限制”。 步骤 4 确认规格和费用后,单击“去支付”。 勾选领取的代金券并完成订单即可。 集群创建预计需要6-10分钟,您可以单击“返回集群管理”进行其他操作或单击“查看集群事件列表”后查看集群详情。 ----结束 至此,您已经快速创建一个Kubernetes集群。快速购买弹性IP并绑定集群 步骤 1 登录控制台,在左侧导航栏中单击“弹性公网IP和带宽 > 弹性公网IP”,单击“购买弹性公网IP”,选择 “共享负载均衡”,进入购买弹性负载均衡页面。 步骤 2 在购买弹性IP页面中配置如下参数: 步骤 3 单击“立即购买”,确认参数并提交。 步骤 4 在绑定弹性公网IP:在“弹性公网IP”界面待绑定弹性公网IP地址所在行,单击“绑定”。选择实例。单击“确定”。 ----结束 至此,您已经快速创建一个弹性公网IP并绑定实例。快速创建ELB负载均衡器 步骤 1 登录控制台,在左侧导航栏中单击“弹性负载均衡 > 负载均衡器”,单击“购买弹性负载均衡”,选择 “共享负载均衡”,进入购买弹性负载均衡页面。 步骤 2 在购买弹性负载均衡页面中配置参数: 表1-1 购买弹性负载均衡参数配置 其它使用默认配置,单击“立即购买”。 步骤 3 负载均衡创建完成后,需要配置监听器。在左侧导航栏中单击“弹性负载均衡 > 负载均衡器” 步骤 4 在刚才创建的负载均衡的“监听器(前端协议/端口)”一列点击“点我开始配置”。 步骤 5 在“监听器”页签单击添加监听器,配置如下: l 前端协议/端口: TCP/31543 l 名称:server_group-test01。 l 其它使用默认配置 步骤 7 单击“完成”,ELB配置成功。 ----结束 至此,您已经快速创建一个ELB负载均衡器。
-
最近几个月,我的变化其实还蛮大的,从一个被实习生“无视”的“前浪”,转变成了不仅能够解决技术问题还能解决业务问题(顺手还能帮实习生解决恋爱问题)的“前辈”。前面几期故事记录了我的高光时刻,有兴趣可以点击前文查看(https://bbs.huaweicloud.com/forum/forum-1104-1.html)。 公司的短视频项目上线之后一直不温不火,老板挺着急,运营部提出要在6月底组织一次千人直播带货活动,邀请1千个主播同时在短视频平台上开直播,拉用户和流量。 千人同时在线直播,短视频平台的目标访问量在百万级以上,需要技术部门保证高并发流量下服务器的稳定。这个好办,华为云弹性云服务器是可以随时扩容的,经过部门研究,我们给出的技术方案是临时创建100台云虚拟机来支撑这次活动。 这个任务又光荣地落到了我的身上,谁让我是公司公认的云服务器专家呢…可离直播活动落地只有一个星期的时间了,还要留出时间进行压测。“通过API可以批量处理弹性云服务器,但我现在一个个接口封装也来不及啊!而且根据我的经验,还得提前做好随时扩容的准备,能够支持比预估目标更高的流量,得赶紧想想除了API还有什么可以用……”我心里有点着急了。 习惯性地打开华为云官网,在首页发呆了1分钟,一道灵光闪过:操作简单,可以快速控制批量资源,这可不就是SDK的特性吗!说来就来,我很快就有了思路:先快速创建100台按需计费的弹性云服务器作为直播支撑,在直播完成后,再对这些弹性云服务器进行释放。 打开API Explorer(https://apiexplorer.developer.huaweicloud.com/apiexplorer/overview?utm_source=apiwz&utm_medium=read )快速浏览,确认我需要用到的接口是CreatePostPaidServers 、 ListServerDetails 和DeleteServers。 万万没想到,这个设计还真起到了救急的作用! 直播开始前1个小时,运营部门突然反馈,这次活动的推广效果大大超出预期,峰值流量可能是预期目标的10倍!这将给网站访问带来很大的压力,老大给我打电话问我有没有办法处理。 这当然难不住我了,因为提前准备了技术方案,在直播过程中随着访问量的变化,随时批量调整服务器的配置,完美保障了直播的进行,最后在10倍于目标值的访问量下,依然没有出现任何卡顿/延迟的情况。 活动结束后,我又开始了疯狂输出,将SDK的配置方法写在了文档里: 一、前置条件:获取必填参数 1. 华为云SDK的认证方式为AK/SK认证,可以在华为云控制台”我的凭证-访问密钥”页面上创建和查看AK/SK。更多信息请查看访问密钥(https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html)。 2. 准备接口的必填参数PS:在华为云控制台-镜像服务IMS中可快速获取公共镜像相应的ID服务器配置详情:l 区域:华北-北京一 - cn-north-1l 可用区:可用区1 - cn-north-1al 规格:通用计算增强型 - c3.large.2l 镜像:Windows Server 2019数据中心版 64 位简体中文 - fb48d5c7-8718-489a-9273-d3e0e09c84d7l 服务器名:任意指定 - 如 "live-stream”l 系统盘类型:普通 IO 磁盘 – "SATA"l 虚拟私有云 ID(VPC ID):可获取当前账号在北京一区域中默认的 VPC ID,若没有默认 VPC 则新建l 网卡信息:可获取当前账号在北京一区域中默认 PC / 新建 VPC 下的子网 IDl 允许重名:当批量创建弹性云服务器时,云服务器名称是否允许重名,当count大于1的时候该参数生效 - false 二、实战演练PS:指南:https://github.com/huaweicloud/huaweicloud-sdk-java-v3/blob/master/README_CN.md 1. 新建maven项目,导入SDK的maven依赖<!-- add dependencies in pom.xml --><dependency> <groupId>com.huaweicloud.sdk</groupId> <artifactId>huaweicloud-sdk-core</artifactId> <version>[3.0.1-beta, 3.1.0-beta)</version></dependency><dependency> <groupId>com.huaweicloud.sdk</groupId> <artifactId>huaweicloud-sdk-ecs</artifactId> <version>[3.0.1-beta, 3.1.0-beta)</version></dependency>2. 批量创建弹性云服务器Demoimport com.huaweicloud.sdk.core.auth.BasicCredentials;import com.huaweicloud.sdk.core.http.HttpConfig;import com.huaweicloud.sdk.ecs.v2.EcsClient;import com.huaweicloud.sdk.ecs.v2.model.*; import java.util.LinkedList;import java.util.List; public class TestCreateEcs { public static void main(String[] args) { String ak = "{your ak string}"; String sk = "{your sk string}"; String projectId = "{your project id}"; String endpoint = "https://ecs.cn-north-1.myhuaweicloud.com"; HttpConfig config = HttpConfig.getDefaultHttpConfig().withIgnoreSSLVerification(true); BasicCredentials credentials = new BasicCredentials().withAk(ak).withSk(sk).withProjectId(projectId); EcsClient ecsClient = EcsClient.newBuilder().withCredential(credentials).withEndpoint(endpoint).withHttpConfig(config).build(); // 确认创建虚拟机的必填参数 String az = "cn-north-1a"; String flavorRef = "s3.medium.2"; String imageRef = "fb48d5c7-8718-489a-9273-d3e0e09c84d7"; String name = "live-stream"; String vpcId = "{you vpc id}"; // 网卡信息 PostPaidServerNic nic = new PostPaidServerNic().withSubnetId("{your subnet id}"); List<PostPaidServerNic> list = new LinkedList<>(); list.add(nic); // 系统盘信息 PostPaidServerRootVolume root = new PostPaidServerRootVolume().withVolumetype(PostPaidServerRootVolume.VolumetypeEnum.SATA); PostPaidServer servers = new PostPaidServer().withAvailabilityZone(az) .withFlavorRef(flavorRef) .withImageRef(imageRef) .withName(name) .withNics(list) .withRootVolume(root) .withVpcid(vpcId) .withCount(100) .withIsAutoRename(false); CreatePostPaidServersRequestBody body = new CreatePostPaidServersRequestBody().withServer(servers); CreatePostPaidServersRequest request = new CreatePostPaidServersRequest().withBody(body); CreatePostPaidServersResponse response = ecsClient.createPostPaidServers(request); System.out.println(response.toString()); }}3. 批量删除弹性云服务器Demo// Step1: 查询当前以"live-stream"为开头的虚拟机列表ListServersDetailsRequest listServersDetailsRequest = new ListServersDetailsRequest().withName("live-stream");ListServersDetailsResponse listServersDetailsResponse = ecsClient.listServersDetails(listServersDetailsRequest); // Step2: 构造删除请求中的ServerId列表List<ServerDetail> serversList = listServersDetailsResponse.getServers();List<ServerId> serverIdList = new ArrayList<>();for(ServerDetail server : serversList) { ServerId id = new ServerId().withId(server.getId()); serverIdList.add(id);} // Step3: 传入serverId列表,删除虚拟机DeleteServersRequestBody deleteServersRequestBody = new DeleteServersRequestBody().withServers(serverIdList);DeleteServersRequest deleteServersRequest = new DeleteServersRequest().withBody(deleteServersRequestBody);DeleteServersResponse deleteServersResponse = ecsClient.deleteServers(deleteServersRequest);活动取得了非常好的成绩,实现了短视频平台流量和用户增长的目标,但是这次老板居然没有表扬我,我还有些纳闷:难道老板已经习惯了我的优秀?过了几天,HR小姐姐递过来一张表让我签字,表上写着:“调薪申请表,调薪幅度30%”,老板已经签好了名字。 目前API Explorer平台(https://apiexplorer.developer.huaweicloud.com/apiexplorer/overview?utm_source=apiwz&utm_medium=read)已开放EI企业智能、计算、应用服务、网络、软件开发平台、视频等70+云服务,共上线2000+个API、6000+个错误码。在前期试运行期间,华为云API Explorer平台上的API接口也已被多家企业成功接入。点击查看详情:《API Explorer新功能上线:支持一键分享调用参数,从此定位接口问题只要一键转发就行了,现在试用还有码豆拿哦》华为云API Explorer平台在未来几个月会实现更多功能,比如支持SDK示例代码、CLI等特性,同时也会开放更多的云服务API接口,连接更多开发者实现创新、拓宽创新边界。【拓展阅读】【API进阶之路】因为不会创建云服务器,我被实习生摆了一道【API进阶之路】前浪的绝地反击与自我证明【API进阶之路】甩锅大会上,我是如何绝地求生的【API进阶之路】一个技术预案,让老板当场喊出了“奥利给”【API进阶之路】万万没想到,一个技术方案帮实习生追到了运营妹子!【API进阶之路】一个技术盲点,差点让整个项目翻车【API进阶之路】老板给我涨薪30%!如何通过SDK接口搞定千万级流量直播【API进阶之路】半天搞定百万条手机号归属地查询,竟影响了公司战略方向!【API进阶之路】无法想象!大龄码农的硬盘里有这么多宝藏【API进阶之路】高考要考口语?一场10w+刷屏活动是如何用多模态评测API做出来的【API进阶之路】帮公司省下20万调研费!如何巧用情感分析API实现用户偏好调研【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察【华为云API学习赛】为入门初学者量身定制的学习平台,以赛带学,学以致用。参赛、邀请都有丰富奖品,还有机会拿P40 5G手机~API入门学习赛·AI人脸识别l 报名地址l 奖项设置API入门学习赛·探险寻宝之旅l 报名地址l 奖项设置
-
作者:黄药师(黄隽)背景在某开发团队辅导的回顾会议上,团队成员对于优化估计具体方法上达成了一致意见。询问是否有什么具体的估计方法来做估算。问题分析回顾意见上大家对本次Sprint的效果做回顾,其中80%的成员对于本次Sprint的估算效果不满意,最终团队希望在下一个Sprint中,估算活动能有所改善。经了解,团队目前的估算方法很简单,基本上是架构师和团队中有丰富开发经验的成员一言堂。估算的速度也很快。对于有些有疑问的需求,开发成员也是保持沉默,草草认领了任务。团队迫切希望学习新的估算方法来优化目前的估算活动,因此分享几个具体的估算方法给团队实践,让他们自己选择适合、喜欢的估算方法是解决问题的关键。解决措施上篇《如何估算第三篇:利用故事点做估算》了解了什么是故事点后,我们来学习下具体的故事点估算的实践,感受一下估算。这里介绍最常用的两种估算方法:一个是计划扑克估算,另一个是敏捷估算2.0。下表内容展示了这两种估算方法在什么情形下选择。估算方法选择理由计划扑克估算ü 使不同技术水平和工作速度的人在估算结果上保持一致。ü 激发对工作项细节的思考,让所有假设都显露出来,充分了解工作项。ü 需要估算的用户故事量不是非常大(例如,500个就非常大,采用此方法会非常耗时)。敏捷估算2.0ü 通常耗费的时间会缩短。ü 需要估算的用户故事非常多。计划扑克估算在敏捷开发中,最典型的使用故事点做估算的方法是计划扑克(Planning Poker)。计划扑克由James Grenning在2002年首次提出。计划扑克集合了专家意见(Expert Opinion),类比(Analogy)以及分解(Disaggregation)这三种常用的估算方法,使团队通过一个愉快的过程快速而准确的得出估算结果。计划扑克的参与者是团队的所有成员。典型的敏捷团队规模推荐为7±2人,如规模比较大可以考虑拆分成为多个小团队各自独立进行估算。Product Owner也需要参加,但不参与估算。计划扑克开始时,每个参与估算的组员都会得到一副计划扑克,每一张牌上写有一个Fibonacci数字 (典型的计划扑克由12张牌组成:?,0, ½,1, 2, 3, 5, 8, 13, 20, 40, 100,∞,其中?代表信息不够无法估算,∞代表该用户故事太大)。开始对一个用户故事进行估算时,首先由Product Owner介绍这个用户故事的描述。过程中Product Owner回答组员任何关于该用户故事的问题。展开讨论时主持人(通常由Scrum Master担任)应注意控制时间与细节程度,只要团队觉得对用户故事信息已经了解到可以估算了,就应当中止讨论开始估算。所有问题都被澄清后,每一个组员从 扑克中挑选他/她觉得可以表达这个用户故事大小的一张牌,但是不亮牌,也不让别的组员知道自己的分数。所有人都准备好后,主持人发口令让所有人同时亮牌,并保证每个人的估算值都可以被其他人清楚的看到。经常会出现不同组员亮出的分值差距很大的现象。当出现有很多不同分值的时候,出分最高的人和出分最低的人需要向整个团队解释出分的依据。(主持人需要注意控制会议氛围,避免出现意见不一导致的攻击性言论。)所有的讨论应集中于出分者的想法是否值得团队其他成员进行更深入的思考。随后全组可以针对这些想法进行几分钟的自由讨论。讨论之后,团队进行下一轮的全组估算。一般来说,很多用户故事在进行第二轮估算的时候就能得到一个全组统一的分值,但是如果不能达到全组意见一致,那么就重复的进行下一轮直到得到统一结论。敏捷估算2.0(Agile Estimating 2.0)计划扑克是Scrum团队应用最广泛的敏捷估算方法,但是有时候计划扑克玩起来耗费比较多的时间,尤其是在十人左右的团队中。Ken Schwaber在他的书《Agile Project Management with Scrum》中指出,在进行迭代规划时,迭代计划环节应该控制为一个4小时的固定时间,但是从战术的角度看,如果一个会议持续4小时,大部分的参会者会有精疲力竭的感觉,并且很难保持持久的注意力。为了解决这个问题,Brad Swanson 和 Björn Jensen在上海Scrum Gathering (2010/4/19)上介绍了Agile Estimating 2.0技术。这个新的估算技术同样基于的专家意见,类比和分解,同样适用Fibonacci数列,但是它可以显著地缩短会议时间。它的估算过程大致分为主要四步,如下图所示:第一步:由Product Owner向团队介绍每一个用户故事,确保所有需求相关的问题都在做估算前得到解决。第二步:整个团队一起参与这个游戏。只有一个简单的游戏规则:一次仅由一个人将一个用户故事卡放在白板的合适位置上:规模小的故事在左,大的在右,一样大的竖向排成一列。整个团队轮流移动故事卡,直到整个团队都认同白板上的故事卡的排序为止。 第三步:团队将故事点(Story Point)分配给每个用户故事(列)。最简单的做法是使用投票来决定每个用户故事分配到哪一个Fibonacci数字。最后一步:使用不同颜色来区分影响估算大小的不同方面,并且重新考虑是否需要修改估算值。例如,我们使用红色来表示那些无法被自动化测试脚本覆盖的用户故事,因此那些用户故事需要一个更大的数字来容纳手工回归测试的代价。在国内一些企业多次实践Agile Estimating 2.0之后,反馈的结果还是令人兴奋。据称,团队对于估算的准确性更有信心了,并且只耗费原先的1/2时间。通过以上介绍,相信了解了如何使用用户故事来分析了解需求。在学习了估算的核心概念及故事点后,对于估算方法的实践也有了更深的体会。不论是计划扑克估算还是敏捷估算2.0都只是估算的一种实践,不是固定的唯一方法。只要理解估算的意义和核心概念,选择适合的方法就是没有问题的。另外补充一下,这里讲的估算偏重于用故事点估算,如果团队成员一致达成共识,用工时或理想人天效果更好,便可以尝试,给予团队试错的机会,说不定也有意想不到的收获。完成了估算后,我们需要对估算的内容进行管理。华为云DevCloud在用户故事或者Task中均有一个记录估算结果的属性,比如预计工时。所有工作项估算结果记录以后就可以以列表的方式进行查看。可以按处理人排序,查看每个成员认领的任务是否饱和。开发团队完成的工作内容可以时时更新实际数据,这样每轮迭代也可以就估算准确度进行统计和分析。看看估算结果和实际结果的差别,以便可以后续做估算调整和改善。参考附录Kenneth S. Rubin. Scrum精髓[M].北京:清华大学出版社。Mark C. Layton. 敏捷项目管理[M].北京:人民邮电出版社。估算系列文章【DevCloud · 敏捷智库】估算第一篇:利用用户故事了解需求【DevCloud · 敏捷智库】估算第二篇:利用核心概念解决估算常见问题【DevCloud · 敏捷智库】估算第三篇:利用故事点做估算
-
华为云关系型数据库RDS具有低成本、高性能、高安全性、高可靠性的优势。下面我来给大家详细解释一番……低成本即开即用您可以通过华为云官网实时生成目标实例,华为云关系型数据库服务配合弹性云服务器一起使用,通过内网连接华为云关系型数据库可以有效地降低应用响应时间、节省公网流量费用。弹性扩容可以根据您的业务情况弹性伸缩所需的资源,按需开支,量身定做。配合云监控(Cloud Eye)监测数据库压力和数据存储量的变化,您可以灵活调整实例规格。完全兼容您无需再次学习,华为云关系型数据库各引擎的操作方法与原生数据库引擎的完全相同。华为云关系型数据库还兼容现有的程序和工具。使用数据复制服务(Data Replication Service,简称DRS),可用极低成本将数据迁移到华为云关系型数据库,享受华为云数据库为您带来的超值服务。运维便捷RDS的日常维护和管理,包括但不限于软硬件故障处理、数据库补丁更新等工作,保障华为云关系型数据库运转正常。提供专业数据库管理平台,重启、重置密码、参数修改、查看错误日志和慢查询日志、恢复数据等一键式功能。提供CPU利用率、IOPS、连接数、磁盘空间等实例信息实时监控及报警,让您随时随地了解实例动态。高性能性能优化华为云多年的数据库研发、搭建和维护经验,结合数据库云化改造技术,大幅优化传统数据库,为您打造更高可用、更高可靠、更高安全、更高性能、即开即用、便捷运维、弹性伸缩的华为云数据库服务。优质的硬件基础华为云关系型数据库使用的是华为经过多年的研究、创新和开发,通过多重考验的服务器硬件,为用户带来稳定的、高性能数据库服务。SQL优化方案华为云关系型数据库提供慢SQL检测,用户可以根据华为云关系型数据库服务提出的优化建议进行代码优化。高端硬件投入关系型数据库使用的所有服务器硬件都经过多方评测,保证在性能和稳定性上都遥遥领先。高速访问关系型数据库可以配合同一地域的弹性云服务器一起使用,通过内网通信,缩短应用响应时间,同时节省公网流量费用。高安全性网络隔离通过虚拟私有云(Virtual Private Cloud,简称VPC)和网络安全组实现网络隔离。虚拟私有云允许租户通过配置虚拟私有云入站IP范围,来控制连接数据库的IP地址段。华为云关系型数据库实例运行在租户独立的虚拟私有云内,可提升华为云关系型数据库实例的安全性。您可以综合运用子网和安全组的配置,来完成华为云关系型数据库实例的隔离。访问控制通过主/子帐号和安全组实现访问控制。创建华为云关系型数据库实例时,华为云关系型数据库服务会为租户同步创建一个数据库主帐户,根据需要创建数据库实例和数据库子帐户,将数据库对象赋予数据库子帐户,从而达到权限分离的目的。可以通过虚拟私有云对华为云关系型数据库实例所在的安全组入站、出站规则进行限制,从而控制可以连接数据库的网络范围。传输加密通过TLS加密、SSL加密实现传输加密。使用从服务控制台上下载的CA根证书,并在连接数据库时提供该证书,对数据库服务端进行认证并达到加密传输的目的。存储加密通过静态加密、表空间加密对数据进行加密。华为云关系型数据库服务支持对存储到数据库中的数据加密后存储,加密密钥由数据加密服务的KMS进行管理。数据删除删除华为云关系型数据库实例时,存储在数据库实例中的数据都会被删除,任何人都无法查看及恢复数据。安全删除不仅包括数据库实例所挂载的磁盘,也包括备份数据的存储空间(通常为廉价的对象存储系统)。防DDoS攻击当用户使用外网连接和访问华为云关系型数据库实例时,可能会遭受DDoS攻击。当华为云关系型数据库安全体系认为用户实例正在遭受DDoS攻击时,会首先启动流量清洗的功能,如果流量清洗无法抵御攻击或者攻击达到黑洞阈值时,将会进行黑洞处理,保证华为云关系型数据库整体服务的可用性。安全防护华为云关系型数据库处于多层防火墙的保护之下,可以有力地抗击各种恶意攻击,保证数据安全,防御DDoS攻击、防SQL注入等。建议用户通过内网访问华为云关系型数据库实例,可使华为云关系型数据库实例免受DDoS攻击风险。高可靠性双机热备华为云关系型数据库服务采用热备架构,故障秒级自动切换。数据备份每天自动备份数据,上传到对象存储服务(Object Storage Service,简称OBS)。备份文件保留732天,支持一键式恢复。用户可以设置自动备份的周期,还可以根据自身业务特点随时发起备份,选择备份周期、修改备份策略。数据恢复支持按备份集和指定时间点的恢复。在大多数场景下,用户可以将732天内任意一个时间点的数据恢复到华为云关系型数据库新实例或已有实例上,数据验证无误后即可将数据迁回华为云关系型数据库主实例,完成数据回溯。
-
作为刚刚接触云计算的小伙伴,一定迫不及待的想买一台弹性云主机体验一把,一路下来很顺利,选配置、下单、官网远程登录成功。习惯用ssh工具的小伙伴一定不太喜欢那个web版的黑窗口,如何用ssh工具远程访问云主机呢?看到有不少初学者卡这里了,不是上不了网,就是无法远程访问。在这个互联网的时代网络安全尤为重要,华为云提供了全栈的安全保障措施,小伙伴们遇到的不是坑,是在购买ECS时为了确保安全,系统默认给的Sys-default安全组没有开放端口,或没有绑定EIP的原因。本文介绍了如何购买一个鲲鹏云主机,绑定EIP,介绍安全组的规则设置,一步一步指导初学者加入鲲鹏大家庭。第一步 购买ECS鲲鹏云主机1.1 注册华为云账户(https://www.huaweicloud.com/)略,购买鲲鹏ECS云主机,登录后点击控制台à计算à弹性云服务器ECSà购买弹性云服务器;根据您的需求可选择包月或按需计费,选择Region区域、可用区AZ可以随机分配;CPU架构,一定要选择鲲鹏计算(ARM架构),选择一款适合的配置。PS:这里只是为了跑一个demo选择1vCPU1GB足够了,正式开发环境建议用2vCPU4GB以上的配置。1.2 根据实际需求选择镜像类型,这里使用CentOS7.6 64bit with ARM,云硬盘先搞40GB,不够后边可以再扩充。对IO性能有要求,可以选择SSD或超高IO类型的云硬盘。1.3 云主机ECS和物理服务器一样运行在某个网络环境里,默认创新一个VPC虚拟专网(网段192.168.0.0),添加一块网卡,先自动分配IP地址。安全组是华为云提供的一种安全策略,可以保护VPC内的主机,设置访问策略;Sys-default(默认入方向禁止)、Sys-WebServer(开放web服务器常用的端口)、Sys-FullAccess(出和入全部不控制)。1.4 若你希望云主机能上网(访问互联网资源),需要购买一个EIP和网络带宽(和物理服务器一样)。如果这台云主机不需要对外提供服务,只在局域网内工作,暂时不购买需要时再绑定。1.5 给您的鲲鹏云主机起一个名字,如我们要在鲲鹏云主机上安装mysql5,就叫他esc-kp-mysql;设置root的账号和密码(一会儿登录时就用这个密码);云硬盘可以后边再设计。1.6 确定购买鲲鹏云主机,这是购买下单的最后一步了,列出所选的配置信息,因为没有绑定EIP,因此提示无法访问公网。这里可以一次购买多台相同配置的主机;参考价格一直跟随所选的配置在变化,点击立即购买完成下单。1.7 登录鲲鹏弹性云ECS主机,下单后几秒钟就能看到一台运行中状态的ECS主机了(这就是云的好处之一,可以按需随时购买,免去了物理主机买回来后,要上电安装系统等各种操作);点击远程登录就可以访问这台主机了。云主机不需要再手动安装操作系统,购买时通过选择镜像,华为云在创建ECS实例时会使用选择的镜像;用配置时设置的密码登录,可以看到属性的[xxxxxxx]# 命名提示符了。第二步 购买EIP远程登录云主机2.1 如果希望用ssh工具远程访问ECS需要绑定一个EIP(让你的云主机可以访问互联网),在控制台左侧选择弹性公网IPà购买弹性公网IP。2.2 根据需要选择计费方式,区域建议和ESC云主机在一个区域,线路有2种选择全动态BGP和静态BGP,对可用性要求不高时可选静态;公网带宽有3中选择,按带宽、流量和共享带宽,根据具体需求选择即可;设置带宽的大小,最后是带宽名称默认即可。2.3 下单确定购买后就可以绑定到ECS云主机上了(作用类似拉一条可以上网的宽带,并且连接到要上网的机器上,只是不需要购买和折腾那些光猫、路由器等硬件了)。2.4 用ssh工具远程连接ECS云主机,发现连不上也ping不同,在云主机Web控制台又可以ping通www.baidu.com,说明EIP肯定是工作正常的;华为云为了安全起见,默认安全组Sys-default入方向规则默认不允许,需要配置一下安全组,开放特定的端口以便ssh可以远程登录。在控制台左侧选择虚拟私有云VPCà访问控制à安全组;可以修改Sys-default或自己创建一个。2.5 创建一个安全组my-ssh并设置规则;入规则:允许ssh远程登录使用22端口;在入方向规则页签点击添加规则或使用快速添加规则选择一个(这里给出了几个常用远程访问开放端口规则)。出规则:全部允许;在出方向规则页签选择“一键放通”添加全部协议的出规则。2.6 修改我们ECS鲲鹏云主机的安全组规则,操作à更多à网络设置à更改安全组,把my-ssh安全组添加进去。可以有多个安全组,他们之间是合并关系。2.7 用ssh工具登录,快乐享用鲲鹏云弹性云主机吧。PS:按需付费时ECS关机会不收费,但云硬盘是会计费的(因为占用着存储资源)。
-
背景有些团队践行敏捷一段时间后,感觉回顾会议(Retrospective Meeting)时间太长,动辄2-3个小时,而且会议上走形式,会后无效果,那么如何才能让回顾会议有效果呢?问题分析在敏捷十二原则中提到:团队定期地反思如何能提高成效,并依此调整自身的举止表现。所以回顾的目的是为帮助团队定期改善工作,发现障碍和处理问题,从而实现持续改进。回顾想要实现的效果就是持续改进。回顾会议走形式,就无法保证改进计划的质量,没有计划后面的环节就都无从谈起。回顾会后没有执行、检查和调整,都会影响到改进的落地,就出现前面提到的会后无效果的情况。综上所述,要想回顾有效果需要具备两方面的条件:可行的改进项,也就是首先要保证改进计划(Plan)的质量;改进的落地执行,包括执行(Do)、检查(Check)和调整(Act)这几个环节。这样才是一个完整的过程,想要有效果就要做好回顾改进的PDCA。解决措施结合回顾的过程,我们首先需要通过做好会前和会中部分来保证产生可靠的计划;其次回顾会后要做好计划的执行、检查和调整来保证落地执行的效果。第一步:做好回顾的会前和会中工作,保证Plan的质量要保证Plan的质量,就要开好回顾会;开好回顾会,可以从会前和会中两个环节来考虑。会前可以从数据准备、会议设计和会议公约三个方面来考虑会议设计:确定回顾的重点。我们的会议不是大而全,而是小而精,要聚焦,在规定的时间盒内(建议1-1.5小时)产生可行的方案。会议的流程环节设计是为了保证会议按时完成和让会议有好的氛围,让大家都能积极参与。比如会议开始时的签到活动可以让大家聚焦到会议上,ESVP(Exploer,Shopper,Vacationer,Prisoner)的选择可以了解大家的心态;中间数据收集的时候通过事件时间线、表情图可以让团队对迭代情况建立共同背景,通过头脑风暴可以帮助大家发散思维,通过投票排序实现全员参与,共同承诺等等。关于会议的活动方式有很多,团队可以多积累一些。 数据准备:首先要准备迭代内改进情况的度量数据,这是为了回顾的Check和Act做准备的。其次要准备迭代内的度量数据,根据前面确认的回顾重点来准备数据,数据要客观真实。会议公约:公约制定最关键的要团队共创,而不是领导或者管理者一言堂。让每个人都参与制定,其实是为了形成团队的承诺,这样增加公约的效力。公约的内容是为了保证会议的顺利进行,比如守时,不玩手机,不开小会等,关键还是要团队共创。会中可以从引导者要求,营造氛围,改进项确定和结束回顾四个方面来参考引导者要求:这是很关键的一个角色,引导者的能力会决定会议时间和会议效果。可以是有经验的ScrumMaster或者团队成员。在引导的时候注意要中立,不要给出观点,参与讨论,这样会让自己忘了身份,忽视流程和时间的掌控。 营造氛围:会议的氛围影响团队成员的感受,决定他们的参与度和积极性。要营造一个安全的环境,确保团队成员可以放心的说出自己的心里话,不会瞻前顾后、欲言又止。通常参会人建议是团队和Scrum Master,关于管理者和PO或者其他外部人员想要参加,需要看团队的接受度,他们之间是否相互信任。还要营造一个放松的环境,可以准备团队喜爱的零食,还有做好会议设计和选择合适的引导者都会保证好的氛围。改进项确定:在确定改进项的时候,要团队共同决定,保证全员皆知,形成共识;其次要聚焦,选择可执行的1-2项,不要冒进贪多;最后是改进的目标要SMART(Specific,Measurable,Achievable,Relevant,Time-bound)。结束回顾:回顾的收尾也很重要。团队可以通过感谢卡的形式相互感谢,或者心流笔记表达感受,让团队成员之间彼此相互了解和感知,这是一个非常好的团队建设时机。还有就是要再次明确会议达成的改进项,并确认负责人,为后续的执行活动做好准备。第二步:做好回顾会后改进计划的Do、Check和Act,保证改进落地执行的效果有了高质量的Plan,回顾会后的Do、Check和Act也非常重要,每个环节缺一不可。Do的过程根据改进内容不同执行方式会有不同,同时在执行过程中增加一些实践,可以提高执行过程的效果。执行方式按照规则&纪律类、执行类和障碍类三种改进项类型进行阐述规则&纪律类:需要Scrum Maser和团队共同反复重申,慢慢形成团队统一的工作习惯和方式。比如工作项状态的及时更新,开会不迟到等。执行类:需要团队花费时间去执行,所以要放入Backlog。比如团队编码规范的改进,需要制定出统一标准,然后全员展开,并且跟踪检查执行情况。障碍类:是指对团队冲刺形成阻碍的事情,不需要团队成员花时间去改进,可以放入Scrum Master的管理清单中。如PO在计划会议前准备好Product Backlog,团队白板申请等,这些Scrum Master要和外部团队去沟通协作,并跟进行动的进展。执行过程中为了保证效果,可以参考以下几种做法可视化改进项:将改进的内容在团队的公共区域展示出来,让团队都清楚当前处在哪些阶段,需要做什么,如何做,注意什么。设立贡献墙:改进的工作都是迭代任务外的工作,大家关注度可能不同。对改进中积极参与者或者是取得进步大的人要进行公开鼓励,从而去带动大家的积极性,提升改进动力。预留改进时间:执行类的改进进入Backlog,就需要预估时间,因此要预留出改进的时间。不能既要求团队全力冲刺完成迭代任务,还要求团队额外做好改进,这是不现实的。某项工作完成的好坏取决于成员的能力和意愿两个方面,首先是需要有意愿,才能保证取得好的效果,不能在已经饱和的迭代任务外强加给团队改进工作,那样即使推行了也不会取得好的效果。结对实施改进:可以参考XP(eXtremeProgramming)中的结对编程的做法,结对实施改进。通过设立实施人和监督人,目的是保证改进的准时和高质量的完成。实施这个做法的前提还是要团队同意,一言堂强加不可。Check是落地执行的总结检查可以在执行改进所在的迭代回顾会进行,也可以单独设立改进回顾会。建议在执行改进所在的迭代回顾会,这样可以减少团队会议的频次。会上先对改进回顾,团队可以感受到回顾给团队带来的改变,团队的改进动力和参与度都会得到提升,会让大家对接下来的回顾会有更多的期待,会更有意愿去继续回顾和改进。Act是对总结检查的结果进行处理成功的经验加以肯定,并予以标准化;失败的教训也要总结,引起重视;没有解决的问题,在回顾会上团队决定是否提交给下一个PDCA循环中去解决。所以回顾带来的改进是阶梯式上升。整个PDCA循环不是在同一水平上循环,每循环一次,就解决一部分问题,取得一部分成果,团队就前进一步,水平就提高一步。到了下一次循环,又有了新的目标和内容,更上一层楼。如下图所示。改进是无止境、无终点的,在这个过程中团队会越来越好。最关键是开始的一点点进步。只有让团队看到效果,才会激发参与度和改进动力,让团队坚持去回顾,坚持去改进。敏捷回顾会议对团队非常重要,否则团队就可能在相同的问题上重蹈覆辙。愿我们都能坚持回顾,从一小步开始,不断进步。敏捷路上,你我同行!参考附录1. 敏捷原则2. Esther Derby. Diana Larsen.敏捷回顾:团队从优秀到卓越之道[M].3. Kenneth S. Rubin. Scrum精髓[M].4. MBA智库:戴明循环5.文章博客地址:https://bbs.huaweicloud.com/blogs/163478附件:【DevCloud • 敏捷智库】如何让敏捷回顾会议有效果,这样做就对了.pdf[hide]链接: https://pan.baidu.com/s/1-sFwsbIZdLi4851mje17SQ提取码: 5pxp[/hide]
-
提起用户故事拆分,我们听得最多的就是INVEST原则(关于INVEST原则可以参考文章“用户故事等于需求说明”——你一定没有写好用户故事),但是拿到一个较大的用户故事时,该如何拆分才能使得它满足Small的原则呢?这个是很多人面临的问题,今天和大家一起讨论一下。 首先,拆分可以参考以下流程:评估待拆分用户故事-按方法拆分-评估拆分结果。(文末有彩蛋,不要错过)评估待拆分用户故事拆分前,我们需要知道手中的用户故事是否需要拆分,就是目前是否已经符合了Small的原则。我们推荐一个用户故事在1-2天内能完成,最多不超过3天,则符合Small原则。有些地方给出的说法是1/5-1/10团队速率,这个算法和你每个迭代天数以及团队成员数有关系,所以我个人还是喜欢简单的说,1-2个工作日能完成算Small。在这种情况下如果你的用户故事已经符合了INVEST其他原则的话,那就没必要拆成多个用户故事了,因为再拆就增加了管理成本(这里不包括拆成多个task,task可以再多拆分的)。好,当你已经根据上面评估了用户故事,发现依旧需要拆分的话,那么可以按下面方法进行拆分。按方法拆分目前业界比较好的方法是Richard Lawrence的方法,原文请参考https://agileforall.com/patterns-for-splitting-user-stories/,下图英文原版为Lawrence创作,中文版是姜信宝为Lawrence翻译的,此处引用并对二人致以感谢。图片来自Lawrence官方原文里有作者的切分方式,这里我只根据我的理解选择更熟悉的例子,同时合并了其中一些方法。 方法一:按流程拆分作为有爱心的有财力的中国人,我可以从国外进口口罩捐给武汉。这个用户故事涉及的过程就很多了,需要找到国外可靠的口罩供应商,然后付款,运回国内,再送到武汉捐给指定医院等等。我们可以先分析整个用户故事成一个一个连续的流程,如果每个小流程作为一个用户故事,能对用户有价值,那我们就先这么拆开。结果比如下面l 作为有爱心的有财力的中国人,我可以寻找个国外的朋友帮忙寻找可靠的口罩来源。l 作为有爱心的有财力的中国人,我可以在这个来源付款购买指定数量的口罩。l 作为有爱心的有财力的中国人,我可以将口罩从外国运回国内。l 作为有爱心的有财力的中国人,我可以将口罩从国内某地送到武汉捐给医院。方法二:按操作种类划分作为有爱心的中国人,我可以在口罩购买平台上操作以完成购买。如果是一个业务更简单的系统的话,对应的就是增删改查动作。这里的操作会复杂些,把每个操作拆分成一个用户故事即可。l 作为有爱心的中国人,我可以在口罩购买平台上购买。l 作为有爱心的中国人,我可以在口罩购买平台上退货。l 作为有爱心的中国人,我可以在口罩购买平台上查询。l 作为有爱心的中国人,我可以在口罩购买平台上卖货。方法三:拆出主要的工作作为有爱心的中国人,我可以购买N95/KN95/医用外科三种口罩进行捐赠。整个购买捐赠流程就很复杂了,还要买不同种类的口罩,明显这三种口罩可以拆成三个故事,同时考虑一点,就是无差别的完成购买一个口罩进行捐赠的故事后,剩下的两种需要的工作量就会很少了,同时这里如果没有区分三种口罩的优先级的话,我们可以先拆出一个作为主要工作,再看剩下的两个是合到一起还是继续拆分。比如拆成如下l 作为有爱心的中国人,我可以购买其中一种(N95/KN95/医用外科)口罩进行捐赠。(3个故事点)l 作为有爱心的中国人,我可以购买另外一种(N95/KN95/医用外科)口罩进行捐赠。(1个故事点)l 作为有爱心的中国人,我可以购买最后一种(N95/KN95/医用外科)口罩进行捐赠。(1个故事点)如果后两个都比较小,合道一起也没问题的话,也可以拆成如下l 作为有爱心的中国人,我可以购买其中一种(N95/KN95/医用外科)口罩进行捐赠。(3个故事点)l 作为有爱心的中国人,我可以购买另外两种(N95/KN95/医用外科)口罩进行捐赠。(2个故事点)方法四:业务规则分类作为有爱心的中国人,我可以购买三十万个口罩捐赠给武汉。这里购买的口罩可以选择多种类型,价格不一样,效果不一样,这就是我们要区分的不同的业务规则,拆分后可能如下l 作为有爱心的中国人,我可以购买三十万个最贵的口罩捐赠给武汉。l 作为有爱心的中国人,我可以购买三十万个口罩捐赠给武汉,不区分口罩种类。l 作为有爱心的中国人,我可以购买三十万个口罩捐赠给武汉,只要N95和KN95级别的。方法五:简单到复杂作为有爱心的中国人,我可以购买口罩捐赠给武汉。简单一句话,涉及的业务可以是购买何种口罩,如何捐赠,给什么机构等,明显不能作为一个故事进行交付,需要拆分。但是业务太复杂,一开始无法全都想清楚,可以先做最基本的,然后再根据方法四的业务规则分类进行扩展。l (简单)作为有爱心的中国人,我可以购买口罩捐赠给武汉。l (复杂)在XXX日期购买。l (复杂)通过不同的运输通道送到武汉。l (复杂)捐赠给XXX不同的医院。方法六:推迟性能实现作为有爱心的中国人,我可以明天购买口罩捐赠给武汉。明天这个性能太高了,实现起来可能比较困难,我们先实现购买和捐赠,不考虑哪天能完成,再考虑明天这个性能要求。l 作为有爱心的中国人,我可以购买口罩捐赠给武汉。l 作为有爱心的中国人,我可以明天购买口罩并完成捐赠给武汉。方法七:探针作为有爱心的中国人,我可以明天购买口罩捐赠给武汉。这个可能对我来说太复杂了,完全不知道该买什么类型的口罩,买30万个大概多少钱,渠道买比较靠谱,怎么捐赠,给哪个机构,如果现在就强行做计划的话,可能最后发现,我手上的钱是不够的,或者周期太长,到最后才发现的话,会损失很多。所以一般都是先去探探路。l 调查市场上口罩类型、价格、渠道。l 调查捐赠方式,靠谱的接受机构。l 实施捐赠(需要等前面的工作完毕后重新评估) 评估拆分结果拆分完毕后,再用INVEST原则进行评估,如果符合,那就没问题了。但是有的时候会不符合其中某些原则,比如独立性,但是实际业务就只能这样。比如上面提到的方法三的拆分,这个是必然有关系的,不可能先做第二个用户故事后做第一个。这时只能选择不符合独立性原则。 彩蛋看了上面这么多拆分方法,是否迷糊了?是否每次拆分都要对照上面的方法一个一个的试?其实不需要的,根据经验,拆分用户故事最重要的是,先捋清楚整个业务(划重点,这个最重要,之前很多例子你感觉切分的不如作者好,都是因为对举例的业务不熟悉),然后按照最重要的原则-纵着切即可。如下图所示。图片来自网络纵着切的意思是,每个切分出来的需求是个单独对用户有价值的,就像上图中切出来的一块蛋糕,是独立的个体,包括这一块蛋糕的所有层次以及上面的小人。对比的横着切的意思是所有的需求放一起将前台、后台、数据库操作这样切分出来,结果就是先用几个迭代将所有的需求前台工作做完了,再开发后台的,这样无法尽早交付有价值的需求,比如先将蛋糕上上所有的小人都切下来了。如果业务比较复杂,那么就以MVP的思想,先交付一个简单的端到端的业务,再慢慢扩展复杂程度。如果过于复杂,就尝试探针方法。如果捋清楚了需求,尝试纵着切,发现很难下手,这时候再来看上面提到的Lawrence的七个方法,寻求帮助。
-
背景某公司在二手房交易平台项目中采用了敏捷开发模式,项目的一个需求为通过输入关键字可以为用户检索对应的房源信息。产品经理将这个需求编写成用户故事如下:“我想通过输入一些词,查询相关的房源信息”开发团队拿到用户故事后,有很多疑问:输入的信息包含哪些?搜索完成后,给用户展示什么信息?在展示效果上,只做一个查询房源信息的搜索框,能否满足用户需求?这条用户故事要实现得价值是什么?很多团队都遇到过这样的情况。用户故事可以帮助开发人员更好的理解需求,让开发人员形成以用户为中心的思维模式,从而开发出更符合用户期望的产品。那么应该如何有效的编写一个用户故事呢?问题分析什么是用户故事分析问题之前,我们先了解下用户故事。用户故事维基百科给出的定义是:“In software development and product management, a user story is an informal, natural language description of one or more features of a software system.”即在软件开发和产品管理过程中,对系统的一个或多个功能进行非正式,自然的语言描述。用户故事是为了表述用户渴望的功能和价值。与需求规格说明书对比同样是用来记录需求,用户故事和传统的需求规格说明书有什么差别呢?需求规格说明书是软件开发过程的范围标准,通常会很正式客观的说明系统需求范围,功能实现要点等,说明书的好处是可以让产品完全符合约定规范,达到交付标准;但是说明书要求做到的和客户内心期望的可能并不一样,比如:说明书中写“产品logo是黑豹”,产品经理是一个漫威粉丝,他希望产品logo是漫威的黑豹;只看说明书,很难看出产品经理的真实需求,于是研发人员就画了一个动物黑豹作为logo;从结果来看,按照说明书做出的产品与用户期望之间存在着很大偏差。用户故事通常比较短小,其核心是围绕用户期望的价值;它不像说明书那样事无巨细的记录下产品想要实现的功能,而是提醒研发人员正在开发或者待开发的功能要实现什么价值(理论上,用户故事应该由用户或用户代理如产品经理录入)。用户故事的三要素为角色、功能、价值,编写用户的通用模板如下:“作为一个<角色>, 我想要通过 <功能>, 以便于实现 <价值>。”使用用户故事来写描述刚才的需求可能就会写成,“作为产品经理,我想制作一个黑豹的logo,以便于利用漫威品牌去吸引用户。”研发人员通过用户故事的“价值”,可以知道这个logo应该是漫威的人物;如果不知道,也可以去问产品经理,这豹子和漫威有啥关系,经过产品经理解释,需求也可以被正确理解(体现了用户故事“可以商讨的”的原则),简而言之,需求规格说明书强调:“功能”,而用户故事比起“功能”更注重“价值”。根本原因了解了上述信息,再看背景中用户故事存在的问题。这条故事虽然有用户故事的样子,但是本质上更像一条需求说明——没有体现用户期望的价值,它只写了“作为 一个<角色>, 我想要通过 <功能>”,没有后半部分的“以便于实现 <价值>”, 所以这条用户故事不合格的根本原因是没有体现价值,这是一条无效的用户故事。这种无效的用户故事一方面会导致研发人员很难理解需求要实现的目的,做出的产品令用户不满意;另一方面,这个用户故事写的太粗略,研发人员不知道从哪下手。无效的用户故事只是一种形式,对需求澄清起到的作用微乎其微。接下来看下合格的用户故事应该怎么写。解决措施要写好用户故事,首先应该了解用户故事的必备条件,或者说用户故事的原则。用户故事的原则一个用户故事通常具备6个原则:独立的(Independent),可以商讨的(Negotiable),有价值的(Valuable),可以估计的(Estimatable),合适的小(Small),可测试的(Testable),6个原则取英文首字母会组成一个单词“INVEST”,所以用户故事的6个原则也被称为“INVEST原则”。独立的(Independent):避免故事之间的依赖;这样做的好处是便于故事优先级排序以及估算。A故事:“作为购房者,我想要通过学区搜索房源,以便买到学区房,方便孩子上学”,B故事“作为购房者,我想要通过学校名称搜索房源,以便于生活在有文化气息的地方”,一定程度上来说,B故事对A故事有依赖,学校的范围包含学区内的公立学校外,还有学区外的私立学校和大学等。如果A故事需要1天,B故事需要3天,总体估算两个故事完成应该是4天,可是A故事完成后,B故事相当于完成了一部分,最后B故事可能只需要2天就完成了;而且本来优先级相同的两个故事,A故事优先级无形之中提高了。用户故事之间的依赖会让估算不准确,即不符合“独立的”原则;想解决这个问题,我们可以对故事重新划分,比如:重新划分成三个故事:“作为购房者,我想要通过私立学校名称搜索房源,以便于孩子将来得到不一样的教育”,“作为购房者,我想要通过大学名称搜索房源,以便于生活的地方有文化气息”,“作为购房者,我想要通过学区搜索房源,以便买到学区房,方便孩子上学”,这样故事之间就没有耦合性,每个故事都是独立的,便于优先级排序和估算故事点。可以商讨的(Negotiable):用户故事只提供适量信息,让开发人员和用户(产品经理)针对一些细节进行讨论;“作为购房者,我想要通过学校名称搜索房源,以便于生活的地方有文化气息 ”,常规理解,这条需求包含:小学,中学,那大学是否包含呢,这样就形成了讨论性。这种情况我们可以在故事中加一段注释:“注释:包含小学,中学,是否包含大学待确认”。与客户的讨论过程在可能会挖掘新的需求,比如艺术学校等。用户故事注释不建议写的面面俱到,因为会减少故事的可商讨性。有价值的(Valuable):敏捷开发以价值为导向,所以故事应该体现对用户的价值。“有价值的”原则在问题分析里面已经做了部分解释;还有一种情况“作为研发人员,我希望给后台数据库创建XX表,以便于我实现XX模块的功能”,这条用户故事看似ok,但实际上该用户故事只对研发人员有价值,换句话说用户不关心后台表结构,只关心系统是否可用,所以这条故事不符合“有价值的”原则。技术实现方面的需求可以适当转化成对用户有价值的故事,或者把它作为“作为购房者,我希望通过XX功能,以便于实现XX价值”这条故事下面的一个Task。可以估计的(Estimatable):每个故事都应该可以估算出故事点,以便于对个人工作量以及团队速率进行估算;一个用户故事估算的工作量不能超过一个迭代,如果故事太大难以估算,可以将大的故事进行分解,分解成多个小的可估算的故事。“作为购房者,我需要按交通线路搜索房源,以便于找到方便搭乘公共交通的房源”,公共交通种类繁多:公交,地铁,轻轨等,假设实现每种交通工具搜索需要4天,要一下子实现这个故事至少需要12天,一个迭代开发不完,这不符合“可以估计的”的原则。针对这种情况,我们可以将这个大的故事拆分成三个小的用户故事,每种交通工具分别对应一个故事,这样一个故事就是4天,就符合了“可估计的”原则。合适的小(Small):故事分解的小,便于估算也便于交付,但是如果故事分解的太小,以至于难以估算故事点,就需要对多个实现共同功能的小故事进行整合。“作为购房者,我希望搜索框背景是红色,以便于我可以更好的找到搜索框”这种用户故事工作量很难估算,可能少至十分钟,多则半小时就完成了;如果迭代中有很多这种小的故事,那对于整体速率估算是非常不利的。小故事可以和其他故事进行整合,形成可估算大小的故事;或者将小故事作为一个Task挂到其他类似用户故事下。可测试的(Testable):用户故事必须要有一个明确的完成标准,以判断开发的功能是否满足用户期望。“作为购房者,我希望搜索到大房子,以便于我和父母孩子居住”,“大房子”是一个模糊的概念,面积90㎡还是140㎡算大房子?是不是三室两厅就符合条件?这种用户故事很难进行验收,也不符合“可测试的”原则。正确描述是:“作为购房者,我希望搜索到90㎡以上,三室两厅的房子,以便于我和父母孩子居住”这样标准就清晰很多,评审会议时也好判断功能是否符合用户期望。用户角色好的用户故事除了满足它的基本原则,还应该考虑一个问题:对于不同的“角色”,实现同样“价值”所需要的“功能”是否也不同?我们来对比两个用户故事:“作为购房者,我想要通过总房款的范围搜索房源,以便于找到我能买的起的房子”和“作为月薪5000,手头有30万存款的职场新人,我想要通过总房款的范围搜索房源,来确定我能负担得起的房子”,开发相同的“通过总房款范围搜索房源”功能,前者需求描述比较模糊:在搜索栏中输入比如100万,然后展示100万左右的房源信息?100万左右的“左”和“右”分别是多少?按这个需求做出来的产品,很大概率是模棱两可的产品,也很难被用户认可;而且在这个用户故事中,“角色”并没有起到该有的作用;第二个故事相对就好很多:30万做首付, 5000月薪可以作为月供的参考,通过这些参数可以大概的推测出总房款的范围,这个范围也可以作为这类人预算的参考;再深一点考虑:房屋总价做成可选区间,代替从搜索栏输入,也许用户体验会更好。由此可见,如果对用户角色进行细致划分能起到意想不到的效果。敏捷以用户为中心,不了解用户就无法掌握用户真正期待的价值。而研发时每个人对用户的理解是不同的,用户角色可以帮助团队形成统一的用户形象,研发人员可以聚焦目标用户,重点挖掘该角色需要的价值;同时使用用户角色会更有代入感,便于研发人员站在用户角度去实现产品该有的价值。用户角色可以通过头脑风暴或其他形式进行识别:按实际需求对用户群体进行细致分类;分类完成后,对有共性的用户适量整合形成具有代表性的用户。比如,对于购房者我们头脑风暴后,可能形成如下群体:年轻人,中年人,老年人,每个群体自身条件和期望都会有差异。年轻人群体中大多数个体财富积累较少,上班时间早,从他们角度会写出特定的用户故事,比如:“在市中心上班的小王,想要通过地跌线路搜索房源,以便于解决上班堵车导致迟到的问题”,要怎么做,为什么这样做,一目了然。同样对于已经成家的中年人,可能更关注孩子的教育(学区);对于老年人群体,可能更关注附近是否有菜市场便于买菜,是否有公园便于日常锻炼,从这些群体的角度出发,搜索功能会形成不一样的用户故事。还应该想到一些极端情况,比如:“作为一个事业有成的企业家,我想要在空气清新的郊区买一个独栋别墅,以满足私人会谈和休假”,所以房源类型是别墅还是普通住宅也要考虑。接下来看一个例子。实例操作用户故事通常以手写的方式写在纸质卡片上,但是纸质卡片很难提供准确的数据用来进行相关分析,所以现在很多企业都选择使用电子卡片。华为云DevCloud是基于敏捷思想设计的DevOps研发平台,接下来在华为云DevCloud中写几个规范的用户故事,故事呈现的需求是背景提到的搜索功能。首先对年轻的上班族群体进行需求划分,比如有些年轻人工作单位在市中心,市中心房子太贵,离市中心稍微远一点开车或坐公交时间不可控(容易堵车),所以他们希望按照地铁线路搜索房源,以解决上班迟到的问题。用户角色就是:早晨八点要到单位(单位位置在市中心)的小王,小王想要做的事是:在这个网站里通过地铁线路搜索地铁站附近的房源信息,他这样做的目的是为了减少上班迟到的风险,写成用户故事:Tips:华为云DevCloud支持填写故事的各种属性,比如所属迭代,优先级,估算工时,故事点等。通过规范的用户故事,研发人员发现原来用户想要的搜索并不是无目的的搜索,而是想找到和自己特定需求相匹配的房源,如果在搜索框基础上,加上若干CheckBox会更有利于用户搜索,最后产品搜索页面如下。总结站在不同用户的角度,遵循用户故事的“INVEST”原则,可以更深层次的挖掘用户的需求,写出更有效的用户故事。参考附录Mike Cohn:用户故事与敏捷方法.北京:清华大学出版社文章博客地址:【DevCloud · 敏捷智库】“用户故事等于需求说明”——你一定没有写好用户故事
-
背景在传统开发模式下,开发任务是由项目经理指派给个人的,而在敏捷开发模式中,开发任务是团队领取的。很多企业在转型中遇到过这样的问题:“计划会议认领开发任务的时候,有几个任务没人认领怎么办?”问题分析首先,相对于传统开发模式的指派开发任务,我们需要知道为什么在敏捷开发中是领取任务。在敏捷中,不管是敏捷宣言还是Scrum指南,都没有指派(assign)一词,而是使用了一个术语“自组织”,如下:最佳的架构、需求和设计出自于自组织的团队(敏捷宣言12项原则)自组织团队自己选择如何以最好的方式完成工作,而不是由团队之外的人来指导(Scrum指南)他们是自组织的。没有人(即使是 Scrum Master)有权告诉开发团队应该如何把产品待办列表变成潜在可发布的功能增量(Scrum指南)那么“自组织”是什么呢?从字面的意思来理解,“自组织”就是:安排分散的人或事物使具有一定系统性或整体,而安排的人就是他们自己。在敏捷开发中,自组织团队就是具备自我管理、自我驱动、自我学习等能力的敏捷开发团队本身,这样的团队一般具备如下特点:团队成员自己“拉”工作,不是被动等待他们的领导分配工作;团队作为一个整体管理他们的工作;团队仍然需要辅导和指导,但不需要指挥和控制;团队成员彼此沟通紧密互通有无;团队主动发现和提出问题并共同解决;团队不断提高自己的技能,鼓励探索和创新。更多关于“自组织”的相关内容不在此FAQ的范围内,如感兴趣请参阅更多文献。从敏捷宣言和Scrum指南关于任务的工作方式上来看,在我们践行敏捷的时候,主要发挥的是开发团队自身的主观能动性,开发团队由原来的控制性转变成了自组织性,而开发任务也就由原来的指派变为了领取。这样的好处是,领取任务就是发挥了人的主动性,而自主性是人们从事创造性和解决问题的动力之一,良好的自我组织能给团队和个人带来高绩效、出色的工作成果以及喜欢的工作环境。另外,每个人都是最了解自己的,也擅长为自己分配任务,相对于传统的指派开发任务所带来的易主观臆断、分配不当等更具有合理性。然后再回 “计划会议认领任务的时候,有几个任务没人认领怎么办?”这个问题上。不过在此之前,需要先澄清的一个观点就是,在计划会议中,不一定非要全部领取完开发任务。在Scrum指南中指出“领取工作在Sprint计划会议和Sprint期间按需进行。”这个期间,可以理解为在每日Scrum站会上基于目标领取任务。另外,Mike Cohn 也表示过,不建议在计划会议中领取开发任务,这样可能会导致目标由团队变为了个人,进而违背了敏捷的本意,降低了灵活性。更多请详见参考附录“Should Team Member Sign Up for Tasks During Sprint Planning?”。一般来说,开发任务没人认领的原因主要有:开发任务的难度大:当开发任务比较难以解决,超出了团队大部分成员的能力时,团队成员可能会存在担心加班加点,甚至“996”的情况而不愿意认领。开发任务超范围:当开发任务的内容超出团队成员所掌握的范围时,如 Android 不会 IOS,开发不会测试等,就可能会出现“我是想认领的,但实例它不允许啊”的情况。担心受到他人指责:工作内容存在一定的挑战性,担心由于自己没有做好,导致团队目标没有达成而受到指责。那么应该如何解决呢?解决方案在一个敏捷Scrum团队中,Scrum Master扮演着重要的角色,该角色一部分的作用就是要帮助团队成为自组织型团队,以便让团队能以积极的心态去面对冲刺的开发任务。此外,当出现任务没有人愿意认领的情况时,首先 Scrum Master应该帮助团队弄清楚没有人认领的原因是什么再对症下药,下面基于分析中的三种情况分别给出解决措施。开发任务难度大对于开发任务难度大的情况,Scrum Master应该组织团队进行有效的任务分解,使用探针Spike技术,探索出解决措施以降低任务的难度,再由团队去认领(更多关于Spike的解释请见附录)。或者鼓励技术能力较一般的成员和技术大牛通过结对编程的方式来一同认领任务(更多关于结对编程的解释请见附录)。在华为云DevCloud中,可以对该类难度大的用户故事通过子工作项的方式进行拆分,同时在基本信息中通过设置处理人和抄送人的方式以记录结对编程的人员配对情况,如下图。除此以外,在每日Scrum站会的时候,要留意和了解该开发任务的情况,进行风险评估,如有问题及时帮助协调解决。在回顾会议中,应对该类情况问题进行分析并能输出基于团队的一套标准工作方式方法,然后将解决方案记录在团队知识库中,华为云DevCloud提供了Wiki的功能,可以为团队很好的整理和记录工作方式,如下图。开发任务超范围敏捷提倡的团队是跨职能团队,但是团队的跨职能并不意味着个人能做所有的事情,我们希望的跨职能团队往往是由掌握多项技能的T型人才(每个成员在一个专业领域具有深度,而在其他领域具有广度)所组成的。那么首先,需要Scrum Master能够和团队整理和维护成员技术矩阵,把个人技能掌握情况对团队公开(知道团队欠缺什么、知道可以和谁学等),然后定期组织技术分享等活动以帮助团队成员学习(主要以学习一项新的技术后的分享方式),这样可以在一定程度上提升成员在冲刺中愿意领取其他任务的热情(学完了当然是想去用一下咯)。另外,还可以由专长成员和意愿成员组队,采用结对编程的方式领取任务,以实现个人技术的扩充。团队成员的T型能力建设,不仅仅能让团队领取任务的时候有更多的选择,也提供了成员的backup能力,减少无人认领的情况发生。此外,同样也需要Scrum Master留意日常评估风险和引导团队回顾该事项并维护团队知识库。担心受到他人指责工作内容存在一定的挑战性,担心由于自己没有做好,导致团队目标没有达成而受到指责。Scrum Master应该对团队贯彻以团队为整体的思想,并指导和强调Scrum的价值观,尊重团队的每一个成员的背景、经验,当然也包括开发任务的选择,还要鼓励成员能有勇气去选择和尝试。在实际的工作中,我们可以通过在墙上、白板等贴上标语(如“尊重他人”、“只有团队没有个人”等)的方式,让团队从思想意识方面发生转变,慢慢敢于去领取有挑战性的任务。此外,Scrum Master要充分保护好成员对有挑战工作认领的热情。如,防止在回顾会议上出现指责和批斗的情况,回顾和总结永远应该聚焦的是做事的方式方法而不是对人的苛刻和指责。总结以上三种没有人认领任务的情况,是比较常见的。但在真正的实际项目中,每个公司或团队的情况都不尽相同,无法穷举所有,应具体情况具体分析。比如,当一个公司首要考虑的是存活问题时,又比如一个刚刚转型的敏捷团队,在开发任务的领取上可能会更偏向于半指派半领取的方式,就像FAQ《从敏捷管理的角度来说,是团队主动认领任务好还是通过管理任务分发好》中所提到的,当团队敏捷成熟度较低时,可先由团队认领再让领导管控。这就好比中国经济一样 “以市场经济为导向,适当进行宏观调控”。但不管这个“调控”的力度如何,我们都应该鼓励团队成员能积极主动地领取任务,并随着任务的进展情况灵活调整,及时做好风险把控,必要的时候需要其他渠道的协调帮助或相关领导的介入,以保证迭代的目标不受影响。参考附录spike华为云DevCloudShould Team Member Sign Up for Tasks During Sprint Planning?文章博客地址:https://bbs.huaweicloud.com/blogs/152629
-
1 订单接口说明ManageOne中,用户通过申请订单的方式对云资源进行申请、变更、释放操作,实现对云资源生命周期的管理,订单接口具有以下特点:订单支持关联审批流程(最大支持五级审批,详情参考ManageOne用户指南),用户完成资源配置并提交后,如果审批通过,Manageone会自动完成订单实施;订单接口对云服务接口(经加固后对外开放的OpenStack接口)进行了一定程度的封装,通过调用订单接口,可以同步完成云资源的多个操作,如,申请虚拟机的同时,为虚拟机挂载数据盘,绑定弹性IP;通过订单接口申请、释放云资源时,会同步扣除、恢复租户配额,当租户配额不够时,会导致订单实施失败;订单接口只提供资源的申请,延期,变更,释放功能,不提供云服务的查询,操作(如虚拟机的开关机,列表查询等)功能,不能独立使用,需要配合云服务接口使用,也就是说,您需要通过ManageOne订单接口申请,延期,变更,释放云资源,使用云服务接口查询,操作云资源说明: 云服务接口也支持申请云资源,与使用ManageOne订单接口的区别是:通过云服务接口创建的资源,在ManageOne页面上,可以查询,操作这些资源,但不能执行变更(如扩容,减容),释放云资源的操作ManageOne中为该租户设置的配额也将不再生效(即使用云服务接口申请、释放资源,ManageOne中对应租户的配额不会变化),这也意味着,如果您不加约束,租户可以超配额申请资源2 订单接口使用场景如第1部分所述,ManageOne订单接口是在云服务接口的基础上封装得到的,包含了ManageOne自身的运营特性,例如产品、服务、区域、配额等,使用上有一定的约束,如果您希望通过调用接口实现对华为云Stack中云资源的生命周期管理,请参考以下几个场景进行评估,符合以下任何一种场景的,建议您选择使用ManageOne订单接口进行对接:如果您公司购买了并部署了华为云Stack产品,您希望通过自动化工具实现云服务资源的自动化发放,从而提高资源申请效率;如果您购买了并部署了华为云Stack产品,公司围绕IT资产的运营运维有一整套流程,您希望已有的流程平台(如ITSM、BOSS等)能够与华为云Stack进行对接,实现现有流程与云服务的整合,在简化服务的申请周期,提高应用上线效率的同时,还能够实现云资源的全流程监控;如果您是云服务提供商,将华为云Stack提供的云服务,按照租户的形式租售给了客户,客户希望实现云服务的自动化发放,需要您提供对接接口;如果您是云服务提供商,希望现有运营平台能够与华为云Stack对接,实现租户的自动化创建,并为每个租户预置指定类型的云资源,租户的日常运维由运维部门通过ManageOne进行运维。如果您购买了多家厂商的云平台,希望通过一套云管理软件进行纳管,建议您直接对接云服务接口进行对接,这样可以屏蔽ManageOne的运营特性,只关注云服务特性,对接起来更加灵活。3 对接准备订单接口参数较为复杂,建议您使用可视化工具对接口进行测试,如postman(使用前请关闭SSL证书校验),restclient等。请参考帖子:【华为云Stack ManageOne 运营侧北向对接】北向接口对接准备工作,获取接口文档,接口对接需要的IP,域名等信息本帖提供的方法,适配华为云Stack 6.5.X,8.0版本4 订单接口对接步骤我们知道ManageOne订单接口不能独立使用,需要配合云服务接口使用,这里给出主要的对接步骤,如下:通过用户名和密码调用鉴权接口获取Token和user_id。(可选)通过user_id查询用户关联的project,用户是以project维度操作资源,资源也必须属于某一个project根据选择的project的id查询project详细信息,获取region_id、支持的云服务列表、每个云服务的资源池id和包含的az(可用分区)列表。选择需要申请的云服务类型,比如云硬盘的service_type为evs。订购接口还需要product_id,因此通过查询可用产品列表接口获取。根据不同的云服务定义的数据结构获取对应的参数,这部分由每个云服务具体的订购章节详细描述,参考《ManageOne 6.5.x 云服务Params参数说明》。组合订购接口所需的所有参数,调用接口完成订购。下面给出通过订单接口创建、释放VPC的详细步骤5 申请VPC这里先给出涉及到的接口清单,如下:序号接口功能URL涉及到的接口文档调用接口使用的域名(样例)1鉴权【POST】/v3/auth/tokens《ManageOne 6.5.X OTenantSecurity服务API参考.doc》iam-apigateway-proxy.demo.com2查询用户关联的project列表【GET】/rest/vdc/v3.0/users/{user_id}/projects《ManageOne 6.5.X 运营面API参考.doc》sc.demo.com3查询project详情,获取该project关联的资源池信息【GET】/rest/vdc/v3.1/projects/{project_id}《ManageOne 6.5.X 运营面API参考.doc》sc.demo.com4查询可申请的产品列表【GET】/rest/product/v3.0/apply/products《ManageOne 6.5.X 运营面API参考.doc》sc.demo.com5查询云资源池可用分区【GET】/rest/serviceaccess/v3.0/available-zones《ManageOne 6.5.X 运营面API参考.doc》sc.demo.com6创建订购【POST】/rest/subscription/v3.0/subscriptions《ManageOne 6.5.X 运营面API参考.doc》《ManageOne 6.5.x 云服务Params参数说明》sc.demo.com7查询订单详情【GET】/rest/order/v3.0/orders/{order_id}《ManageOne 6.5.X 运营面API参考.doc》sc.demo.com8获取外部网络列表【GET】/v2.0/networks《华为云Stack 6.5.X API接口参考.chm》>网络>VPC>VPC>网络vpc.sa-fb-1.demo.com具体接口调用步骤如下:步骤 1 获取token调用示例:URL:https://{IAM对外访问域名}/v3/auth/tokens 请求方法:POST 请求头: Content-Type: application/json;charset=UTF-8 Accept: application/json;charset=UTF-8 Connection: keep-alive 请求体: { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "租户名" }, "name": "XXXXXX", "password": "XXXXXX" } } }, "scope": { "project": { "domain": { "name": "租户名" }, "id": "项目Id" } } } }响应消息如下:响应头: X-Subject-Token→MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 响应体: { "token": { "expires_at": "2019-09-09T07:38:55.643000Z", "methods": [ "password" ], "catalog": [], "roles": [ { "name": "vdc_adm", "id": "880ed0477e684b1db7634572ecf19c5c" }, { "name": "te_admin", "id": "7849dd0fc806417c908bb21ea93b5def" }, { "name": "tag_adm", "id": "7ef11d3399a44a56b722b3c017478e34" }, { "name": "approv_adm", "id": "5528afb8b7c946b5bda00a10ca041748" }, { "name": "vdc_owner", "id": "2034341ae2b44fee94c244a8069cde0b" } ], "project": { "domain": { "name": "xssvdc", "id": "15488ac7aec547a68d9451c91173c68c" }, "name": "xssvdc", "id": "27a008f1b83e4dfdbf1143dd336006df" }, "issued_at": "2019-09-08T07:38:55.643000Z", "user": { "domain": { "name": "xssvdc", "id": "15488ac7aec547a68d9451c91173c68c" }, "name": "xssvdc", "id": "b54310fb838b4f8ebf1e9d23bf9691d5" //用户Id } } }从响应头中我们可以获得X-Subject-Token的值,即为我们所需要的token的值;从响应体中还可以获得用户的Id,以便后续查询用户关联的所有的project步骤2 查询用户关联的project(可选)创建资源时,需要指定该资源所属的project,若一个租户下有多个project,第三方平台需要指明需要使用的project,此时需要查询该用户关联的project,若仅涉及单个project,则不涉及此操作。需要说明的是,当选择某个project创建资源时,需要用该project参考步骤1去获取token。调用示例如下:URL: https://{ManageOne运营侧API对外域名}/rest/vdc/v3.1/users/{user_id}/projects 请求方法:GET 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体:无 响应体: { "total": 1, "projects": [ { "domain_id": "15488ac7aec547a68d9451c91173c68c", "tenant_id": "39d881e6-e6a6-4516-8d8e-83446abc263b", "role_name": null, "tenant_name": "tt002", "regions": [ { "region_status": "normal", "region_id": "dg-tky-1", "region_name": { "en_us": "东莞", "zh_cn": "东莞" } } ], "level": "2", "role_id": null, "name": "pj002", "iam_project_name": "pj002", "description": null, "id": "4313bc0e240e4086995e606f6601b730", "enabled": true }, { "domain_id": "15488ac7aec547a68d9451c91173c68c", "tenant_id": "1cfbb21d-3e45-4a0a-887f-c9e6ab215cec", "role_name": null, "tenant_name": "test001", "regions": [ { "region_status": "normal", "region_id": "dg-tky-1", "region_name": { "en_us": "东莞", "zh_cn": "东莞" } } ], "level": "2", "role_id": null, "name": "test001", "iam_project_name": "test001", "description": null, "id": "147c59f42277405e854e7a3123dea3a9", "enabled": true } ] }步骤 3 查询资源池信息创建、变更、删除资源时,需要指定资源所在的region、资源池、可用分区,我们可以通过查询project详情获取该project关联的region、资源池、可用分区信息,接口调用示例如下:URL: https://{ManageOne运营侧API对外域名}/rest/vdc/v3.1/projects/{project_id} 请求方法:GET 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体:无 响应体: { "project": { "domain_id": "15488ac7aec547a68d9451c91173c68c", "tenant_id": "d58cc7b4-59a8-49ff-8f0c-0c7dff90b5e9", "tenant_name": "xssvdc", "regions": [ { "region_status": "normal", "cloud_infras": [ { "cloud_infra_status": null, "cloud_infra_name": null, "cloud_infra_type": null, "azs": [], "cloud_infra_id": null }, { "cloud_infra_status": "normal", "cloud_infra_name": "OpenStack_dg-tky-1", "cloud_infra_type": "FUSION_CLOUD", "azs": [ { "az_status": "normal", "az_name": "华为", "az_id": "az0.dc0" } ], "cloud_infra_id": "FUSION_CLOUD_dg-tky-1" }, { "cloud_infra_status": "normal", "cloud_infra_name": "VMware_dg-tky-1", "cloud_infra_type": "VMWARE", "azs": [], "cloud_infra_id": "VMWARE_dg-tky-1" } ], "region_id": "dg-tky-1", "region_name": { "en_us": "东莞", "zh_cn": "东莞" } } ], "is_shared": false, "name": "xssvdc", "tenant_type": "vdc", "region_name": null, "id": "27a008f1b83e4dfdbf1143dd336006df", "enabled": true } }此处我们可以获得region_id、cloud_infra_id、az_id,需要注意的是,创建资源时指定的AZ必须与cloud_infra_id、region_id匹配,不能交叉混用!!!步骤4 查询产品列表不同的云服务在ManageOne中体现为对外提供不同的产品,查询时需要指定产品类型(service_type),常用类型有:service_type云服务名称ecs弹性云服务器evs云硬盘ims镜像服务vpc虚拟私有云vfw虚拟防火墙elb弹性负载均衡as弹性伸缩bms裸金属服务调用示例如下:URL: https://{ManageOne运营侧API对外域名}/rest/product/v3.0/products?limit=100&start=1&status=online&service_type=vpc®ion_id={region_id}(region_id取值由步骤3获取)请求方法:GET 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体:无 响应体: { "total": 1, "products": [ { "product_id": "1222c648ff284296b0f5d848806aba9b", "service_type": "vpc", "create_vdc_id": "all", "create_user_id": "32cb5a3c9de44bcf9696db98c1db828a", "icon_id": "defaulticonvpc", "catalog_id": "3", "region_id": "dg-dg-1", "params": "{}", "name": "{\"en_US\":\"VPC\",\"zh_CN\":\"虚拟私有云\"}", "description": "{\"zh_CN\": \"虚拟私有云即VPC,是一套为云服务器构建的逻辑隔离的、由用户自主配置和管理的虚拟网络环境,同时提供灵活可靠的数据连接方式和全方位的安全防护层,旨在提升用户资源的安全性,简化用户的网络部署。\",\"en_US\": \"Virtual Private Cloud (VPC) lets you provision logically isolated, configurable, and manageable virtual networks for cloud servers. VPC also provides flexible and reliable network connection modes and comprehensive security protection. VPC is designed to improve the security of user resources and simplify network deployment.\"}", "create_time": 1585897486000, "publish_status": "publish", "deletable_status": "normal", "is_default": true, "publish_scope": "[]", "online_scope": "[{\"vdcName\":\"all\",\"vdcId\":\"all\"}]", "online_status": "online", "approval": false, "price": null, "resource_pool_id": "", "project_id": "", "az_id": "", "secret_params": null, "product_type": null } ] }响应体中,approval字段值为false的产品表示该产品没有关联人和审批流程,申请该产品后,不需要经过任何审批流程,提交订单后就会实施,对接时建议使用此类产品。步骤 5 查询可用外部网络查询可用的外部网络,请求示例如下:URL: https://{VPC对外访问域名}/v2.0/networks?router:external=True&tags=service_type=Location(若使用参数tags=service_type=Location查不到列表,请更换为tags=service_type=Intranet) 请求方法:GET 请求头: Content-Type: application/json;charset=UTF-8 Accept: application/json;charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体:无 响应体:{ "networks": [ { "provider:physical_network": "physnet1", "ipv6_address_scope": null, "port_security_enabled": true, "mtu": 1500, "id": "cfd58c32-eb48-4fe4-8744-749940b73b72", "router:external": true, "availability_zone_hints": [], "availability_zones": [ "nova" ], "provider:segmentation_id": 210, "ipv4_address_scope": null, "shared": true, "project_id": "a3f457bbf1054e27a59804f4050f24e1", "status": "ACTIVE", "subnets": [ "39385d8e-0d67-4ecc-a1f0-1db294c3f21f" ], "description": "", "tags": [ "group=group1", "service_type=Intranet", "az=az0.dc0", "location=DG:localcloud", "name=exNet_02" ], "updated_at": "2019-06-11T01:24:17", "is_default": false, "qos_policy_id": null, "name": "ext_net02", "admin_state_up": true, "tenant_id": "a3f457bbf1054e27a59804f4050f24e1", "created_at": "2019-06-11T01:24:17", "provider:network_type": "vlan" }, { "provider:physical_network": "physnet1", "ipv6_address_scope": null, "port_security_enabled": true, "mtu": 1500, "id": "eaded83b-1f76-42a0-84ea-df711e01db3e", "router:external": true, "availability_zone_hints": [], "availability_zones": [ "nova" ], "provider:segmentation_id": 209, "ipv4_address_scope": null, "shared": true, "project_id": "a3f457bbf1054e27a59804f4050f24e1", "status": "ACTIVE", "subnets": [ "dd6e78b3-aa76-406e-b81a-947f31f0c584" ], "description": "", "tags": [ "group=group2", "service_type=Intranet", "az=az0.dc0", "location=DG:localcloud", "name=exNet_01" ], "updated_at": "2019-06-11T01:24:04", "is_default": false, "qos_policy_id": null, "name": "ext_net01", "admin_state_up": true, "tenant_id": "a3f457bbf1054e27a59804f4050f24e1", "created_at": "2019-06-11T01:24:04", "provider:network_type": "vlan" } ] }provider:physical_network的值即为物理网络名称,Id即为外部网络的Id我们现在获得了创建VPC所需的所有参数,订购接口所需主要参数如下:序号参数名称参考值备注1operate_typeapply申请,固定值apply2service_typevpc虚拟私有云,固定值vpc3region_idsa-fb-11区域id,步骤3获取4tenancy2018-07-27 15:59:59租期租期截止时间,永久有效则填写05product_id产品id,步骤4获取6tenant_id云服务中的tenant_id和manageOne中的project_id相同,步骤3获取7nametestvpc自定义新建vpc的名称8external_gateway_info:network_id外部网关的网络ID,参考步骤5,Type3场景下不需要填写,Type1、Type2场景必填9display订单显示信息,可根据需要填写,值可以为空,属性名必须有10subnetregionId子网区域id,和vpc区域id相同tenant_id和vpc的tenant_id相同,公共参数章节获取namesubnet_test子网名称,用户自定义cidr192.168.0.0/24子网IP地址段,用户自定义gatewayIp192.168.0.1子网网关地址,用户自定义dnsListDNS服务器列表physicalNetworkphysnet1外部网关的网络ID,查询接口为:【GET】/v2.0/networks,参考《华为云Stack 6.5.X API接口参考.chm》,Type1、Type2场景下不需要填写,Type3场景必填步骤6 创建订单,申请VPC订单接口中的params参数说明,请参考《ManageOne 6.5.x 云服务Params参数说明》当华为云Stack组网场景为type1、type2时,申请VPC请求示例如下:URL: https://{ManageOne运营侧API对外域名}/rest/subscription/v3.0/subscriptions 请求方法:POST 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体: { "subscriptions": [ { "operate_type": "apply", "product_id": "e50123fc503049fa9e5f9072d8b47585", "region_id": "sa-fb-11", "project_id": "1d998b1c7e264baba3203cfe9867b011", "service_type": "vpc", "tenancy": "2018-07-27 15:59:59", "params": "{\"regionId\":\"sa-fb-11\",\"tenant_id\":\"1d998b1c7e264baba3203cfe9867b011\",\"vpc\":{\"name\":\"vpc-eabb\",\"external_gateway_info\":{\"network_id\":\"27e6e110-8d29-481c-93af-c3ba39c22c37\"}},\"subnet\":{\"regionId\":\"sa-fb-11\",\"tenantId\":\"1d998b1c7e264baba3203cfe9867b011\",\"availableZoneId\":\"\",\"name\":\"subnet-eabc\",\"cidr\":\"192.168.0.0/24\",\"gatewayIp\":\"192.168.0.1\",\"dhcpEnable\":true,\"dnsList\":[\"18.125.1.51\",\"18.125.1.52\"]},\"display\":[{\"label\":\"Region\",\"value\":\"sa-fb-11\",\"type\":\"string\"},{\"label\":\"VPC Name\",\"value\":\"vpc-eabb\",\"type\":\"string\"},{\"label\":\"External Network\",\"value\":\"dummy_external_network\",\"type\":\"string\"}]}" } ] } 响应体: { "purchases": [ { "subscription_id": "20190914113546169610061" } ], "expected_total": 0, "error_details": null }subscription_id即为订单ID当华为云Stack组网场景为type3时,申请VPC请求示例如下:URL: https://{ManageOne运营侧API对外域名}/rest/subscription/v3.0/subscriptions 请求方法:POST 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体: { "subscriptions": [ { "operate_type": "apply", "product_id": "04e12eba75e243368f5cb6a0f52db4af", "region_id": "dg-tky-1", "project_id": "27a008f1b83e4dfdbf1143dd336006df", "service_type": "vpc", "tenancy": 0, "params": "{\"regionId\":\"dg-tky-1\",\"tenant_id\":\"27a008f1b83e4dfdbf1143dd336006df\",\"vpc\":{\"name\":\"vpc-97f0\",\"ntp\":[],\"ntp_v6\":[]},\"subnet\":{\"regionId\":\"dg-tky-1\",\"tenantId\":\"27a008f1b83e4dfdbf1143dd336006df\",\"availableZoneId\":\"\",\"name\":\"subnet-97f1\",\"dhcpEnable\":true,\"cidr\":\"192.168.100.0/24\",\"gatewayIp\":\"192.168.100.1\",\"physicalNetwork\":\"physnet1\",\"segmentationId\":\"\",\"routed\":false,\"dnsList\":[\"160.102.8.53\",\"160.102.8.54\"],\"allocation_pools\":[{\"start\":\"192.168.100.2\",\"end\":\"192.168.100.254\"}]},\"display\":{\"en_US\":[{\"label\":\"Region\",\"value\":\"东莞\",\"type\":\"string\"},{\"label\":\"VPC Name\",\"value\":\"vpc-97f0\",\"type\":\"string\"},{\"label\":\"External Network\",\"value\":\"\",\"type\":\"string\"}],\"zh_CN\":[{\"label\":\"区域\",\"value\":\"东莞\",\"type\":\"string\"},{\"label\":\"VPC名称\",\"value\":\"vpc-97f0\",\"type\":\"string\"},{\"label\":\"外部网络\",\"value\":\"\",\"type\":\"string\"}]}}" } ] } 响应体: { "purchases": [ { "subscription_id": "20190914113546169610061" } ], "expected_total": 0, "error_details": null }subscription_id即为订单ID步骤7 查询订单详情,确认订单实施状态订单提交成功后,需要定时轮询订单状态,直到订单状态(status字段)为成功URL: https://{ManageOne运营侧API对外域名}/rest/order/v3.0/orders/{order_id}(order_id由上一步响应体获得) 请求方法:POST 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体:无 响应体: { "order_id": "20190914113546169610061", "parents_id": null, "type": "apply", "service_type": "vpc", "params": "{\"regionId\":\"dg-tky-1\",\"tenant_id\":\"27a008f1b83e4dfdbf1143dd336006df\",\"vpc\":{\"name\":\"vpc-5e10\",\"ntp\":[],\"ntp_v6\":[]},\"subnet\":{\"regionId\":\"dg-tky-1\",\"tenantId\":\"27a008f1b83e4dfdbf1143dd336006df\",\"availableZoneId\":\"\",\"name\":\"subnet-5e10\",\"dhcpEnable\":true,\"cidr\":\"192.168.10.0/24\",\"physicalNetwork\":\"physnet1\",\"segmentationId\":\"177\",\"routed\":false,\"dnsList\":[\"160.102.8.53\",\"160.102.8.54\"]},\"display\":{\"en_US\":[{\"label\":\"Region\",\"value\":\"东莞\",\"type\":\"string\"},{\"label\":\"VPC Name\",\"value\":\"vpc-5e10\",\"type\":\"string\"},{\"label\":\"External Network\",\"value\":\"\",\"type\":\"string\"}],\"zh_CN\":[{\"label\":\"区域\",\"value\":\"东莞\",\"type\":\"string\"},{\"label\":\"VPC名称\",\"value\":\"vpc-5e10\",\"type\":\"string\"},{\"label\":\"外部网络\",\"value\":\"\",\"type\":\"string\"}]}}", "create_user_id": "b54310fb838b4f8ebf1e9d23bf9691d5", "create_user_name": "xssvdc", "vdc_id": "d58cc7b4-59a8-49ff-8f0c-0c7dff90b5e9", "vdc_name": "xssvdc", "status": "successed", "create_time": "2019-06-11 01:53:42", "implement_time": "2019-06-11 01:53:43", "complete_time": "2019-06-11 01:53:48", "project_id": "27a008f1b83e4dfdbf1143dd336006df", "cloud_infra_id": null, "product_id": "04e12eba75e243368f5cb6a0f52db4af", "region_id": "dg-tky-1", "product_defination_params": "{\"en_US\":\"VPC\",\"zh_CN\":\"虚拟私有云\"}", "tenancy": "0", "original_tenancy": "0", "time_zone": null, "comments": null, "contract_number": null, "rate_params": null, "domain_id": null }6 删除VPC删除VPC,我们需要指定VPC的Id,所属的区域,AZ等信息,步骤如下:步骤 1 获取token参考第5章 步骤1即可步骤2 查询指定VPC下关联的子网列表涉及接口如下:接口功能接口方法接口URL提供接口的云服务调用接口使用的域名(样例)获取VPC信息GET/v2.0/routers虚拟私有云vpc.sa-fb-1.demo.com获取端口列表GET/v2.0/ports?device_id={vpc_id}虚拟私有云vpc.sa-fb-1.demo.com获取子网详情GET/v2.0/subnets/{subnet-id}虚拟私有云vpc.sa-fb-1.demo.com接口调用步骤略,上表所列接口的具体参数说明,请参考接口文档《华为云Stack 6.5.X API接口参考.chm》“网络”-->“VPC”-->“VPC”章节步骤3 删除指定VPC下的所有子网涉及接口如下:接口功能接口方法接口URL提供接口的云服务调用接口使用的域名(样例)获取子网详情DELETE/v2.0/subnets/{subnet-id}虚拟私有云vpc.sa-fb-1.demo.com上表所列接口的具体参数说明,请参考接口文档《华为云Stack 6.5.X API接口参考.chm》“网络”-->“VPC”-->“VPC”章节步骤4 查询区域列表参考 第5章 步骤3即可至此,我们获得了创建删除VPC订单所需要的参数,如下:序号参数名称参考值备注1operate_typedelete删除,固定值delete,必选2service_typevpc虚拟私有云,固定值vpc,不选3region_idsa-fb-11区域id,步骤4获取4vpcIdvpc的id,即router的Id,查询接口为:【GET】/v2.0/routers,参考《华为云Stack 6.5.X API接口参考.chm》5tenant_id云服务中的tenant_id和manageOne中的project_id相同,此处与步骤1中获取token时指定的project相同6display订单显示信息,可根据需要填写,值可以为空,属性名必须有步骤5 调用订单接口删除VPC订单接口中的params参数说明,请参考《ManageOne 6.5.x 云服务Params参数说明》URL: https://{ManageOne运营侧API对外域名}/rest/subscription/v3.0/subscriptions 请求方法:POST 请求头: Content-Type: application/json; charset=UTF-8 Accept: application/json; charset=UTF-8 Connection: keep-alive X-Auth-Token: MIIEeAYJKoASASn04rMqff-Q8fk7kqiCDMLfVxqj7wIdgkM1yD4= 请求体: { "subscriptions": [ { "operate_type": "delete", "service_type": "vpc", "region_id": "sa-fb-11", "project_id": "1d998b1c7e264baba3203cfe9867b011", "params": "{\"vpcId\":\"d887af5c-1d20-43b3-8bb8-7c284813b3a9\",\"tenant_id\":\"1d998b1c7e264baba3203cfe9867b011\",\"regionId\":\"sa-fb-11\",\"display\":[{\"label\":\"Region\",\"value\":\"sa-fb-11\",\"type\":\"string\"},{\"label\":\"VPC Name\",\"value\":\"vpc-eabb\",\"type\":\"string\"}],\"ids\":[{\"id\":\"d887af5c-1d20-43b3-8bb8-7c284813b3a9\",\"service_type\":\"vpc\"}]}" } ] } 响应体: { "purchases": [ { "subscription_id": "20190914110658422269247" } ], "expected_total": 0, "error_details": null }同样的,我们需要调用订单查询接口(参考底5章 步骤7),查询订单状态,直到VPC删除完成补充说明:VPC的查询、属性更新等操作均需要调用云服务的接口,具体接口参考文档《华为云Stack 6.5.X API接口参考.chm》中“网络”-->“VPC”-->“VPC”章节。VPC的申请、删除、扩容需要使用ManageOne订单接口,不可将ManageOne订单接口与VPC接口混用(如:使用ManageOne订单接口创建资源,使用VPC接口删除资源),否则会导致ManageOne上数据展示异常
-
欢迎小伙伴们体验《基于ECS实现一分钟自动化部署》实验,有任何问题都可以在这里讨论交流哦! 通过本实验:§ 您将学习以Tomcat应用为例,通过DevCloud的自动化部署功能将应用快速部署到服务器上。华为云软件开发平台DevCloud是专为开发者打造的一站式云端DevOps平台,支持云上开发,可实现云端持续交付,并覆盖了软件交付的全生命周期,让开发者快速无忧地开启云端开发之旅。 § 您将体验1. 创建实验所需资源2. 新建并执行部署任务§ 您将掌握1. 软件开发平台 DevCloud的基本操作2. 主机自动化部署的方法 实验开始前,推荐您先学习相关课程,掌握实验背景知识:1. 软件开发服务介绍及实战2. 华为DevOps实践3. 弹性云服务器ECS:轻松上云第一步 实验完成后,欢迎学习相关领域微认证,认证您的AI技能:微认证:一分钟自动化部署 实验过程中,如有任何问题可在该帖进行交流,也可以添加华为云学院小助手(微信号:HWcloudedu),专业人员为您实时解疑答惑,互相交流,共同进步!如要提出问题,请详细描述您的问题及出现的步骤,附上实验操作截图,如有其他参考信息可一并附上。
-
华为云多模 NoSQL服务(Multi-Model NoSQL Service)GeminiDB 是一款基于华为自主研发的计算存储分离架构的分布式非关系型数据库服务。在华为云高性能、高可用、高安全、可弹性伸缩的基础上,提供了一键部署、备份、监控等服务能力。兼容 Cassandra 等主流 NoSQL 接口,具有高性价比,适用于IoT、气象、互联网、游戏等领域。点击申请免费试用->熟悉MySQL的开发者和DBA可以半天内完全掌握Cassandra用法,是不是开发者和DBA的福音呢,以下是该款产品的详细分解,坐稳扶好哦~系统架构多模NoSQL服务GeminiDB是一款基于计算存储分离架构的分布式数据库,由多个同构节点组成计算集群。数据存储在分布式共享存储池中。计算和存储资源解耦,支持独立弹性伸缩,扩缩容无数据迁移。图1 Cassandra接口的系统架构 产品优势性能更稳定优化了Full GC,使长尾时延更低,集群性能更稳定。数据更可靠复制集下沉到共享存储池,经过海量客户验证过的存储解决方案,保障数据更可靠。扩容更敏捷基于计算存储分离技术,Rebalance过程只涉及元数据操作,零数据迁移 ,达到分钟级计算资源扩容和秒级存储资源扩容。与其他服务的关系对象存储服务备份数据存储至对象存储服务(Object Storage Service,简称OBS),在提高数据容灾能力的同时有效降低磁盘空间占用。虚拟私有云通过虚拟私有云(Virtual Private Cloud,简称VPC)和网络安全组实现网络隔离。虚拟私有云允许租户通过配置虚拟私有云入站IP范围,来控制连接数据库的IP地址段。数据库实例运行在租户独立的虚拟私有云内,可提升数据库实例的安全性。多模NoSQL服务GeminiDB盛大公测 ,免费试用公测福利华为AI音响mini,华为移动电源,华为云数据库纪念T恤 添加小助手微信加入华为云Cassandra技术交流群,面对面与专家交流哦
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签