常用公有云接入——华为
一、介紹
1、什么是彈性云服務器?
彈性云服務器是由CPU、內存、鏡像、云硬盤組成的一種可隨時獲取、彈性可擴展的計算服務器,同時它結合虛擬私有云、虛擬防火墻、數據多副本保存等能力,為您打造一個高效、可靠、安全的計算環境,確保您的服務持久穩定運行。彈性云服務器創建成功后,您就可以像使用自己的本地PC或物理服務器一樣,在云上使用彈性云服務器。
彈性云服務器的開通是自助完成的,您只需要指定CPU、內存、鏡像規格、登錄鑒權方式即可,同時也可以根據您的需求隨時調整您的彈性云服務器規格。
產品架構
通過和其他產品、服務組合,彈性云服務器可以實現計算、存儲、網絡、鏡像安裝等功能:
- 彈性云服務器在不同可用區中部署(可用區之間通過內網連接),一個可用區發生故障后不會影響同一區域內的其它可用區。
- 可以通過虛擬私有云建立專屬的網絡環境,設置子網、安全組,并通過彈性公網IP實現外網鏈接(需帶寬支持)。
- 通過鏡像服務,可以對彈性云服務器安裝鏡像,也可以通過私有鏡像批量創建彈性云服務器,實現快速的業務部署。
- 通過云硬盤服務實現數據存儲,并通過云硬盤備份服務實現數據的備份和恢復。
圖1?ECS產品架構?
2、區域和可用區
區域指彈性云服務器所在的物理位置。
同一區域內可用區間內網互通,不同區域間內網不互通。
公有云在世界不同地區有數據中心。與此相應,彈性云服務器可用于不同地區。通過在不同地區創建彈性云服務器,可以將應用程序設計的更接近特定客戶的要求,或滿足不同地區的法律或其他要求。彈性云服務器使用定價因區域而異。
每個區域包含許多不同的稱為“可用區”的位置,即在同一區域下,電力、網絡隔離的物理區域,可用區之間內網互通,不同可用區之間物理隔離。每個可用區都被設計成不受其他可用區故障的影響,并提供低價、低延遲的網絡連接,以連接到同一地區其他可用區。通過使用獨立可用區內的彈性云服務器,可以保護您的應用程序不受單一位置故障的影響。
3、存儲
云硬盤的類型
彈性云服務器使用的云硬盤類型有如下幾種:
- 普通IO:該類型云硬盤的最大IOPS為2200,適用于大容量、讀寫速率中等、事務性處理較少的應用場景,例如企業的日常辦公應用或者小型測試等。
- 高IO:該類型云硬盤的最大IOPS可達5000,最低讀寫時延為1 ms,適用于主流的高性能、高可靠應用場景,例如企業應用、大型開發測試以及Web服務器日志等。
- 超高IO:該類型云硬盤的最大IOPS可達33000,最低讀寫時延為1 ms,適用于超高IO,超大帶寬的讀寫密集型應用場景,例如高性能計算應用場景,用來部署分布式文件系統,或者I/O密集型應用場景,用來部署各類NoSQL/關系型數據庫。
- 超高IO (時延優化):該類型的云硬盤提供低至1 ms的讀寫時延和高達1 GB/s的吞吐量,可運行企業核心業務,如SAP HANA。?說明:
超高IO (時延優化)云硬盤,當前僅支持掛載到SAP HANA云服務器使用。
云硬盤的磁盤模式
云硬盤的磁盤模式分為VBD (虛擬塊存儲設備 , Virtual Block Device) 類型和SCSI (小型計算機系統接口, Small Computer System Interface) 類型。
- VBD類型:
當您通過管理控制臺創建云硬盤時,云硬盤的磁盤模式默認為VBD類型。VBD類型的云硬盤只支持簡單的SCSI讀寫命令。
- SCSI類型:
您可以通過管理控制臺創建SCSI類型的云硬盤,該類型的云硬盤支持SCSI指令透傳,允許彈性云服務器操作系統直接訪問底層存儲介質。除了簡單的SCSI讀寫命令,SCSI類型的云硬盤還可以支持更高級的SCSI命令。
4、虛擬私有云
通過虛擬私有云(Virtual Private Cloud,以下簡稱VPC),您可以在自己的邏輯隔離區域中定義虛擬網絡,為彈性云服務器構建一個邏輯上完全隔離的專有區域。您還可以在VPC中定義安全組、VPN、IP地址段、帶寬等網絡特性,方便管理、配置內部網絡,進行安全、快捷的網絡變更。同時,您可以自定義安全組內與組間彈性云服務器的訪問規則,加強彈性云服務器的安全保護。
5、鏡像
鏡像
鏡像是一個包含了軟件及必要配置的彈性云服務器模板,至少包含操作系統,還可以包含應用軟件(例如,數據庫軟件)和私有軟件。通過鏡像,您可以創建彈性云服務器。
鏡像分為公共鏡像和私有鏡像,公共鏡像為系統默認提供的鏡像,私有鏡像為用戶自己創建的鏡像。用戶可以靈活便捷的使用公共鏡像或者私有鏡像申請彈性云服務器。同時,用戶還能通過已有的彈性云服務器創建私有鏡像,這樣能快速輕松地啟動能滿足您一切需求的新彈性云服務器。例如,如果您的應用程序是網站或Web服務,您的鏡像可能會包含Web服務器、相關靜態內容和動態頁面代碼。因此,您通過這個鏡像創建彈性云服務器之后,您的Web服務器將啟動,并且您的應用程序已準備好接受請求。
鏡像類型
| 公共鏡像 | 常見的標準操作系統鏡像,所有用戶可見,包括操作系統以及預裝的公共應用。 |
| 私有鏡像 | 用戶基于彈性云服務器或者云硬盤備份(系統盤備份)創建的個人鏡像,僅用戶自己可見。包含操作系統、預裝的公共應用以及用戶的私有應用。 私有鏡像包括系統鏡像和數據鏡像,其中:
|
| 共享鏡像 | 由其他用戶共享的私有鏡像。 |
| 市場鏡像 | 提供預裝操作系統、應用環境和各類軟件的優質第三方鏡像。無需配置,可一鍵部署,滿足建站、應用開發、可視化管理等個性化需求。 |
鏡像和彈性云服務器
鏡像是彈性云服務器的操作系統。可以通過鏡像創建彈性云服務器,也可以將彈性云服務器轉化為鏡像。
6、生命周期
生命周期是指彈性云服務器從創建到刪除(或釋放)歷經的各種狀態。
| 創建中 | 中間狀態 | 創建彈性云服務器實例后,在彈性云服務器狀態進入運行中之前的狀態。 | BUILD/BUILDING |
| 正在開機 | 中間狀態 | 彈性云服務器實例從關機到運行中的中間狀態。 | SHUTOFF |
| 運行中 | 穩定狀態 | 彈性云服務器實例正常運行狀態。 在這個狀態的實例可以運行您的業務。 | ACTIVE |
| 正在關機 | 中間狀態 | 彈性云服務器實例從運行中到關機的中間狀態。 | ACTIVE |
| 關機 | 穩定狀態 | 彈性云服務器實例被正常停止。 在這個狀態下的實例,不能對外提供業務。 | SHUTOFF |
| 重啟中 | 中間狀態 | 彈性云服務器實例正在進行重啟操作。 | REBOOT |
| 更新規格中 | 中間狀態 | 彈性云服務器實例接收變更請求,開始進行變更操作。 | RESIZE |
| 更新規格校驗中 | 中間狀態 | 彈性云服務器實例正在校驗變更完成后的配置。 | VERIFY_RESIZE |
| 刪除中 | 中間狀態 | 彈性云服務器實例處于正在被刪除的狀態。 如果長時間處于該狀態,則說明出現異常,需要聯系管理員處理。 | ACTIVE/SHUTOFF/REBOOT/RESIZE/VERIFR_RESIZE/ /HARD_REBOOT/ REVERT_RESIZE/ERROR |
| 已刪除 | 中間狀態 | 彈性云服務器實例已被正常刪除。在該狀態下的實例,不能對外提供業務,并在短時間內從系統中徹底清除。 | DELETED |
| 故障 | 穩定狀態 | 彈性云服務器實例處于異常狀態。 在這個狀態下的實例,不能對外提供業務,需要聯系管理員進行處理。 | ERROR |
| 重裝操作系統中 | 中間狀態 | 彈性云服務器實例接收到重裝操作系統請求,處于重裝操作系統的過程中。 | SHUTOFF |
| 重裝操作系統失敗 | 穩定狀態 | 彈性云服務器實例接收到重裝操作系統請求,進行重裝的過程中發生異常,導致重裝失敗。 在這個狀態下的實例,不能對外提供業務,需要聯系管理員進行處理。 | SHUTOFF |
| 切換操作系統中 | 中間狀態 | 彈性云服務器實例接收到切換操作系統請求,處于切換操作系統的過程中。 | SHUTOFF |
| 切換操作系統失敗 | 穩定狀態 | 彈性云服務器實例接收到切換操作系統請求,進行切換的過程中發生異常,導致切換失敗。 在這個狀態下的實例,不能對外提供業務,需要聯系管理員進行處理。 | SHUTOFF |
| 強制重啟中 | 中間狀態 | 彈性云服務器實例正在進行強制重啟操作。 | HARD_REBOOT |
| 更新規格回退中 | 中間狀態 | 彈性云服務器實例正在回退變更規格的配置。 | REVERT_RESIZE |
| 凍結 | 穩定狀態 | 云服務器實例訂單到期或欠費,被系統管理員停止。 在這個狀態下的實例,不能對外提供業務。系統保留一段時間后,如果未續費,將自動被刪除。 | SHUTOFF |
| 鎖定 | 中間狀態/穩定狀態 | 狀態欄顯示,表示云服務器被鎖定,處于保護狀態。此時,部分操作將會被禁用,具體請以界面提示為準。 您可以點擊鎖圖標下方的超鏈接,查看加鎖資源。 | - |
?
二、Java SDK
GITHUT地址
package sample;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit;import com.huawei.openstack4j.model.compute.StopType; import com.huawei.openstack4j.model.compute.RebootType; import com.huawei.openstack4j.api.OSClient.OSClientV3; import com.huawei.openstack4j.model.common.Identifier; import com.huawei.openstack4j.model.compute.Action; import com.huawei.openstack4j.model.compute.Server; import com.huawei.openstack4j.model.compute.Server.Status; import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.ecs.v1.contants.IpType; import com.huawei.openstack4j.openstack.ecs.v1.contants.NetworkChargingMode; import com.huawei.openstack4j.openstack.ecs.v1.contants.ShareType; import com.huawei.openstack4j.openstack.ecs.v1.contants.VolumeType; import com.huawei.openstack4j.openstack.ecs.v1.domain.Bandwidth; import com.huawei.openstack4j.openstack.ecs.v1.domain.CloudServer; import com.huawei.openstack4j.openstack.ecs.v1.domain.CloudServer.CloudServers; import com.huawei.openstack4j.openstack.ecs.v1.domain.DataVolume; import com.huawei.openstack4j.openstack.ecs.v1.domain.FloatingIPCreate; import com.huawei.openstack4j.openstack.ecs.v1.domain.Personality; import com.huawei.openstack4j.openstack.ecs.v1.domain.ResizeServer; import com.huawei.openstack4j.openstack.ecs.v1.domain.RootVolume; import com.huawei.openstack4j.openstack.ecs.v1.domain.ServerCreate; import com.huawei.openstack4j.openstack.ecs.v1.domain.ServerExtendParam; import sun.misc.BASE64Encoder;public class CloudServerV1 {public static void main(String[] args) throws InterruptedException {// Using credentials for authenticationString authUrl = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //endpoint UrlString user = "xxxxx"; //usernameString password = "xxxxx"; //passwordString projectId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //projectIdString userDomainId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //domainId//create connection OSClientV3 os = OSFactory.builderV3().endpoint(authUrl).credentials(user, password, Identifier.byId(userDomainId)).scopeToProject(Identifier.byId(projectId)).authenticate();int count = 1;String flavorId = "s2.xlarge.1";String imageId = "a1e6a557-e6c5-43a0-9d4e-a90fdf376afb";String vpcId = "0d85e49a-6aef-42a9-8583-c86e4317a7e2";String networkId = "319944c8-baac-46da-a3a8-f07956105a4e";String secGroup = "114f5982-ecdc-4297-ae23-e6aa17763c78";String userData_org = "#!/bin/bash \r\n echo 'root:Cloud.1234' | chpasswd ;";byte[] userData_byte = userData_org.getBytes();String userData = new BASE64Encoder().encode(userData_byte);Bandwidth bandwidth = Bandwidth.builder().size(10).shareType(ShareType.PER).chargeMode(NetworkChargingMode.TRAFFIC).build();FloatingIPCreate FIPbuild = FloatingIPCreate.builder().ipType(IpType.BGP).bandwidth(bandwidth).build();ServerCreate creation = ServerCreate.builder().name("test-name").flavorRef(flavorId).imageRef(imageId).userData(userData).vpcId(vpcId).addNetwork(networkId).availabilityZone("eu-de-02").addSecurityGroup(secGroup).addTag("key", "testvalue").publicIP(FIPbuild).keyName("KeyPair-a6c5").addMetadata("Group", "testGroup").addPersonality(Personality.builder().contents("some content").path("/etc/test.txt").build()).rootVolume(RootVolume.builder().type(VolumeType.SSD).build()).addDataVolume(DataVolume.builder().size(10).type(VolumeType.SATA).multiAttach(true).passthrough(true).build()).extendParam(ServerExtendParam.builder().autoRecovery(true).build()).count(count).build();//create serverString jobId = os.ecs().servers().create(creation);if (null != jobId) {System.out.println("create server success, jobId = " + jobId);} else {System.out.println("create server failed");}//get list of serverList<? extends Server> serverList = os.compute().servers().list();if (serverList.size() > 0) {System.out.println("get serverList success, size = " + serverList.size());} else {System.out.println("get serverList failed");}//find server, wait for server status to ACTIVEMap<String , String> filterName = new HashMap<String, String>();filterName.put("name", "test-name");List<? extends Server> servers = os.compute().servers().list(filterName);ArrayList<String> serverIds = new ArrayList<String>();servers = os.compute().servers().list(filterName);for (Server server : servers) {os.compute().servers().waitForServerStatus(server.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES);//get serverCloudServer serverInfo = os.ecs().servers().get(server.getId());if (null != serverInfo) {System.out.println("get serverInfo success, name = " + serverInfo.getName());} else {System.out.println("get serverInfo server failed");}serverIds.add(server.getId());}//reboot serverString rebootJobId = os.ecs().servers().reboot(serverIds, RebootType.SOFT);if (null != rebootJobId) {System.out.println("batch reboot server success, jobId = " + rebootJobId);} else {System.out.println("batch reboot server failed");}//stop serverString stopJobId = os.ecs().servers().stop(serverIds, StopType.SOFT);if (null != stopJobId) {System.out.println("batch stop server success, jobId = " + stopJobId);} else {System.out.println("batch stop server failed");}//start serverString startJobId = os.ecs().servers().start(serverIds);if (null != startJobId) {System.out.println("batch start server success, jobId = " + startJobId);} else {System.out.println("batch start server failed");}//delete serverString deleteJobId = os.ecs().servers().delete(serverIds, false, false);if (null != deleteJobId) {System.out.println("batch delete server success, jobId = " + deleteJobId);} else {System.out.println("batch delete server failed");}//resize serverString newFlavorId = "s2.medium.2";String serverId = "ac91c721-9e8e-4147-83d9-b4f07ad607ed";ResizeServer resize = ResizeServer.builder().flavorRef(newFlavorId).build();os.compute().servers().action(serverId, Action.STOP);os.compute().servers().waitForServerStatus(serverId, Status.SHUTOFF, 3, TimeUnit.MINUTES);String resizeJobId = os.ecs().servers().resize(resize, serverId);if (null != resizeJobId) {System.out.println("Start to resize server, jobId = " + resizeJobId);} else {System.out.println("resize server failed");}//get count and list of serverCloudServers cloudServer = os.ecs().servers().listWithCount();System.out.println("server count: " + cloudServer.getCount());System.out.println("server list: " + cloudServer.getServers());//get count and list of server with parametersMap<String, String> filter = new HashMap<String, String>();filter.put("offset", "0");filter.put("status", "ACTIVE");CloudServers serverObjects = os.ecs().servers().listWithCount(filter);System.out.println("server count: " + serverObjects.getCount());System.out.println("server list: " + serverObjects.getServers());} }?
三、REST API
(1)介紹
1、請求URI
請求URI由如下部分組成:
{URI-scheme}://{Endpoint}/{resource-path}?{query-string}
盡管請求URI包含在請求消息頭中,但大多數語言或框架都要求您從請求消息中單獨傳遞它,所以在此單獨強調。
| URI-scheme | 表示用于傳輸請求的協議。 |
| Endpoint | 指定承載REST服務端點的服務器域名或IP,從地區和終端節點獲取。 |
| resource-path | 資源路徑,也即API訪問路徑。從具體接口的URI模塊獲取,例如“v3/auth/tokens”。 |
| query-string | 可選參數,例如API版本或資源選擇標準。 |
請求方法
HTTP方法(也稱為操作或動詞),它告訴服務你正在請求什么類型的操作。
| GET | 請求服務器返回指定資源。 |
| PUT | 請求服務器更新指定資源。 |
| POST | 請求服務器新增資源或執行特殊操作。 |
| DELETE | 請求服務器刪除指定資源,如刪除對象等。 |
| HEAD | 請求服務器資源頭部。 |
| PATCH | 請求服務器更新資源的部分內容。 當資源不存在的時候,PATCH可能會去創建一個新的資源。 |
2、請求消息頭
可選的附加請求頭字段,如指定的URI和HTTP方法所要求的字段。詳細的公共請求消息頭字段請參見?表3。
| X-Sdk-Date | 請求的發生時間,格式為YYYYMMDD'T'HHMMSS'Z'。 取值為當前系統的GMT時間。 | 否 使用AK/SK認證時該字段必選。 | 20150907T101459Z |
| Authorization | 簽名認證信息。 該值來源于請求簽名結果。 | 否 使用AK/SK認證時該字段必選。 | SDK-HMAC-SHA256 Credential=ZIRRKMTWPTQFQI1WKNKB/20150907//ec2/sdk_request, SignedHeaders=content-type;host;x-sdk-date, Signature=55741b6...e1994 |
| Host | 請求的服務器信息,從服務API的URL中獲取。值為hostname[:port]。端口缺省時使用默認的端口,https的默認端口為443。 | 否 使用AK/SK認證時該字段必選。 | code.test.com or code.test.com:443 |
| Content-Type | 發送的實體的MIME類型。推薦用戶默認使用application/json,如果API是對象、鏡像上傳等接口,媒體類型可按照流類型的不同進行確定。 | 是 | application/json |
| Content-Length | 請求body長度,單位為Byte。 | 否 | 3495 |
| X-Project-Id | project id,項目編號。請參考獲取項目ID章節獲取項目編號。 如果是DeC的請求或者多project的請求則必須傳入project id。 | 否 如果是專屬云場景采用AK/SK 認證方式的接口請求或者多project場景采用AK/SK認證的接口請求則該字段必選。 | e9993fc787d94b6c886cbaa340f9c0f4 |
| X-Auth-Token | 用戶Token。 獲取Token,請參考《統一身份認證服務API參考》的“獲取用戶Token”章節。請求響應成功后在響應消息頭中包含的“X-Subject-Token”的值即為Token值。 | 否 使用Token認證時該字段必選。 | 注:以下僅為Token示例片段 MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ |
3、請求消息體
該部分可選。請求消息體通常以結構化格式(如JSON或XML)發出,與請求消息頭中Content-Type對應,傳遞除請求消息頭之外的內容。
若請求消息體中的參數支持中文,則中文字符必須為UTF-8編碼。
4、響應消息頭
響應消息頭包含如下兩部分:
- 一個HTTP狀態代碼,從2xx成功代碼到4xx或5xx錯誤代碼,或者可以返回服務定義的狀態碼。
- 附加響應頭字段,如Content-Type響應消息頭。詳細的公共響應消息頭字段請參考?表4。
表4?公共響應消息頭
名稱
描述
示例
Content-Length
響應消息體的字節長度,單位為Byte。
--
Date
系統響應的GMT時間。
Wed, 27 Dec 2016 06:49:46 GMT
Content-Type
響應消息體的MIME類型。
application/json
5、響應消息體
該部分可選。響應消息體通常以結構化格式(如JSON或XML)返回,與響應消息頭中Content-Type對應,傳遞除響應消息頭之外的內容。
發送請求
共有三種方式可以基于已構建好的請求消息發起請求,分別為:
- cURL
cURL是一個命令行工具,用來執行各種URL操作和信息傳輸。cURL充當的是HTTP客戶端,可以發送HTTP請求給服務端,并接收響應消息。cURL適用于接口調試。關于cURL詳細信息請參見https://curl.haxx.se/。
- 編碼
通過編碼調用接口,組裝請求消息,并發送處理請求消息。
- REST客戶端
Mozilla、Google都為REST提供了圖形化的瀏覽器插件,發送處理請求消息。針對Firefox,請參見FirefoxREST Client;針對Chrome,請參見Postman。
?
(2)API示例
當您使用Token認證方式完成認證鑒權時,需要獲取用戶Token并在調用接口時增加“X-Auth-Token”到業務接口請求消息頭中。
- IAM獲取token的API
- ECS創建云服務器的API
具體步驟
請求響應成功后,返回job_id。
若請求失敗,則會返回錯誤碼及對應的錯誤信息說明,詳細錯誤碼信息請參考錯誤碼說明。
查詢job詳情返回狀態status為“SUCCESS”,則表示彈性云服務器創建成功。
請求異常返回值說明請參考通用請求返回值。
?
(3)API接口
生命周期管理
- 創建云服務器
- 創建云服務器(v1.1版本)
- 刪除云服務器
- 查詢云服務器詳情
- 查詢云服務器詳情列表
- 批量修改彈性云服務器
狀態管理
- 批量啟動云服務器
- 批量重啟云服務器
- 批量關閉云服務器
- 重裝彈性云服務器操作系統(安裝Cloud-init)
- 切換彈性云服務器操作系統(安裝Cloud-init)
- 重裝彈性云服務器操作系統(未安裝Cloud-init)
- 切換彈性云服務器操作系統(未安裝Cloud-init)
- 查詢云服務器是否配置了自動恢復動作
- 管理云服務器自動恢復動作
- 注冊云服務器監控
規格管理
- 查詢規格詳情和規格擴展信息列表
- 變更云服務器規格
- 變更云服務器規格(v1.1版本)
- 查詢云服務器規格變更支持列表
網卡管理
- 批量添加云服務器網卡
- 批量刪除云服務器網卡
- 云服務器網卡配置虛擬IP地址
- 云服務器網卡解綁虛擬IP地址
磁盤管理
- 查詢彈性云服務器磁盤信息
- 查詢彈性云服務器單個磁盤信息
- 彈性云服務器掛載磁盤
- 批量掛載指定共享盤
- 彈性云服務器卸載磁盤
租戶配額管理
- 查詢租戶配額
查詢Job狀態
- 查詢任務的執行狀態
總結
以上是生活随笔為你收集整理的常用公有云接入——华为的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑键盘上实用的8个按键功能强大键盘各个
- 下一篇: 乐视路由器怎么在手机上修改wifi密码请