pkg/ec2wrapper/ec2wrapper.go (69 lines of code) (raw):
// Package ec2wrapper is used to wrap around the ec2 service APIs
package ec2wrapper
import (
"context"
"github.com/aws/amazon-vpc-cni-k8s/pkg/ec2metadatawrapper"
"github.com/aws/amazon-vpc-cni-k8s/pkg/utils/logger"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
ec2metadata "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
"github.com/aws/aws-sdk-go-v2/service/ec2"
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/pkg/errors"
)
const (
resourceID = "resource-id"
resourceKey = "key"
clusterIDTag = "CLUSTER_ID"
)
var log = logger.Get()
// EC2Wrapper is used to wrap around EC2 service APIs to obtain ClusterID from
// the ec2 instance tags
type EC2Wrapper struct {
ec2ServiceClient ec2.DescribeTagsAPIClient
instanceIdentityDocument ec2metadata.InstanceIdentityDocument
}
// NewMetricsClient returns an instance of the EC2 wrapper
func NewMetricsClient() (*EC2Wrapper, error) {
ctx := context.TODO()
ec2MetadataClient, err := ec2metadatawrapper.New(ctx)
if err != nil {
return &EC2Wrapper{}, err
}
instanceIdentityDocumentOutput, err := ec2MetadataClient.GetInstanceIdentityDocument(ctx, &ec2metadata.GetInstanceIdentityDocumentInput{})
if err != nil {
return &EC2Wrapper{}, err
}
awsCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(instanceIdentityDocumentOutput.Region))
if err != nil {
return &EC2Wrapper{}, err
}
ec2ServiceClient := ec2.NewFromConfig(awsCfg)
return &EC2Wrapper{
ec2ServiceClient: ec2ServiceClient,
instanceIdentityDocument: instanceIdentityDocumentOutput.InstanceIdentityDocument,
}, nil
}
// GetClusterTag is used to retrieve a tag from the ec2 instance
func (e *EC2Wrapper) GetClusterTag(tagKey string) (string, error) {
ctx := context.TODO()
input := ec2.DescribeTagsInput{
Filters: []ec2types.Filter{
{
Name: aws.String(resourceID),
Values: []string{
e.instanceIdentityDocument.InstanceID,
},
}, {
Name: aws.String(resourceKey),
Values: []string{
tagKey,
},
},
},
}
log.Infof("Calling DescribeTags with key %s", tagKey)
results, err := e.ec2ServiceClient.DescribeTags(ctx, &input)
if err != nil {
return "", errors.Wrap(err, "GetClusterTag: Unable to obtain EC2 instance tags")
}
if len(results.Tags) < 1 {
return "", errors.Errorf("GetClusterTag: No tag matching key: %s", tagKey)
}
return aws.ToString(results.Tags[0].Value), nil
}