Skip to content

Commit

Permalink
added opensearch serverless support
Browse files Browse the repository at this point in the history
Signed-off-by: vasyaxparfenov <[email protected]>
  • Loading branch information
vasiliyparfenov authored and vasyaxparfenov committed Oct 9, 2023
1 parent 7633ffa commit a30f48d
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
39 changes: 39 additions & 0 deletions provider/awsv4.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package provider

import (
"bytes"
"crypto/sha256"
"encoding/hex"
"io"
"net/http"
)

var emptyStringSHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

type awsV4SignerWrapper struct {
internal http.RoundTripper
}

func (client *awsV4SignerWrapper) RoundTrip(request *http.Request) (*http.Response, error) {
var hash string
if request.Body == nil {
hash = emptyStringSHA256
} else {
payload, error := io.ReadAll(request.Body)
request.Body = io.NopCloser(bytes.NewReader(payload))
if error != nil {
return nil, error
}
hasher := sha256.New()
hasher.Write(payload)
hashBytes := hasher.Sum(nil)
hash = hex.EncodeToString(hashBytes)
}
request.Header.Set("X-Amz-Content-Sha256", hash)

return client.internal.RoundTrip(request)
}

func Wrap(internal http.RoundTripper) http.RoundTripper {
return &awsV4SignerWrapper{internal: internal}
}
21 changes: 21 additions & 0 deletions provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ const (
)

var awsUrlRegexp = regexp.MustCompile(`([a-z0-9-]+).es.amazonaws.com$`)
var awsOpensearchServerlessUrlRegexp = regexp.MustCompile(`([a-z0-9-]+).aoss.amazonaws.com$`)
var minimalOpensearchServerlessVersion = "2.0.0"

type ProviderConf struct {
rawUrl string
Expand Down Expand Up @@ -305,6 +307,25 @@ func getClient(conf *ProviderConf) (*elastic7.Client, error) {
return nil, err
}
opts = append(opts, elastic7.SetHttpClient(client), elastic7.SetSniff(false))
} else if m := awsOpensearchServerlessUrlRegexp.FindStringSubmatch(conf.parsedUrl.Hostname()); (m != nil || (conf.awsSig4Service == "aoss" && conf.awsRegion != "")) && conf.signAWSRequests {
var region string
if m != nil {
region = m[1]
} else {
region = conf.awsRegion
}
log.Printf("[INFO] Using AWS: %+v", region)
conf.awsSig4Service = "aoss"
client, err := awsHttpClient(region, conf, map[string]string{})
if err != nil {
return nil, err
}
client.Transport = Wrap(client.Transport)
opts = append(opts, elastic7.SetHttpClient(client), elastic7.SetSniff(false))
conf.flavor = OpenSearch
if conf.osVersion == "" {
conf.osVersion = minimalOpensearchServerlessVersion
}
} else if awsRegion := conf.awsRegion; conf.awsRegion != "" && conf.signAWSRequests {
log.Printf("[INFO] Using AWS: %+v", awsRegion)
client, err := awsHttpClient(awsRegion, conf, map[string]string{})
Expand Down

0 comments on commit a30f48d

Please sign in to comment.