在使用OpenAPI的過程中,經常會遇到一個不熟悉的API,為了測試這個API的使用方法,需要對這個接口進行真實的調用。這個過程遇到的問題是顯而易見的,如果是查詢類接口(比如DescribeInstances),直接進行測試調用是沒有什麼問題的,但是對于操作甚至建立類接口(如RunInstances),如果調用接口會對執行個體直接産生影響,或者會産生不必要的測試費用。
DryRun功能就是為了解決這種問題而存在的,DryRun是一個檢驗請求,帶有DryRun參數的請求隻會檢查其合法性,而不會對資源産生影響。使用這種方式,可以僅僅通過調用來确定一個請求的參數是否合理,賬号是否有足夠的權限調用這個接口。
根據不同類型的接口,将DryRun的使用方式分為兩種,一種是查詢類接口,一種是建立類接口。
查詢類接口主要包括5個接口:DescribeInstances, DescribeSnapshots, DescribeSecurityGroups, DescribeImages, DescribeDisks。在不使用DryRun的情況下,如果使用(RAM)子賬号調用,沒有權限的請求會以空結果的狀态的傳回(并不會報錯),表示這個使用者并沒有權限查詢所有執行個體。在這種情況下,接口的傳回并不能完全判定沒有查詢到資源還是使用者沒有權限調用。
在使用DryRun時,請求的傳回裡永遠不會包含實際的查詢結果,所有的結果都會以報錯的形式傳回,包括檢查通過的請求(為了與成功但是沒有資料的請求相區分)。檢查通過的請求會以特定的錯誤碼表示檢查通過
示例代碼如下:
DryRun參數為bool類型,取值範圍為true | false,預設為false,所有接口的DryRun入參都是統一的。
在查詢接口調用時,DryRun參數為true時檢查的請求内容主要為是否有權限調用接口,以及少數的參數基礎規則檢查(是否必填等)。
現在支援DryRun的建立接口主要為RunInstances。在不使用DryRun的情況下,RunInstances如果需要測試建立,需要真正的建立出來一台執行個體才能保證調用的有效。
使用DryRun參數,則可以簡單檢查請求是否合法。建立接口的DryRun檢查主要包含幾個方面:使用者是否有權限調用、該地域下是否有相應資源售賣、參數之間是否沖突。需要注意的是,RunInstances在使用DryRun的時候,有一個與正常情況不同的參數:Amount,在DryRun為true時,Amount參數必須為1。也就是DryRun參數是不能用來檢測建立數量的。
建立接口的DryRun代碼示例如下:
在參數完全正确的情況下,可以不通過建立執行個體來判斷請求的合法性,來對調用Ecs OpenAPI的代碼進行調試。
從DryRun參數的設計來看,主要還是應用在調用預檢查以及測試階段對請求進行校驗的場景,在使用子賬号進行查詢操作時,可以預先使用DryRun參數判斷子使用者是否有權限發起此次請求操作,同時,DryRun也可以用作子賬号的後置檢查,如果查詢接口沒有報錯但是傳回了空結果,可以使用DryRun進行一次權限校驗,來确定是否子賬号的權限不夠。
對建立類接口來說,DryRun的使用場景比較廣泛:
子賬号在建立資源前可以使用DryRun判斷是否權限足夠
在進行彈性擴充建立執行個體的代碼調試時,設定DryRun為true,可以不實際建立出執行個體就可以達到代碼調試的效果(唯一的cost就是DryRun的成功請求與實際成功的傳回不完全一樣)
建立資源前,可以進行資源的預先檢查,可以枚舉出使用場景比對的不同資源組合是否合理可建立。