├── Readme.md └── main.go /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # sdns-ec2 3 | 4 | EC2 resolver for [SDNS](https://github.com/tj/sdns). 5 | 6 | ## Installation 7 | 8 | Via binary [releases](https://github.com/tj/sdns-ec2/releases) or: 9 | 10 | ``` 11 | $ go get github.com/tj/sdns-ec2 12 | ``` 13 | 14 | ## Example 15 | 16 | Config: 17 | 18 | ``` 19 | bind: ":5000" 20 | upstream: 21 | - 8.8.8.8 22 | - 8.8.4.4 23 | domains: 24 | - name: ec2.local. 25 | command: sdns-ec2 26 | - name: ec2. 27 | command: sdns-ec2 --region us-west-1 --ttl 600 28 | ``` 29 | 30 | dig: 31 | 32 | ``` 33 | $ dig @127.0.0.1 -p 5000 +short site-02.ec2 34 | 10.30.41.228 35 | ``` 36 | 37 | # License 38 | 39 | MIT -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/awslabs/aws-sdk-go/aws/credentials" 4 | import "github.com/awslabs/aws-sdk-go/service/ec2" 5 | import "github.com/awslabs/aws-sdk-go/aws" 6 | import "github.com/tj/docopt" 7 | import "github.com/tj/sdns" 8 | import "strconv" 9 | import "log" 10 | import "os" 11 | 12 | var Version = "0.0.1" 13 | 14 | const Usage = ` 15 | Usage: 16 | sdns-ec2 [--region name] [--ttl n] 17 | sdns-ec2 -h | --help 18 | sdns-ec2 --version 19 | 20 | Options: 21 | --ttl n record ttl [default: 300] 22 | --region name aws region [default: us-west-2] 23 | -h, --help output help information 24 | -v, --version output version 25 | 26 | ` 27 | 28 | func main() { 29 | log := log.New(os.Stderr, "", 0) 30 | 31 | args, err := docopt.Parse(Usage, nil, true, Version, false) 32 | if err != nil { 33 | log.Fatalf("error: %s", err) 34 | } 35 | 36 | question, err := sdns.Read(os.Stdin) 37 | if err != nil { 38 | log.Fatalf("error parsing stdin: %s", err) 39 | } 40 | 41 | ttl, err := strconv.Atoi(args["--ttl"].(string)) 42 | if err != nil { 43 | log.Fatalf("error parsing --ttl: %s", err) 44 | } 45 | 46 | client := ec2.New(&aws.Config{ 47 | Credentials: credentials.NewEnvCredentials(), 48 | Region: args["--region"].(string), 49 | }) 50 | 51 | res, err := client.DescribeInstances(&ec2.DescribeInstancesInput{ 52 | Filters: []*ec2.Filter{ 53 | &ec2.Filter{ 54 | Name: aws.String("tag:Name"), 55 | Values: []*string{ 56 | aws.String(question.Name), 57 | }, 58 | }, 59 | }, 60 | }) 61 | 62 | if err != nil { 63 | log.Fatalf("error: %s", err) 64 | } 65 | 66 | if len(res.Reservations) == 0 { 67 | log.Fatalf("error: failed to find a matching host") 68 | } 69 | 70 | if len(res.Reservations[0].Instances) == 0 { 71 | log.Fatalf("error: failed to find a matching host") 72 | } 73 | 74 | ip := res.Reservations[0].Instances[0].PrivateIPAddress 75 | 76 | answer := sdns.Answers{ 77 | &sdns.Answer{ 78 | Type: "A", 79 | Value: *ip, 80 | TTL: uint32(ttl), 81 | }, 82 | } 83 | 84 | sdns.Write(answer, os.Stdout) 85 | } 86 | --------------------------------------------------------------------------------