package main

import (

“fmt”

    “log”

“net/http”

    “io/ioutil”

    “github.com/gorilla/mux”

    “github.com/smartystreets/go-aws-auth”

)

func stopEC2InstanceHandler(w http.ResponseWriter, req *http.Request) {

    vars := mux.Vars(req)

    w.Write([]byte(fmt.Sprintf(“stopEC2InstanceHandler: %v \n\n”, vars[“id”])))

    var Action = “StopInstances” //check aws website

    var Version = “2016-11-15” //need to check api version from aws website

//regoin need to check url from aws website. ex: ap-northeast-2

//some region no support some action

    apiUrl := “https://ec2.ap-northeast-2.amazonaws.com/?Action=" + Action + “&Version=” + Version + “&InstanceId.1=” + vars[“id”]

    client := new(http.Client)

    req, err := http.NewRequest(“GET”, apiUrl, nil)

    aws_secret_access_key := “ooooooxxxxxxx”

    aws_access_key_id := “ooooooxxxxxxx”

    awsauth.Sign(req, awsauth.Credentials{

        AccessKeyID: aws_access_key_id,

        SecretAccessKey: aws_secret_access_key,

        //SecurityToken: “",    // STS (optional)

    })

    //awsauth.Sign(req) // Automatically chooses the best signing mechanism for the service

    resp, err := client.Do(req)

    fmt.Printf("\n\nGet = |%#v|, |%v|\n\n”, resp, err)

    if err != nil {

        fmt.Println(err)

}

    if resp == nil {

        return

    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {

        fmt.Println(err)

    }

    fmt.Println(string(body))

    w.Write([]byte(body))

}

func main() {

    r := mux.NewRouter()

    r.HandleFunc("/stopEC2InstanceHandler/{id}”, stopEC2InstanceHandler).Methods(“GET”)

    fmt.Println(“Endpoint Hit: ./")

log.Fatal(http.ListenAndServe(":8080”, r))

}

======================Then========================

github.com/smartystreets/go-aws-auth HAVE bug for regoin, auto regoin can’t v4

some just change source code

go\src\github.com\smartystreets\go-aws-auth\awsauth.go

func Sign

    signVersion := awsSignVersion[service]

signVersion=4 //add this line in here. let api just use v4

Now ok to use this code.