Ecs DryRun(检查请求)简述

简介: 在使用OpenAPI的过程中,经常会遇到一个不熟悉的API,为了测试这个API的使用方法,需要对这个接口进行真实的调用。这个过程遇到的问题是显而易见的,如果是查询类接口(比如DescribeInstances),直接进行测试调用是没有什么问题的,但是对于操作甚至创建类接口(如RunInstances),如果调用接口会对实例直接产生影响,或者会产生不必要的测试费用。

使用场景

在使用OpenAPI的过程中,经常会遇到一个不熟悉的API,为了测试这个API的使用方法,需要对这个接口进行真实的调用。这个过程遇到的问题是显而易见的,如果是查询类接口(比如DescribeInstances),直接进行测试调用是没有什么问题的,但是对于操作甚至创建类接口(如RunInstances),如果调用接口会对实例直接产生影响,或者会产生不必要的测试费用。

DryRun功能就是为了解决这种问题而存在的,DryRun是一个检验请求,带有DryRun参数的请求只会检查其合法性,而不会对资源产生影响。使用这种方式,可以仅仅通过调用来确定一个请求的参数是否合理,账号是否有足够的权限调用这个接口。

使用方式

根据不同类型的接口,将DryRun的使用方式分为两种,一种是查询类接口,一种是创建类接口。

查询相关

查询类接口主要包括5个接口:DescribeInstances, DescribeSnapshots, DescribeSecurityGroups, DescribeImages, DescribeDisks。在不使用DryRun的情况下,如果使用(RAM)子账号调用,没有权限的请求会以空结果的状态的返回(并不会报错),表示这个用户并没有权限查询所有实例。在这种情况下,接口的返回并不能完全判定没有查询到资源还是用户没有权限调用。

在使用DryRun时,请求的返回里永远不会包含实际的查询结果,所有的结果都会以报错的形式返回,包括检查通过的请求(为了与成功但是没有数据的请求相区分)。检查通过的请求会以特定的错误码表示检查通过

DryRun检查通过的特定错误码
Code: DryRunOperation 
Message: Request validation has been passed with DryRun flag set.

示例代码如下:

# common codes, 下次不再添加
# coding=utf-8
import logging
from aliyunsdkcore import client
from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest

clint = client.AcsClient('AK', 'SK', 'cn-qingdao')  # region 按实际填写
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')


def _get_response(request):
    try:
        ret = clint.do_action_with_exception(request)
        logging.info(ret)
    except ServerException, e:
        logging.error(e)
    except ClientException, e:
        logging.error(e)

# common codes end

def describe_instance():
    request = DescribeInstancesRequest()
    request.set_DryRun('true')
    _get_response(request)
if __name__ == '__main__':
    describe_instance()
    

DryRun参数为bool类型,取值范围为true | false,默认为false,所有接口的DryRun入参都是统一的。

在查询接口调用时,DryRun参数为true时检查的请求内容主要为是否有权限调用接口,以及少数的参数基础规则检查(是否必填等)。

创建相关

现在支持DryRun的创建接口主要为RunInstances。在不使用DryRun的情况下,RunInstances如果需要测试创建,需要真正的创建出来一台实例才能保证调用的有效。

使用DryRun参数,则可以简单检查请求是否合法。创建接口的DryRun检查主要包含几个方面:用户是否有权限调用、该地域下是否有相应资源售卖、参数之间是否冲突。需要注意的是,RunInstances在使用DryRun的时候,有一个与正常情况不同的参数:Amount,在DryRun为true时,Amount参数必须为1。也就是DryRun参数是不能用来检测创建数量的。

创建接口的DryRun代码示例如下:

from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest

def run_instance():
    request = RunInstancesRequest()
    request.set_SecurityGroupId('sg-id')
    request.set_ImageId('imageid')
    request.set_InstanceType('instance-type')
    request.set_VSwitchId('vsw-id')
    request.set_DryRun('true')
    _get_response(request)
if __name__ == '__main__':
    run_instance()

在参数完全正确的情况下,可以不通过创建实例来判断请求的合法性,来对调用Ecs OpenAPI的代码进行调试。

最佳实践

从DryRun参数的设计来看,主要还是应用在调用预检查以及测试阶段对请求进行校验的场景,在使用子账号进行查询操作时,可以预先使用DryRun参数判断子用户是否有权限发起此次请求操作,同时,DryRun也可以用作子账号的后置检查,如果查询接口没有报错但是返回了空结果,可以使用DryRun进行一次权限校验,来确定是否子账号的权限不够。

对创建类接口来说,DryRun的使用场景比较广泛:

  • 子账号在创建资源前可以使用DryRun判断是否权限足够
  • 在进行弹性扩展创建实例的代码调试时,设置DryRun为true,可以不实际创建出实例就可以达到代码调试的效果(唯一的cost就是DryRun的成功请求与实际成功的返回不完全一样)
  • 创建资源前,可以进行资源的预先检查,可以枚举出使用场景匹配的不同资源组合是否合理可创建。
相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
121 1
|
4月前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
231 0
|
1月前
|
安全 算法 Linux
Linux 服务器还有漏洞?建议使用 OpenVAS 日常检查!
在数字化时代,Linux 服务器的安全至关重要。OpenVAS 是一款优秀的开源漏洞扫描工具,可以帮助及时发现并修复服务器中的安全隐患。本文将介绍 OpenVAS 的主要功能、使用方法及应对漏洞的措施,帮助用户加强服务器安全管理,确保企业数字化安全。
56 7
|
2月前
|
JSON JavaScript 前端开发
《进阶篇第6章:vue中的ajax》包括回顾发送ajax请求方式、vue-cli脚手架配置代理服务器、vue-resource
《进阶篇第6章:vue中的ajax》包括回顾发送ajax请求方式、vue-cli脚手架配置代理服务器、vue-resource
63 22
|
2月前
|
前端开发 JavaScript Java
第6章:Vue中的ajax(包含:回顾发送ajax请求方式、vue-cli脚手架配置代理服务器)
第6章:Vue中的ajax(包含:回顾发送ajax请求方式、vue-cli脚手架配置代理服务器)
84 4
|
6月前
|
Linux
【Linux】一条命令,转发所有请求到另一台服务器上 -高级技巧
【Linux】一条命令,转发所有请求到另一台服务器上 -高级技巧
105 0
|
2月前
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
60 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
3月前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
40 1
|
4月前
|
监控 Linux Shell
"揭秘!一键掌控Linux服务器健康的秘密武器——超实用系统检查脚本,让你的服务器稳如老狗,告别宕机烦恼!"
【8月更文挑战第14天】服务器宕机或资源耗尽会严重影响业务。为此,你需要一个Linux系统检查脚本来守护服务器健康。它可以自动检测潜在问题如磁盘满载、内存泄漏等,避免服务中断。脚本应包括磁盘空间、内存/CPU使用、系统时间准确性、关键服务状态及系统日志分析等检查项。通过编写并定期运行这样的脚本,可以显著提高服务器的稳定性和可靠性。
64 1
|
4月前
|
缓存 数据安全/隐私保护 UED
代理服务器在HTTP请求中的应用:Ruby实例
代理服务器在HTTP请求中的应用:Ruby实例

热门文章

最新文章

相关产品

  • 云服务器 ECS