全部产品
Search
文档中心

弹性容器实例:Go SDK使用示例

更新时间:Dec 16, 2022

本文介绍如何使用ECI的Go SDK,并给出基本操作示例。

安装SDK

您可以从GitHub获取Go SDK。

代码示例

const.go

package eci
type ContainerGroupStatus string
const (
        Scheduling     = ContainerGroupStatus("Scheduling")
        Pending        = ContainerGroupStatus("Pending")
        Running        = ContainerGroupStatus("Running")
        Succeeded      = ContainerGroupStatus("Succeeded")
        Failed         = ContainerGroupStatus("Failed")
        Restarting     = ContainerGroupStatus("Restarting")
        Updating       = ContainerGroupStatus("Updating")
        ScheduleFailed = ContainerGroupStatus("ScheduleFailed")
)
type ContainerStatus string
const (
        waiting    = ContainerStatus("Waiting")
        running    = ContainerStatus("Running")
        terminated = ContainerStatus("Terminated")
)

config.conf

[eci_conf]
#测试账号ak
access_key = xxx
secret_key = xxx
#region
region_id=cn-hangzhou
#每个region下的资源信息,json格式
region_info={"cn-hangzhou": {"securityGroupId": "sg-bp118knl07ymorgz****","vSwitchId": "vsw-bp1jrgfqqy54kg5hc****","zoneId": "cn-hangzhou-h"},"cn-shanghai": {"securityGroupId": "sg-uf62jug0dt92nfy6****","vSwitchId": "vsw-uf6cb39ub5urw82bv****","zoneId": "cn-shanghai-g"},"cn-beijing": {"securityGroupId": "sg-2ze6uv80a8s4yk04****","vSwitchId": "vsw-2zegtxf8q29d8tt1x****","zoneId": "cn-beijing-h"},"cn-shenzhen":{"securityGroupId": "sg-wz96x4kv4edy97q6****","vSwitchId": "vsw-wz9rn33jwilodp24k****","zoneId": "cn-shenzhen-a"},"cn-hongkong":{"securityGroupId": "sg-j6cjajpf7f4ybda7****","vSwitchId": "vsw-j6c9c9fit5owbbc0i****","zoneId": "cn-hongkong-b"},"us-west-1":{"securityGroupId": "sg-u19hbpj9x****","vSwitchId": "vsw-rj9h5vvzhb4fjkuzu****","zoneId": "us-west-1a"},"us-east-1":{"securityGroupId": "sg-0xih51sfoldxzxf****","vSwitchId": "vsw-0xisefewxoqe4f849****","zoneId": "us-east-1b"},"ap-southeast-1":{"securityGroupId": "sg-t4n23ppw7fm5to7c****","vSwitchId": "vsw-t4nr1xt8zupxg00un****","zoneId": "ap-southeast-1b"},"cn-zhangjiakou": {"securityGroupId": "sg-8vb96lku1dgq71ck****","vSwitchId": "vsw-8vbtnz5878r3bcio7****", "nfs":"9cbb94****-oav**.cn-zhangjiakou.nas.aliyuncs.com", "zoneId": "cn-zhangjiakou-a"}}

config.conf的region_info参数参考如下:

{
    "cn-hangzhou": {
        "securityGroupId": "sg-bp118knl07ymorgz****",
        "vSwitchId": "vsw-bp1jrgfqqy54kg5hc****",
        "zoneId": "cn-hangzhou-h"
    },
    "cn-shanghai": {
        "securityGroupId": "sg-uf62jug0dt92nfy6****",
        "vSwitchId": "vsw-uf6cb39ub5urw82bv****",
        "zoneId": "cn-shanghai-g"
    },
    "cn-beijing": {
        "securityGroupId": "sg-2ze6uv80a8s4yk0****",
        "vSwitchId": "vsw-2zegtxf8q29d8tt1x****",
        "zoneId": "cn-beijing-h"
    },
    "cn-shenzhen": {
        "securityGroupId": "sg-wz96x4kv4edy97q6****",
        "vSwitchId": "vsw-wz9rn33jwilodp24k****",
        "zoneId": "cn-shenzhen-a"
    },
    "cn-hongkong": {
        "securityGroupId": "sg-j6cjajpf7f4ybda7****",
        "vSwitchId": "vsw-j6c9c9fit5owbbc0i****",
        "zoneId": "cn-hongkong-b"
    },
    "us-west-1": {
        "securityGroupId": "sg-u19hbpj9x****",
        "vSwitchId": "vsw-rj9h5vvzhb4fjkuzu****",
        "zoneId": "us-west-1a"
    },
    "ap-southeast-1": {
        "securityGroupId": "sg-t4n23ppw7fm5to7c****",
        "vSwitchId": "vsw-t4nr1xt8zupxg00un****",
        "zoneId": "ap-southeast-1b"
    },
    "cn-zhangjiakou": {
        "securityGroupId": "sg-8vb96lku1dgq71ck****",
        "vSwitchId": "vsw-8vbtnz5878r3bcio7****",
        "zoneId": "cn-zhangjiakou-a"
    }
}

eci.go

package eci
import (
        "encoding/json"
        "fmt"
        "github.com/Unknown/goconfig"
        "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
        "github.com/aliyun/alibaba-cloud-sdk-go/services/eci"
        "math"
        "os"
        "reflect"
        "strconv"
        "time"
)
var accessKey string
var secretKey string
var regionId string
var zoneId string
var securityGroupId string
var vSwitchId string
var client *eci.Client
/**
获取配置信息
 */
func init() {
        var cfg *goconfig.ConfigFile
        config, err := goconfig.LoadConfigFile("./eci/config.conf") //加载配置文件
        if err != nil {
                fmt.Println("get config file error:", err.Error())
                os.Exit(-1)
        }
        cfg = config
        accessKey, _ = cfg.GetValue("eci_conf", "access_key")
        secretKey, _ = cfg.GetValue("eci_conf", "secret_key")
        regionId, _ = cfg.GetValue("eci_conf", "region_id")
        var regionInfo map[string](map[string](string));
        value, _ := cfg.GetValue("eci_conf", "region_info")
        json.Unmarshal([]byte(value), &regionInfo)
        zoneId = regionInfo[regionId]["zoneId"]
        securityGroupId = regionInfo[regionId]["securityGroupId"]
        vSwitchId = regionInfo[regionId]["vSwitchId"]
        fmt.Printf("init success[ access_key:%s, secret_key:%s, region_id:%s, zoneId:%s, vSwitchId:%s, securityGroupId:%s]\n",
                accessKey, secretKey, regionId, zoneId, vSwitchId, securityGroupId)
    //初始化client
    client, err = eci.NewClientWithAccessKey(regionId, accessKey, secretKey)
        if err != nil {
                panic(err)
        }
}
/**
创建
*/
func createContainerGroup ()(string)  {
        // Create Container Group
        createContainerRequest := eci.CreateCreateContainerGroupRequest()
        // required
        createContainerRequest.RegionId = regionId;
        createContainerRequest.SecurityGroupId = securityGroupId
        createContainerRequest.VSwitchId = vSwitchId
        createContainerRequest.ContainerGroupName = "test-go-sdk"
        createContainerRequest.RestartPolicy = "Never"
        createContainerRequestVolume := make([]eci.CreateContainerGroupVolume, 1)
        volume1 := &eci.CreateContainerGroupNFSVolume{
                Path:"/",
                Server:"0a1bf4****-jaq**.cn-hangzhou.nas.aliyuncs.com",
        }
        createContainerRequestVolume[0].Name = "volume1"
        createContainerRequestVolume[0].Type ="NFSVolume"
        createContainerRequestVolume[0].NFSVolume=*volume1
        createContainerRequest.Volume = &createContainerRequestVolume
        createContainerRequestContainer := make([]eci.CreateContainerGroupContainer, 1)
        createContainerRequestContainer[0].Image = "nginx"
        createContainerRequestContainer[0].Name = "nginx-liu"
        // option
        createContainerRequestContainer[0].Cpu = requests.NewFloat(0.25)
        createContainerRequestContainer[0].Memory = requests.NewFloat(0.5)
        createContainerRequestContainer[0].ImagePullPolicy = "IfNotPresent"
        createContainerRequest.Container = &createContainerRequestContainer
        //sdk-core默认的重试次数为3,在没有加幂等的条件下,资源创建的接口底层不需要自动重试
        client.GetConfig().MaxRetryTime = 0
        createContainerGroupResponse, err := client.CreateContainerGroup(createContainerRequest)
        if err != nil {
                panic(err)
        }
        containerGroupId := createContainerGroupResponse.ContainerGroupId
        fmt.Println(containerGroupId)
        return containerGroupId
}
/**
删除
*/
func deleteContainerGroup(containerGroupId string) {
        deleteContainerGroupRequest := eci.CreateDeleteContainerGroupRequest()
        deleteContainerGroupRequest.RegionId = regionId
        deleteContainerGroupRequest.ContainerGroupId = containerGroupId
    _, err := client.DeleteContainerGroup(deleteContainerGroupRequest)
        if err != nil {
                panic(err)
        }
        fmt.Println("DeleteContainerGroup ContainerGroupId :", containerGroupId)
}
/**
查询
*/
func describeContainerGroup(containerGroupId string) (eci.DescribeContainerGroupsContainerGroup0)  {
        // Describe Container Groups
        describeContainerGroupsRequest := eci.CreateDescribeContainerGroupsRequest()
        describeContainerGroupsRequest.RegionId = regionId
        containerGroupIds := append([]string{}, containerGroupId)
        containerGroupIdsString, err := json.Marshal(containerGroupIds)
        describeContainerGroupsRequest.ContainerGroupIds = string(containerGroupIdsString)
        describeContainerGroupsResponse, err := client.DescribeContainerGroups(describeContainerGroupsRequest)
        if err != nil {
                panic(err)
        }
        describeContainerGroupNumber := len(describeContainerGroupsResponse.ContainerGroups)
        if describeContainerGroupsResponse.TotalCount != 1 && describeContainerGroupNumber != 1 {
                fmt.Println("Invalid ContainerGroups count", describeContainerGroupsResponse.TotalCount, describeContainerGroupNumber)
                panic("Invalid ContainerGroups count")
        }
        fmt.Println("ContainerGroup status:", describeContainerGroupsResponse.ContainerGroups[0].Status, containerGroupId,)
        // container groups
        return describeContainerGroupsResponse.ContainerGroups[0]
}
func describeContainerGroupMetric(containerGroupId string)  {
        describeContainerGroupMetricRequest :=eci.CreateDescribeContainerGroupMetricRequest()
        describeContainerGroupMetricRequest.RegionId = regionId
        describeContainerGroupMetricRequest.ContainerGroupId=containerGroupId
        response, err := client.DescribeContainerGroupMetric(describeContainerGroupMetricRequest)
        if err != nil {
                panic(err)
        }
        data, _ :=json.Marshal(response)
        fmt.Printf("Metrics for %s:%s\n", containerGroupId, string(data))
}
func describeMultiContainerGroupMetric(containerGroupIds []string)  {
        describeContainerGroupMetricRequest
    :=eci.CreateDescribeMultiContainerGroupMetricRequest()
        describeContainerGroupMetricRequest.RegionId = regionId
        data,_ :=json.Marshal(containerGroupIds)
        describeContainerGroupMetricRequest.ContainerGroupIds=string(data)
        response, err := client.DescribeMultiContainerGroupMetric(describeContainerGroupMetricRequest)
        if err != nil {
                panic(err)
        }
        data, _ = json.Marshal(response)
        fmt.Printf("Metrics:%s\n", string(data))
}
func Test() {
        containerGroupIds := make(chan string)
        go func() {
                for i := 0; i < 1; i++ {
                        containerGroupId := createContainerGroup()
                        containerGroupIds <- containerGroupId
                }
        }()
        go func() {
                for containerGroupId := range containerGroupIds {
                        for i := 0; i < 10; i++ {
                                status := describeContainerGroup(containerGroupId).Status
                                if Running == ContainerGroupStatus(status) {
                                        break
                                } else {
                                        time.Sleep(5 * time.Second)
                                }
                        }
                        //deleteContainerGroupById(containerGroupId)
                }
        }()
        //阻塞等待异步执行完,不然会提前退出。
        var input string
        fmt.Println("waiting for input to finish:")
        fmt.Scanln(&input)
        fmt.Println("test done!")
}

main.go

func main() {
        eci.Test()
}