github.com/bshelton229/agent@v3.5.4+incompatible/agent/aws.go (about)

     1  package agent
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/aws/aws-sdk-go/aws"
     7  	"github.com/aws/aws-sdk-go/aws/ec2metadata"
     8  	"github.com/aws/aws-sdk-go/aws/session"
     9  	"github.com/buildkite/agent/logger"
    10  )
    11  
    12  var awsSess *session.Session
    13  
    14  // The aws sdk relies on being given a region, which is a breaking change for us
    15  // This applies a heuristic that detects where the agent might be based on the env
    16  // but also the local isntance metadata if available
    17  func awsRegion() (string, error) {
    18  	if r := os.Getenv("AWS_REGION"); r != "" {
    19  		return r, nil
    20  	}
    21  
    22  	if r := os.Getenv("AWS_DEFAULT_REGION"); r != "" {
    23  		return r, nil
    24  	}
    25  
    26  	// The metadata service seems to want a session
    27  	sess, err := session.NewSession(&aws.Config{
    28  		Region: aws.String("us-east-1"),
    29  	})
    30  	if err != nil {
    31  		return "", err
    32  	}
    33  
    34  	meta := ec2metadata.New(sess)
    35  	if meta.Available() {
    36  		region, err := meta.Region()
    37  		if err == nil {
    38  			logger.Debug("Detected AWS region %s", region)
    39  		}
    40  		return region, err
    41  	}
    42  
    43  	return "", aws.ErrMissingRegion
    44  }
    45  
    46  func awsSession() (*session.Session, error) {
    47  	region, err := awsRegion()
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	if awsSess == nil {
    53  		awsSess, err = session.NewSession(&aws.Config{
    54  			Region: aws.String(region),
    55  		})
    56  		if err != nil {
    57  			return nil, err
    58  		}
    59  	}
    60  
    61  	return awsSess, nil
    62  }