internal/client/client.go (68 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
// Package client creates AWS service like AWS Signer client required by plugin.
package client
import (
"context"
"fmt"
"github.com/aws/aws-signer-notation-plugin/internal/logger"
"github.com/aws/aws-signer-notation-plugin/internal/version"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/signer"
"github.com/aws/smithy-go/logging"
"github.com/aws/smithy-go/middleware"
"github.com/notaryproject/notation-plugin-framework-go/plugin"
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
)
const (
configKeyAwsProfile = "aws-profile"
configKeyAwsRegion = "aws-region"
configKeySignerEndpoint = "aws-signer-endpoint-url"
)
// NewAWSSigner creates new AWS Signer client from given pluginConfig
func NewAWSSigner(ctx context.Context, pluginConfig map[string]string) (*signer.Client, error) {
log := logger.GetLogger(ctx)
log.Debugln("Initializing Signer Client")
loadOptions := getLoadOptions(ctx, pluginConfig)
// Use default config for aws credentials
defaultConfig, err := config.LoadDefaultConfig(ctx, loadOptions...)
if err != nil {
return nil, plugin.NewGenericError(err.Error())
}
s, err := signer.NewFromConfig(defaultConfig), nil
log.Debugln("Initialized Signer Client")
return s, err
}
func getLoadOptions(ctx context.Context, pluginConfig map[string]string) []func(*config.LoadOptions) error {
log := logger.GetLogger(ctx)
var loadOptions []func(*config.LoadOptions) error
if customEndpoint, ok := pluginConfig[configKeySignerEndpoint]; ok {
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
if service == signer.ServiceID && customEndpoint != "" {
log.Debug("AWS Signer endpoint override: " + customEndpoint)
return aws.Endpoint{
PartitionID: "aws",
URL: customEndpoint,
SigningRegion: region,
}, nil
}
// returning EndpointNotFoundError will allow the service to fall back to its default resolution
return aws.Endpoint{}, &aws.EndpointNotFoundError{}
})
loadOptions = append(loadOptions, config.WithEndpointResolverWithOptions(customResolver))
}
if region, ok := pluginConfig[configKeyAwsRegion]; ok {
loadOptions = append(loadOptions, config.WithRegion(region))
log.Debugf("AWS Signer region override: %s\n", region)
}
if credentialProfile, ok := pluginConfig[configKeyAwsProfile]; ok {
loadOptions = append(loadOptions, config.WithSharedConfigProfile(credentialProfile))
log.Debugf("AWS Signer credential profile: %s\n", credentialProfile)
}
loadOptions = append(loadOptions, config.WithAPIOptions([]func(*middleware.Stack) error{
awsmiddleware.AddUserAgentKeyValue("aws-signer-caller", "NotationPlugin/"+version.GetVersion()),
}))
if log.IsDebug() {
loadOptions = append(loadOptions, config.WithClientLogMode(aws.LogRequestWithBody|aws.LogResponseWithBody))
loadOptions = append(loadOptions, config.WithLogConfigurationWarnings(true))
loadOptions = append(loadOptions, config.WithLogger(logging.LoggerFunc(func(_ logging.Classification, format string, v ...interface{}) {
log.Debugf("AWS call %s\n", fmt.Sprintf(format, v))
})))
}
return loadOptions
}