aws.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package metadata
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/aws/aws-sdk-go-v2/config"
  6. "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
  7. "io"
  8. "k8s.io/klog/v2"
  9. )
  10. func getAwsMetadata() *CloudMetadata {
  11. ctx, cancel := context.WithTimeout(context.Background(), metadataServiceTimeout)
  12. defer cancel()
  13. cfg, err := config.LoadDefaultConfig(ctx)
  14. if err != nil {
  15. klog.Errorln(err)
  16. return nil
  17. }
  18. c := imds.NewFromConfig(cfg)
  19. md := &CloudMetadata{
  20. Provider: CloudProviderAWS,
  21. InstanceId: getAwsMetadataVariable(ctx, c, "instance-id"),
  22. LifeCycle: getAwsMetadataVariable(ctx, c, "instance-life-cycle"),
  23. InstanceType: getAwsMetadataVariable(ctx, c, "instance-type"),
  24. Region: getAwsMetadataVariable(ctx, c, "placement/region"),
  25. AvailabilityZone: getAwsMetadataVariable(ctx, c, "placement/availability-zone"),
  26. AvailabilityZoneId: getAwsMetadataVariable(ctx, c, "placement/availability-zone-id"),
  27. LocalIPv4: getAwsMetadataVariable(ctx, c, "local-ipv4"),
  28. PublicIPv4: getAwsMetadataVariable(ctx, c, "public-ipv4"),
  29. }
  30. if infoJson := getAwsMetadataVariable(ctx, c, "identity-credentials/ec2/info"); infoJson != "" {
  31. m := map[string]string{}
  32. if err := json.Unmarshal([]byte(infoJson), &m); err != nil {
  33. klog.Errorln(err)
  34. } else {
  35. md.AccountId = m["AccountId"]
  36. }
  37. }
  38. return md
  39. }
  40. func getAwsMetadataVariable(ctx context.Context, client *imds.Client, path string) string {
  41. res, err := client.GetMetadata(ctx, &imds.GetMetadataInput{Path: path})
  42. if err != nil {
  43. klog.Errorln(path, err)
  44. return ""
  45. }
  46. defer res.Content.Close()
  47. payload, err := io.ReadAll(res.Content)
  48. if err != nil {
  49. klog.Errorln(path, err)
  50. return ""
  51. }
  52. return string(payload)
  53. }