api_op_GetIAMInfo.go

  1package imds
  2
  3import (
  4	"context"
  5	"encoding/json"
  6	"fmt"
  7	"io"
  8	"strings"
  9	"time"
 10
 11	"github.com/aws/smithy-go"
 12	smithyio "github.com/aws/smithy-go/io"
 13	"github.com/aws/smithy-go/middleware"
 14	smithyhttp "github.com/aws/smithy-go/transport/http"
 15)
 16
 17const getIAMInfoPath = getMetadataPath + "/iam/info"
 18
 19// GetIAMInfo retrieves an identity document describing an
 20// instance. Error is returned if the request fails or is unable to parse
 21// the response.
 22func (c *Client) GetIAMInfo(
 23	ctx context.Context, params *GetIAMInfoInput, optFns ...func(*Options),
 24) (
 25	*GetIAMInfoOutput, error,
 26) {
 27	if params == nil {
 28		params = &GetIAMInfoInput{}
 29	}
 30
 31	result, metadata, err := c.invokeOperation(ctx, "GetIAMInfo", params, optFns,
 32		addGetIAMInfoMiddleware,
 33	)
 34	if err != nil {
 35		return nil, err
 36	}
 37
 38	out := result.(*GetIAMInfoOutput)
 39	out.ResultMetadata = metadata
 40	return out, nil
 41}
 42
 43// GetIAMInfoInput provides the input parameters for GetIAMInfo operation.
 44type GetIAMInfoInput struct{}
 45
 46// GetIAMInfoOutput provides the output parameters for GetIAMInfo operation.
 47type GetIAMInfoOutput struct {
 48	IAMInfo
 49
 50	ResultMetadata middleware.Metadata
 51}
 52
 53func addGetIAMInfoMiddleware(stack *middleware.Stack, options Options) error {
 54	return addAPIRequestMiddleware(stack,
 55		options,
 56		"GetIAMInfo",
 57		buildGetIAMInfoPath,
 58		buildGetIAMInfoOutput,
 59	)
 60}
 61
 62func buildGetIAMInfoPath(params interface{}) (string, error) {
 63	return getIAMInfoPath, nil
 64}
 65
 66func buildGetIAMInfoOutput(resp *smithyhttp.Response) (v interface{}, err error) {
 67	defer func() {
 68		closeErr := resp.Body.Close()
 69		if err == nil {
 70			err = closeErr
 71		} else if closeErr != nil {
 72			err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err)
 73		}
 74	}()
 75
 76	var buff [1024]byte
 77	ringBuffer := smithyio.NewRingBuffer(buff[:])
 78	body := io.TeeReader(resp.Body, ringBuffer)
 79
 80	imdsResult := &GetIAMInfoOutput{}
 81	if err = json.NewDecoder(body).Decode(&imdsResult.IAMInfo); err != nil {
 82		return nil, &smithy.DeserializationError{
 83			Err:      fmt.Errorf("failed to decode instance identity document, %w", err),
 84			Snapshot: ringBuffer.Bytes(),
 85		}
 86	}
 87	// Any code other success is an error
 88	if !strings.EqualFold(imdsResult.Code, "success") {
 89		return nil, fmt.Errorf("failed to get EC2 IMDS IAM info, %s",
 90			imdsResult.Code)
 91	}
 92
 93	return imdsResult, nil
 94}
 95
 96// IAMInfo provides the shape for unmarshaling an IAM info from the metadata
 97// API.
 98type IAMInfo struct {
 99	Code               string
100	LastUpdated        time.Time
101	InstanceProfileArn string
102	InstanceProfileID  string
103}