如何在 Go SDK V2 中以编程方式获取 AWS 区域列表

问题描述 投票:0回答:4

AWS 从

Go SDK V2
中删除了 endpoints 软件包。有没有办法使用 Go SDK V2 获取 AWS 区域列表?

在 V1 中你可以这样写:

    import "github.com/aws/aws-sdk-go/aws/endpoints"
    ...
    ...
    
        partitions := endpoints.DefaultPartitions()
        for _, p := range partitions {
            for region := range p.Regions() {
                validRegions[region] = struct{}{}
            }
        }
    
    ...
    ...

然而,这似乎不再可能了。我确实注意到一个自动生成的 json 它似乎包含所有分区,但是我似乎无法弄清楚如何获取代码中的可用区域列表。

Go SDK V2 有办法做到这一点吗?

amazon-web-services aws-sdk aws-sdk-go
4个回答
3
投票

EC2客户端中有一个

DescribeRegions
方法:https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/ec2#Client.DescribeRegions

您可以请求所有区域,或根据选择加入状态进行过滤。


0
投票

一种选择是获取您提到的 JSON,例如:

// endpoints holds the aws generated endpoints.json
type endpoints struct {
    Partitions []Partition `json:"partitions"`
}

type Partition struct {
    PartitionName string                 `json:"partitionName"`
    Regions       map[string]interface{} `json:"regions"`
    Services      map[string]Service     `json:"services"`
}

type Service struct {
    Endpoints map[string]interface{} `json:"endpoints"`
}

func main() {

    fmt.Println("Generating AWS regions")

    resp, err := http.Get("https://raw.githubusercontent.com/aws/aws-sdk-go-v2/master/codegen/smithy-aws-go-codegen/src/main/resources/software/amazon/smithy/aws/go/codegen/endpoints.json")
    if err != nil {
        fmt.Fprintln(os.Stderr, err.Error())
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Fprintln(os.Stderr, err.Error())
    }

    e := endpoints{}
    err = json.Unmarshal(body, &e)
    if err != nil {
        fmt.Fprintln(os.Stderr, err.Error())
    }

    // do something with e
}

0
投票

抱歉我来晚了一点。

我想我可能已经找到了一个解决方案,使用AWS Go SDK v1,有一些文档可以运行以下命令:

import "github.com/aws/aws-sdk-go/aws/endpoints"

EXAMPLE_CODE...

func describeRegions(service string) (map[string]endpoints.Region, bool) {
    sr, exists := endpoints.RegionsForService(endpoints.DefaultPartitions(), endpoints.AwsPartitionID, service)
    return sr, exists
}


func regionLooper() {
    regionList, exists := describeRegions("config") //This is the service you want to check. 
    if exists {
        for _, region := range regionList {
            r := region.ID()
            fmt.Printf("Switching to region: %s\n", r)
        }
    }
}

您可以将服务作为字符串传递到端点中,不幸的是,

endpoint.SERVICE
已被弃用,例如
endpoint.ConfigServiceID
。因此,您必须使用此列表中的正确变量。

希望有帮助!


-4
投票

没有办法。新的 SDK 在设计上已被破坏,不应使用。

© www.soinside.com 2019 - 2024. All rights reserved.