func()

in pkg/aws/ec2/api/wrapper.go [443:500]


func (e *ec2Wrapper) getClientUsingAssumedRole(instanceRegion string, roleARN string, qps int, burst int) (*ec2.EC2, error) {
	var providers []credentials.Provider

	userStsSession := session.Must(session.NewSession())
	userStsSession.Config.Region = &instanceRegion
	injectUserAgent(&userStsSession.Handlers)

	// Create a rate limited http client for the
	client, err := utils.NewRateLimitedClient(qps, burst)
	if err != nil {
		return nil, fmt.Errorf("failed to create reate limited client with %d qps and %d burst: %v", qps, burst, err)
	}
	e.log.Info("created rate limited http client", "qps", qps, "burst", burst)

	// Get the regional sts end point
	regionalSTSEndpoint, err := endpoints.DefaultResolver().
		EndpointFor("sts", aws.StringValue(userStsSession.Config.Region), endpoints.STSRegionalEndpointOption)
	if err != nil {
		return nil, fmt.Errorf("failed to get the regional sts endoint for region %s: %v",
			*userStsSession.Config.Region, err)
	}

	roleARN = strings.Trim(roleARN, "\"")
	// Add the regional sts end point
	regionalProvider := &stscreds.AssumeRoleProvider{
		Client: sts.New(userStsSession, aws.NewConfig().WithHTTPClient(client).
			WithEndpoint(regionalSTSEndpoint.URL).WithMaxRetries(MaxRetries)),
		RoleARN:         roleARN,
		Duration:        time.Minute * 60,
		RoleSessionName: AppName,
	}
	providers = append(providers, regionalProvider)

	// Get the global sts end point
	globalSTSEndpoint, err := endpoints.DefaultResolver().
		EndpointFor("sts", aws.StringValue(userStsSession.Config.Region))
	if err != nil {
		return nil, fmt.Errorf("failed to get the global sts endoint for region %s: %v",
			*userStsSession.Config.Region, err)
	}

	// If the regional STS endpoint is different than the global STS endpoint then add the global sts endpoint
	if regionalSTSEndpoint.URL != globalSTSEndpoint.URL {
		globalProvider := &stscreds.AssumeRoleProvider{
			Client: sts.New(userStsSession, aws.NewConfig().WithHTTPClient(client).
				WithEndpoint(regionalSTSEndpoint.URL).WithMaxRetries(MaxRetries)),
			RoleARN:  roleARN,
			Duration: time.Minute * 60,
		}
		providers = append(providers, globalProvider)
	}
	e.log.Info("initialized the regional/global providers", "roleARN", roleARN)

	userStsSession.Config.Credentials = credentials.NewChainCredentials(providers)

	return ec2.New(userStsSession, aws.NewConfig().WithHTTPClient(client)), nil

}