func (t *GetTemplate) Execute(client *aws.Client) (*GetTemplateResponse, error) {
	v := Values{
		"Action":    "GetTemplate",
		"StackName": t.StackName,
		"Version":   "2010-05-15",
	}

	ep, e := endpoint(client)
	if e != nil {
		return nil, e
	}
	req, e := http.NewRequest("GET", ep+"?"+v.Encode(), nil)
	if e != nil {
		return nil, e
	}
	client.SignAwsRequestV2(req, time.Now())
	rsp, e := httpClient.Do(req)
	if e != nil {
		return nil, e
	}
	defer rsp.Body.Close()

	b, e := ioutil.ReadAll(rsp.Body)
	if e != nil {
		return nil, e
	}
	xmlRsp := &GetTemplateResponse{}
	e = xml.Unmarshal(b, xmlRsp)
	if e != nil {
		e = fmt.Errorf(e.Error() + ": " + string(b) + " status=" + rsp.Status)
	}
	return xmlRsp, e
}
func (p *PutMetricData) Execute(client *aws.Client) error {
	q := p.query()
	theUrl := endpoint(client) + "?" + q
	req, e := http.NewRequest("POST", theUrl, nil)
	if e != nil {
		return e
	}
	now := time.Now()
	client.SignAwsRequestV2(req, now)
	rsp, e := http.DefaultClient.Do(req)
	if e != nil {
		return e
	}
	b, e := ioutil.ReadAll(rsp.Body)
	if e != nil {
		return e
	}
	if rsp.Status[0] != '2' {
		return fmt.Errorf("expected status 2xx, got %s. %s", rsp.Status, string(b))
	}
	return nil
}
func (a *GetSessionToken) Execute(client *aws.Client) (*GetSessionTokenResponse, error) {
	params, err := aws.ParamsForAction(a)
	if err != nil {
		return nil, err
	}
	req, err := http.NewRequest("GET", "https://sts.amazonaws.com/?"+params.Encode(), nil)
	tim := time.Now().UTC()
	client.SignAwsRequestV2(req, tim)
	for k, v := range req.Header {
		log.Printf("%s: %s", k, v)
	}
	rsp, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	defer rsp.Body.Close()
	if rsp.Status[0] != '2' {
		b, _ := ioutil.ReadAll(rsp.Body)
		return nil, fmt.Errorf("expected status 2xx, got %s. %s", rsp.Status, string(b))
	}
	var r *GetSessionTokenResponse
	return r, xml.NewDecoder(rsp.Body).Decode(&r)
}