diff --git a/command/agent/command.go b/command/agent/command.go index 34b1edd14e..2b0d4effc9 100644 --- a/command/agent/command.go +++ b/command/agent/command.go @@ -20,12 +20,6 @@ import ( "github.com/armon/go-metrics" "github.com/armon/go-metrics/circonus" "github.com/armon/go-metrics/datadog" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/defaults" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/consul/command/base" "github.com/hashicorp/consul/consul/structs" "github.com/hashicorp/consul/lib" @@ -442,67 +436,6 @@ func (c *Command) readConfig() *Config { return config } -// where EC2TagKey = EC2TagValue -func (c *Config) discoverEc2Hosts(logger *log.Logger) ([]string, error) { - config := c.RetryJoinEC2 - - ec2meta := ec2metadata.New(session.New()) - if config.Region == "" { - logger.Printf("[INFO] agent: No EC2 region provided, querying instance metadata endpoint...") - identity, err := ec2meta.GetInstanceIdentityDocument() - if err != nil { - return nil, err - } - config.Region = identity.Region - } - - awsConfig := &aws.Config{ - Region: &config.Region, - Credentials: credentials.NewChainCredentials( - []credentials.Provider{ - &credentials.StaticProvider{ - Value: credentials.Value{ - AccessKeyID: config.AccessKeyID, - SecretAccessKey: config.SecretAccessKey, - }, - }, - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{}, - defaults.RemoteCredProvider(*(defaults.Config()), defaults.Handlers()), - }), - } - - svc := ec2.New(session.New(), awsConfig) - - resp, err := svc.DescribeInstances(&ec2.DescribeInstancesInput{ - Filters: []*ec2.Filter{ - { - Name: aws.String("tag:" + config.TagKey), - Values: []*string{ - aws.String(config.TagValue), - }, - }, - }, - }) - - if err != nil { - return nil, err - } - - var servers []string - for i := range resp.Reservations { - for _, instance := range resp.Reservations[i].Instances { - // Terminated instances don't have the PrivateIpAddress field - if instance.PrivateIpAddress != nil { - servers = append(servers, *instance.PrivateIpAddress) - } - } - } - - return servers, nil -} - -// discoverGCEHosts searches a Google Compute Engine region, returning a list // of instance ips that match the tags given in GCETags. func (c *Config) discoverGCEHosts(logger *log.Logger) ([]string, error) { config := c.RetryJoinGCE diff --git a/command/agent/config_aws.go b/command/agent/config_aws.go new file mode 100644 index 0000000000..4386fd5df3 --- /dev/null +++ b/command/agent/config_aws.go @@ -0,0 +1,73 @@ +package agent + +import ( + "log" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/defaults" + "github.com/aws/aws-sdk-go/aws/ec2metadata" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ec2" +) + +// discoverEc2Hosts searches an AWS region, returning a list of instance ips +// where EC2TagKey = EC2TagValue +func (c *Config) discoverEc2Hosts(logger *log.Logger) ([]string, error) { + config := c.RetryJoinEC2 + + ec2meta := ec2metadata.New(session.New()) + if config.Region == "" { + logger.Printf("[INFO] agent: No EC2 region provided, querying instance metadata endpoint...") + identity, err := ec2meta.GetInstanceIdentityDocument() + if err != nil { + return nil, err + } + config.Region = identity.Region + } + + awsConfig := &aws.Config{ + Region: &config.Region, + Credentials: credentials.NewChainCredentials( + []credentials.Provider{ + &credentials.StaticProvider{ + Value: credentials.Value{ + AccessKeyID: config.AccessKeyID, + SecretAccessKey: config.SecretAccessKey, + }, + }, + &credentials.EnvProvider{}, + &credentials.SharedCredentialsProvider{}, + defaults.RemoteCredProvider(*(defaults.Config()), defaults.Handlers()), + }), + } + + svc := ec2.New(session.New(), awsConfig) + + resp, err := svc.DescribeInstances(&ec2.DescribeInstancesInput{ + Filters: []*ec2.Filter{ + { + Name: aws.String("tag:" + config.TagKey), + Values: []*string{ + aws.String(config.TagValue), + }, + }, + }, + }) + + if err != nil { + return nil, err + } + + var servers []string + for i := range resp.Reservations { + for _, instance := range resp.Reservations[i].Instances { + // Terminated instances don't have the PrivateIpAddress field + if instance.PrivateIpAddress != nil { + servers = append(servers, *instance.PrivateIpAddress) + } + } + } + + return servers, nil +}