func sign(key []byte, value string) []byte {
h := hmac.New(sha256.New, key)
func getSigningKey(key []byte, dateStamp string, regionName, serviceName string) []byte {
kDate := sign(key, dateStamp)
kRegion := sign(kDate, regionName)
kService := sign(kRegion, serviceName)
kSigning := sign(kService, "request")
type SignHeaderInput struct {
iso8601Layout = "20060102T150405Z"
emptySHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
func getSigningHeader(input SignHeaderInput) map[string]string {
contentType := "application/x-www-form-urlencoded"
accept := "application/json"
xdate := t.Format(iso8601Layout)
datestamp := t.Format(yyMMdd)
canonicalHeaders := "content-type:" + contentType + "\\n" + "host:" + input.host + "\\n" + "x-date:" + xdate + "\\n"
signedHeaders := "content-type;host;x-date"
canonicalRequest := input.method + "\\n" + canonicalUri + "\\n" + canonicalQueryString + "\\n" + canonicalHeaders + "\\n" + signedHeaders + "\\n" + emptySHA256
algorithm := "HMAC-SHA256"
credentialScope := datestamp + "/" + input.region + "/" + input.service + "/" + "request"
cr256 := sha256.Sum256([]byte(canonicalRequest))
stringToSign := algorithm + "\\n" + xdate + "\\n" + credentialScope + "\\n" + hex.EncodeToString(cr256[:])
signingKey := getSigningKey([]byte(input.secretKey), datestamp, input.region, input.service)
signature := sign(signingKey, stringToSign)
authorizationHeader := algorithm + " " + "Credential=" + input.accessKey + "/" + credentialScope + ", " + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + hex.EncodeToString(signature)
headers := map[string]string{"Accept": accept, "Content-Type": contentType, "X-Date": xdate, "Authorization": authorizationHeader}
host := "open.volcengineapi.com"
endpoint := "https://open.volcengineapi.com"
region := "{your region ID}"
accessKey := "{your access key}"
secretKey := "{your secret key}"
queryParams := url.Values{"Action": []string{"AssumeRole"},
"RoleSessionName": []string{"{your session name}"},
"RoleTrn": []string{"trn:iam::{your account ID}:role/{your role name}"},
"Version": []string{"2018-01-01"},
header := getSigningHeader(SignHeaderInput{
req, err := http.NewRequest(http.MethodGet, endpoint+"?"+queryParams.Encode(), nil)
for key, value := range header {
req.Header.Set(key, value)
resp, err := http.DefaultClient.Do(req)
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(fmt.Sprintf("status code:%d, body: %s", resp.Status, string(body)))