/
aws.go
87 lines (79 loc) · 2.03 KB
/
aws.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package lib
import (
"context"
"os"
"sync"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
)
var sess *session.Session
var sessLock sync.RWMutex
var sessRegional = make(map[string]*session.Session)
func SessionExplicit(accessKeyID, accessKeySecret, region string) *session.Session {
sess, err := session.NewSession(&aws.Config{
Region: aws.String(region),
STSRegionalEndpoint: endpoints.RegionalSTSEndpoint,
MaxRetries: aws.Int(5),
Credentials: credentials.NewStaticCredentials(accessKeyID, accessKeySecret, ""),
})
if err != nil {
panic(err)
}
return sess
}
func Session() *session.Session {
sessLock.Lock()
defer sessLock.Unlock()
if sess == nil {
err := os.Setenv("AWS_SDK_LOAD_CONFIG", "true")
if err != nil {
panic(err)
}
sess = session.Must(session.NewSession(&aws.Config{
STSRegionalEndpoint: endpoints.RegionalSTSEndpoint,
MaxRetries: aws.Int(5),
}))
}
return sess
}
func SessionRegion(region string) (*session.Session, error) {
sessLock.Lock()
defer sessLock.Unlock()
sess, ok := sessRegional[region]
if !ok {
err := os.Setenv("AWS_SDK_LOAD_CONFIG", "true")
if err != nil {
return nil, err
}
sess, err = session.NewSession(&aws.Config{
Region: aws.String(region),
STSRegionalEndpoint: endpoints.RegionalSTSEndpoint,
MaxRetries: aws.Int(5),
})
if err != nil {
return nil, err
}
sessRegional[region] = sess
}
return sess, nil
}
func Region() string {
sess := Session()
return *sess.Config.Region
}
func Zones(ctx context.Context) ([]*ec2.AvailabilityZone, error) {
if doDebug {
d := &Debug{start: time.Now(), name: "Zones"}
defer d.Log()
}
out, err := EC2Client().DescribeAvailabilityZonesWithContext(ctx, &ec2.DescribeAvailabilityZonesInput{})
if err != nil {
Logger.Println("error:", err)
return nil, err
}
return out.AvailabilityZones, nil
}