Package AWS:

- Allow to use config anonymous with no access key / secret key
- Replace *http.client to interface of Do function
This commit is contained in:
Nicolas JUHEL
2023-12-14 13:40:36 +01:00
parent df925d1d47
commit 77c7ebfe83
5 changed files with 108 additions and 62 deletions

View File

@@ -28,12 +28,12 @@ package configAws
import (
"context"
"encoding/json"
"net/http"
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
sdkcfg "github.com/aws/aws-sdk-go-v2/config"
sdkcrd "github.com/aws/aws-sdk-go-v2/credentials"
libaws "github.com/nabbar/golib/aws"
libhtc "github.com/nabbar/golib/httpcli"
)
func GetConfigModel() interface{} {
@@ -88,7 +88,7 @@ func (c *awsModel) Clone() libaws.Config {
}
}
func (c *awsModel) GetConfig(ctx context.Context, cli *http.Client) (*sdkaws.Config, error) {
func (c *awsModel) GetConfig(ctx context.Context, cli libhtc.HttpClient) (*sdkaws.Config, error) {
var (
cfg sdkaws.Config
err error
@@ -98,7 +98,9 @@ func (c *awsModel) GetConfig(ctx context.Context, cli *http.Client) (*sdkaws.Con
return nil, ErrorConfigLoader.Error(err)
}
if c.AccessKey != "" && c.SecretKey != "" {
if len(c.AccessKey) < 1 || len(c.SecretKey) < 1 {
cfg.Credentials = sdkaws.AnonymousCredentials{}
} else {
cfg.Credentials = sdkcrd.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
}

View File

@@ -28,13 +28,13 @@ package configCustom
import (
"context"
"encoding/json"
"net/http"
"net/url"
"strings"
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
sdkcrd "github.com/aws/aws-sdk-go-v2/credentials"
libaws "github.com/nabbar/golib/aws"
libhtc "github.com/nabbar/golib/httpcli"
)
func GetConfigModel() interface{} {
@@ -103,11 +103,16 @@ func (c *awsModel) Clone() libaws.Config {
}
}
func (c *awsModel) GetConfig(ctx context.Context, cli *http.Client) (*sdkaws.Config, error) {
func (c *awsModel) GetConfig(ctx context.Context, cli libhtc.HttpClient) (*sdkaws.Config, error) {
cfg := sdkaws.NewConfig()
cfg.Credentials = sdkcrd.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
if len(c.AccessKey) < 1 || len(c.SecretKey) < 1 {
cfg.Credentials = sdkaws.AnonymousCredentials{}
} else {
cfg.Credentials = sdkcrd.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
}
cfg.Retryer = c.retryer
cfg.EndpointResolver = sdkaws.EndpointResolverFunc(c.ResolveEndpoint)
cfg.EndpointResolverWithOptions = sdkaws.EndpointResolverWithOptionsFunc(c.ResolveEndpointWithOptions)

View File

@@ -41,8 +41,8 @@ import (
type Model struct {
Region string `mapstructure:"region" json:"region" yaml:"region" toml:"region" validate:"required,hostname"`
Endpoint string `mapstructure:"endpoint" json:"endpoint" yaml:"endpoint" toml:"endpoint" validate:"url"`
AccessKey string `mapstructure:"accesskey" json:"accesskey" yaml:"accesskey" toml:"accesskey" validate:"required,printascii"`
SecretKey string `mapstructure:"secretkey" json:"secretkey" yaml:"secretkey" toml:"secretkey" validate:"required,printascii"`
AccessKey string `mapstructure:"accesskey" json:"accesskey" yaml:"accesskey" toml:"accesskey" validate:"omitempty,printascii"`
SecretKey string `mapstructure:"secretkey" json:"secretkey" yaml:"secretkey" toml:"secretkey" validate:"omitempty,printascii"`
Bucket string `mapstructure:"bucket" json:"bucket" yaml:"bucket" toml:"bucket" validate:"omitempty,hostname"`
}

View File

@@ -27,7 +27,6 @@ package aws
import (
"context"
"net/http"
"net/url"
"sync"
"time"
@@ -43,6 +42,7 @@ import (
awspol "github.com/nabbar/golib/aws/policy"
awsrol "github.com/nabbar/golib/aws/role"
awsusr "github.com/nabbar/golib/aws/user"
libhtc "github.com/nabbar/golib/httpcli"
)
type Config interface {
@@ -67,7 +67,7 @@ type Config interface {
GetResolvedRegion() string
SetRetryer(retryer func() sdkaws.Retryer)
GetConfig(ctx context.Context, cli *http.Client) (*sdkaws.Config, error)
GetConfig(ctx context.Context, cli libhtc.HttpClient) (*sdkaws.Config, error)
JSON() ([]byte, error)
Clone() Config
@@ -84,7 +84,7 @@ type AWS interface {
User() awsusr.User
Config() Config
HTTPCli() *http.Client
HTTPCli() libhtc.HttpClient
Clone(ctx context.Context) (AWS, error)
NewForConfig(ctx context.Context, cfg Config) (AWS, error)
ForcePathStyle(ctx context.Context, enabled bool) error
@@ -100,7 +100,7 @@ type AWS interface {
SetClientIam(aws *sdkiam.Client)
}
func New(ctx context.Context, cfg Config, httpClient *http.Client) (AWS, error) {
func New(ctx context.Context, cfg Config, httpClient libhtc.HttpClient) (AWS, error) {
if cfg == nil {
return nil, awshlp.ErrorConfigEmpty.Error(nil)
}
@@ -120,13 +120,13 @@ func New(ctx context.Context, cfg Config, httpClient *http.Client) (AWS, error)
h: httpClient,
}
if i, e := cli._NewClientIAM(ctx, httpClient); e != nil {
if i, e := cli._NewClientIAM(ctx, httpClient, nil); e != nil {
return nil, e
} else {
cli.i = i
}
if s, e := cli._NewClientS3(ctx, httpClient); e != nil {
if s, e := cli._NewClientS3(ctx, httpClient, nil); e != nil {
return nil, e
} else {
cli.s = s

View File

@@ -42,6 +42,7 @@ import (
awspol "github.com/nabbar/golib/aws/policy"
awsrol "github.com/nabbar/golib/aws/role"
awsusr "github.com/nabbar/golib/aws/user"
libhtc "github.com/nabbar/golib/httpcli"
)
type client struct {
@@ -52,40 +53,57 @@ type client struct {
c Config
i *sdkiam.Client
s *sdksss.Client
h *http.Client
h libhtc.HttpClient
}
func (c *client) SetHTTPTimeout(dur time.Duration) error {
var h *http.Client
c.m.Lock()
defer c.m.Unlock()
var h libhtc.HttpClient
if c.h == nil {
return fmt.Errorf("missing http client")
} else if cli, ok := c.h.(*http.Client); !ok {
return fmt.Errorf("not a standard http client, cannot change timeout")
} else {
h = &http.Client{
Transport: c.h.Transport,
CheckRedirect: c.h.CheckRedirect,
Jar: c.h.Jar,
Transport: cli.Transport,
CheckRedirect: cli.CheckRedirect,
Jar: cli.Jar,
Timeout: dur,
}
}
if cli, err := c._NewClientS3(c.x, h); err != nil {
if cli, err := c._NewClientS3(c.x, h, c.s); err != nil {
return err
} else {
c.s = cli
}
if cli, err := c._NewClientIAM(c.x, h, c.i); err != nil {
return err
} else {
c.i = cli
}
return nil
}
func (c *client) GetHTTPTimeout() time.Duration {
if c.h != nil {
return c.h.Timeout
c.m.Lock()
defer c.m.Unlock()
if c.h == nil {
return 0
} else if cli, ok := c.h.(*http.Client); !ok {
return 0
} else {
return cli.Timeout
}
return 0
}
func (c *client) _NewClientIAM(ctx context.Context, httpClient *http.Client) (*sdkiam.Client, error) {
func (c *client) _NewClientIAM(ctx context.Context, httpClient libhtc.HttpClient, cli *sdkiam.Client) (*sdkiam.Client, error) {
var (
cfg *sdkaws.Config
iam *sdkiam.Client
@@ -112,25 +130,32 @@ func (c *client) _NewClientIAM(ctx context.Context, httpClient *http.Client) (*s
sig = sdksv4.NewSigner()
}
iam = sdkiam.New(sdkiam.Options{
APIOptions: cfg.APIOptions,
Credentials: cfg.Credentials,
EndpointOptions: sdkiam.EndpointResolverOptions{
DisableHTTPS: !c.c.IsHTTPs(),
},
BaseEndpoint: sdkaws.String(c.c.GetEndpoint().String()),
EndpointResolver: c._NewIAMResolver(cfg),
EndpointResolverV2: c._NewIAMResolverV2(c.c),
HTTPSignerV4: sig,
Region: cfg.Region,
Retryer: ret,
HTTPClient: httpClient,
})
if cli == nil {
iam = sdkiam.New(sdkiam.Options{
APIOptions: cfg.APIOptions,
Credentials: cfg.Credentials,
EndpointOptions: sdkiam.EndpointResolverOptions{
DisableHTTPS: !c.c.IsHTTPs(),
},
BaseEndpoint: sdkaws.String(c.c.GetEndpoint().String()),
EndpointResolver: c._NewIAMResolver(cfg),
EndpointResolverV2: c._NewIAMResolverV2(c.c),
HTTPSignerV4: sig,
Region: cfg.Region,
Retryer: ret,
HTTPClient: httpClient,
})
} else {
opt := cli.Options()
opt.HTTPClient = httpClient
opt.HTTPSignerV4 = sig
iam = sdkiam.New(opt)
}
return iam, nil
}
func (c *client) _NewClientS3(ctx context.Context, httpClient *http.Client) (*sdksss.Client, error) {
func (c *client) _NewClientS3(ctx context.Context, httpClient libhtc.HttpClient, cli *sdksss.Client) (*sdksss.Client, error) {
var (
sss *sdksss.Client
err error
@@ -157,21 +182,29 @@ func (c *client) _NewClientS3(ctx context.Context, httpClient *http.Client) (*sd
sig = sdksv4.NewSigner()
}
sss = sdksss.New(sdksss.Options{
APIOptions: cfg.APIOptions,
Credentials: cfg.Credentials,
EndpointOptions: sdksss.EndpointResolverOptions{
DisableHTTPS: !c.c.IsHTTPs(),
},
BaseEndpoint: sdkaws.String(c.c.GetEndpoint().String()),
EndpointResolver: c._NewS3Resolver(cfg),
EndpointResolverV2: c._NewS3ResolverV2(c.c),
HTTPSignerV4: sig,
Region: cfg.Region,
Retryer: ret,
HTTPClient: httpClient,
UsePathStyle: c.p,
})
if cli == nil {
sss = sdksss.New(sdksss.Options{
APIOptions: cfg.APIOptions,
Credentials: cfg.Credentials,
EndpointOptions: sdksss.EndpointResolverOptions{
DisableHTTPS: !c.c.IsHTTPs(),
},
BaseEndpoint: sdkaws.String(c.c.GetEndpoint().String()),
EndpointResolver: c._NewS3Resolver(cfg),
EndpointResolverV2: c._NewS3ResolverV2(c.c),
HTTPSignerV4: sig,
Region: cfg.Region,
Retryer: ret,
HTTPClient: httpClient,
UsePathStyle: c.p,
})
} else {
opt := cli.Options()
opt.HTTPClient = httpClient
opt.HTTPSignerV4 = sig
opt.UsePathStyle = c.p
sss = sdksss.New(opt)
}
return sss, nil
}
@@ -191,13 +224,13 @@ func (c *client) NewForConfig(ctx context.Context, cfg Config) (AWS, error) {
h: c.h,
}
if i, e := n._NewClientIAM(ctx, c.h); e != nil {
if i, e := n._NewClientIAM(ctx, c.h, nil); e != nil {
return nil, e
} else {
n.i = i
}
if s, e := n._NewClientS3(ctx, c.h); e != nil {
if s, e := n._NewClientS3(ctx, c.h, nil); e != nil {
return nil, e
} else {
n.s = s
@@ -225,13 +258,13 @@ func (c *client) Clone(ctx context.Context) (AWS, error) {
h: c.h,
}
if i, e := n._NewClientIAM(ctx, c.h); e != nil {
if i, e := n._NewClientIAM(ctx, c.h, nil); e != nil {
return nil, e
} else {
n.i = i
}
if s, e := n._NewClientS3(ctx, c.h); e != nil {
if s, e := n._NewClientS3(ctx, c.h, nil); e != nil {
return nil, e
} else {
n.s = s
@@ -246,12 +279,18 @@ func (c *client) ForcePathStyle(ctx context.Context, enabled bool) error {
c.p = enabled
if s, e := c._NewClientS3(ctx, nil); e != nil {
if s, e := c._NewClientS3(ctx, nil, c.s); e != nil {
return e
} else {
c.s = s
}
if i, e := c._NewClientIAM(ctx, nil, c.i); e != nil {
return e
} else {
c.i = i
}
return nil
}
@@ -261,13 +300,13 @@ func (c *client) ForceSignerOptions(ctx context.Context, fct ...func(signer *sdk
c.o = fct
if i, e := c._NewClientIAM(ctx, nil); e != nil {
if i, e := c._NewClientIAM(ctx, nil, c.i); e != nil {
return e
} else {
c.i = i
}
if s, e := c._NewClientS3(ctx, nil); e != nil {
if s, e := c._NewClientS3(ctx, nil, c.s); e != nil {
return e
} else {
c.s = s
@@ -283,7 +322,7 @@ func (c *client) Config() Config {
return c.c
}
func (c *client) HTTPCli() *http.Client {
func (c *client) HTTPCli() libhtc.HttpClient {
c.m.Lock()
defer c.m.Unlock()