|
package main |
|
|
|
// An example of obtaining the tags for the current EC2 running instance, |
|
// from a Go program running inside the instance, using the official AWS SDK (v1). |
|
|
|
import ( |
|
"errors" |
|
"fmt" |
|
|
|
"github.com/aws/aws-sdk-go/aws" |
|
"github.com/aws/aws-sdk-go/aws/ec2metadata" |
|
"github.com/aws/aws-sdk-go/aws/session" |
|
"github.com/aws/aws-sdk-go/service/ec2" |
|
) |
|
|
|
// Get region and instance of current running instance, via individual metadata calls |
|
func getRegionAndInstance() (string, string, error) { |
|
sess := session.New() |
|
svc := ec2metadata.New(sess) |
|
if !svc.Available() { |
|
return "", "", errors.New("ec2metadata service not available") |
|
} |
|
instance, err := svc.GetMetadata("instance-id") |
|
if err != nil { |
|
return "", "", fmt.Errorf("can't get instance ID: %w", err) |
|
} |
|
region, err := svc.GetMetadata("placement/region") |
|
if err != nil { |
|
return "", "", fmt.Errorf("can't get region: %w", err) |
|
} |
|
return region, instance, nil |
|
} |
|
|
|
// Get region and instance of current running instance, via instance identity Document |
|
func getRegionAndInstance2() (string, string, error) { |
|
sess := session.New() |
|
svc := ec2metadata.New(sess) |
|
if !svc.Available() { |
|
return "", "", errors.New("ec2metadata service not available") |
|
} |
|
idd, err := svc.GetInstanceIdentityDocument() |
|
if err != nil { |
|
return "", "", fmt.Errorf("can't get instance identity document: %w", err) |
|
} |
|
return idd.Region, idd.InstanceID, nil |
|
} |
|
|
|
// Get tags for instance, given region and instance ID |
|
func getTags(region string, instance string) (map[string]string, error) { |
|
sess, err := session.NewSession(&aws.Config{ |
|
Region: aws.String(region), |
|
}, |
|
) |
|
svc := ec2.New(sess) |
|
input := &ec2.DescribeTagsInput{ |
|
Filters: []*ec2.Filter{ |
|
{ |
|
Name: aws.String("resource-type"), |
|
Values: []*string{aws.String("instance")}, |
|
}, |
|
{ |
|
Name: aws.String("resource-id"), |
|
Values: []*string{aws.String(instance)}, |
|
}, |
|
}, |
|
} |
|
tags := make(map[string]string) |
|
result, err := svc.DescribeTags(input) |
|
if err != nil { |
|
return tags, fmt.Errorf("ec2.DescribeTags failed: %w", err) |
|
} |
|
if result.Tags == nil { |
|
return tags, nil |
|
} |
|
for _, t := range result.Tags { |
|
if t != nil { |
|
k := t.Key |
|
v := t.Value |
|
if k != nil && v != nil { |
|
tags[*k] = *v |
|
} |
|
} |
|
} |
|
return tags, nil |
|
} |
|
|
|
func main() { |
|
{ |
|
// Method 1: individual metadata calls |
|
region, instance, err := getRegionAndInstance() |
|
if err != nil { |
|
panic(err) |
|
} |
|
fmt.Printf("region = %s instance = %s (method 1)\n", region, instance) |
|
} |
|
{ |
|
// Method 2: via instance identity document |
|
region, instance, err := getRegionAndInstance2() |
|
if err != nil { |
|
panic(err) |
|
} |
|
fmt.Printf("region = %s instance = %s (method 2)\n", region, instance) |
|
tags, err := getTags(region, instance) |
|
if err != nil { |
|
panic(err) |
|
} |
|
for k, v := range tags { |
|
fmt.Printf("%s = %s\n", k, v) |
|
} |
|
} |
|
} |