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 有办法做到这一点吗?
EC2客户端中有一个
DescribeRegions
方法:https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/ec2#Client.DescribeRegions
您可以请求所有区域,或根据选择加入状态进行过滤。
一种选择是获取您提到的 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
}
抱歉我来晚了一点。
我想我可能已经找到了一个解决方案,使用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
。因此,您必须使用此列表中的正确变量。
希望有帮助!
没有办法。新的 SDK 在设计上已被破坏,不应使用。