// Copyright (c) 2025-2026 Probo Inc . // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY // AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THIS SOFTWARE. package awsconfig import ( "context" "fmt" "net/http" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" "go.gearno.de/kit/httpclient" "go.gearno.de/kit/log" ) type ( Options struct { SessionName string Endpoint string Region string AccessKeyID string SecretAccessKey string } ) const ( DefaultRegion = "us-east-2" DefaultSessionName = "go.probo.inc/probo" ) func NewConfig(logger *log.Logger, httpClient *http.Client, opts Options) (aws.Config, error) { if opts.Region == "" { opts.Region = DefaultRegion } logger = logger.Named( "aws.client", log.WithAttributes( log.String("region", opts.Region), log.String("endpoint", opts.Endpoint), log.String("session_name", opts.SessionName), ), ) if httpClient == nil { httpClient = httpclient.DefaultPooledClient(httpclient.WithLogger(logger)) } loadOpts := []func(*config.LoadOptions) error{ config.WithRegion(opts.Region), config.WithHTTPClient(httpClient), } if opts.AccessKeyID != "" && opts.SecretAccessKey != "" { loadOpts = append(loadOpts, config.WithCredentialsProvider( credentials.NewStaticCredentialsProvider( opts.AccessKeyID, opts.SecretAccessKey, opts.SessionName, ), )) } cfg, err := config.LoadDefaultConfig(context.Background(), loadOpts...) if err != nil { return aws.Config{}, fmt.Errorf("cannot load AWS config: %w", err) } if opts.Endpoint != "" { cfg.BaseEndpoint = new(opts.Endpoint) } return cfg, nil }