From 3db89e79baf3956d6abef212831ec3087b6b6815 Mon Sep 17 00:00:00 2001 From: crimson <1291463831@qq.com> Date: Thu, 22 Feb 2024 19:48:08 +0800 Subject: [PATCH 1/6] add signv4 region helper --- example/signv4.go | 22 ++++++++++++++++++++++ util/region.go | 21 +++++++++++++++++++++ util/region_test.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 example/signv4.go create mode 100644 util/region.go create mode 100644 util/region_test.go diff --git a/example/signv4.go b/example/signv4.go new file mode 100644 index 00000000..6df15e2b --- /dev/null +++ b/example/signv4.go @@ -0,0 +1,22 @@ +package main + +import ( + sls "github.com/aliyun/aliyun-log-go-sdk" + "github.com/aliyun/aliyun-log-go-sdk/util" +) + +func CreateSignV4Client() { + accessKeyId, accessKeySecret := "", "" // replace with your access key and secret + endpoint := "cn-hangzhou-share.log.aliyuncs.com" // replace with your endpoint + + client := sls.CreateNormalInterfaceV2(endpoint, + sls.NewStaticCredentialsProvider(accessKeyId, accessKeySecret, "")) + region, err := util.ParseRegion(endpoint) // parse region from endpoint + if err != nil { + panic(err) + } + client.SetRegion(region) // region must be set if using signature v4 + client.SetAuthVersion(sls.AuthV4) // set signature v4 + + client.GetProject("example-project") // call client API +} diff --git a/util/region.go b/util/region.go new file mode 100644 index 00000000..22168474 --- /dev/null +++ b/util/region.go @@ -0,0 +1,21 @@ +package util + +import ( + "fmt" + "regexp" + "strings" +) + +const ENDPOINT_REGEX_PATTERN = `^(?:http[s]?:\/\/)?([a-z-0-9]+)\.(?:sls|log).aliyuncs.com$` + +func ParseRegion(endpoint string) (string, error) { + var re = regexp.MustCompile(ENDPOINT_REGEX_PATTERN) + groups := re.FindStringSubmatch(endpoint) + if groups == nil { + return "", fmt.Errorf("invalid endpoint format: %s", endpoint) + } + region := groups[1] + region = strings.TrimSuffix(region, "-intranet") + region = strings.TrimSuffix(region, "-share") + return region, nil +} diff --git a/util/region_test.go b/util/region_test.go new file mode 100644 index 00000000..f9e29f3d --- /dev/null +++ b/util/region_test.go @@ -0,0 +1,36 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseRegion(t *testing.T) { + region, err := ParseRegion("cn-qingdao-acdr-ut-1-intranet.log.aliyuncs.com") + assert.NoError(t, err) + assert.Equal(t, "cn-qingdao-acdr-ut-1", region) + + region, err = ParseRegion("cn-chengdu-acdr-ut-1-intranet.log.aliyuncs.com") + assert.NoError(t, err) + assert.Equal(t, "cn-chengdu-acdr-ut-1", region) + + region, err = ParseRegion("http://cn-hangzhou-share.log.aliyuncs.com") + assert.NoError(t, err) + assert.Equal(t, "cn-hangzhou", region) + + region, err = ParseRegion("https://cn-hangzhou.log.aliyuncs.com") + assert.NoError(t, err) + assert.Equal(t, "cn-hangzhou", region) + + region, err = ParseRegion("ap-southease-1-intranet.log.aliyuncs.com") + assert.NoError(t, err) + assert.Equal(t, "ap-southease-1", region) + + region, err = ParseRegion("cn-shanghai-corp-share.sls.aliyuncs.com") + assert.NoError(t, err) + assert.Equal(t, "cn-shanghai-corp", region) + + _, err = ParseRegion("sls.aliyuncs.com") + assert.Error(t, err) +} From 379e0b8d08b36826df47d34a5554de57ecd86149 Mon Sep 17 00:00:00 2001 From: crimson <1291463831@qq.com> Date: Fri, 23 Feb 2024 10:25:35 +0800 Subject: [PATCH 2/6] fix regex --- util/region.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/region.go b/util/region.go index 22168474..c3fcec49 100644 --- a/util/region.go +++ b/util/region.go @@ -6,7 +6,7 @@ import ( "strings" ) -const ENDPOINT_REGEX_PATTERN = `^(?:http[s]?:\/\/)?([a-z-0-9]+)\.(?:sls|log).aliyuncs.com$` +const ENDPOINT_REGEX_PATTERN = `^(?:http[s]?:\/\/)?([a-z-0-9]+)\.(?:sls|log)\.aliyuncs\.com$` func ParseRegion(endpoint string) (string, error) { var re = regexp.MustCompile(ENDPOINT_REGEX_PATTERN) From b930a801cec1adb086f12f12e68a3fff989f381f Mon Sep 17 00:00:00 2001 From: crimson <1291463831@qq.com> Date: Fri, 23 Feb 2024 17:02:55 +0800 Subject: [PATCH 3/6] refine --- client.go | 11 +++++++++++ client_interface.go | 12 +++++++++--- example/{ => signv4}/signv4.go | 6 +++--- util/region_test.go | 8 ++------ util/token.go | 6 +++--- 5 files changed, 28 insertions(+), 15 deletions(-) rename example/{ => signv4}/signv4.go (72%) diff --git a/client.go b/client.go index 6fdaff93..6ce669d5 100644 --- a/client.go +++ b/client.go @@ -8,8 +8,11 @@ import ( "net/http" "net/url" "strconv" + "strings" "sync" "time" + + "github.com/aliyun/aliyun-log-go-sdk/util" ) // GlobalForceUsingHTTP if GlobalForceUsingHTTP is true, then all request will use HTTP(ignore LogProject's UsingHTTP flag) @@ -400,3 +403,11 @@ func (c *Client) DeleteProject(name string) error { func (c *Client) Close() error { return nil } + +func (c *Client) setSignV4IfInAcdr(endpoint string) { + region, err := util.ParseRegion(endpoint) + if err != nil && strings.Contains(region, "-acdr-ut-") { + c.AuthVersion = AuthV4 + c.Region = region + } +} diff --git a/client_interface.go b/client_interface.go index 3b2a03c4..d74215f5 100644 --- a/client_interface.go +++ b/client_interface.go @@ -3,6 +3,8 @@ package sls import ( "net/http" "time" + + "github.com/aliyun/aliyun-log-go-sdk/util" ) // CreateNormalInterface create a normal client. @@ -14,7 +16,7 @@ import ( // provider := NewStaticCredentailsProvider(accessKeyID, accessKeySecret, securityToken) // client := CreateNormalInterfaceV2(endpoint, provider) func CreateNormalInterface(endpoint, accessKeyID, accessKeySecret, securityToken string) ClientInterface { - return &Client{ + client := &Client{ Endpoint: endpoint, AccessKeyID: accessKeyID, AccessKeySecret: accessKeySecret, @@ -26,6 +28,8 @@ func CreateNormalInterface(endpoint, accessKeyID, accessKeySecret, securityToken securityToken, ), } + client.setSignV4IfInAcdr(endpoint) + return client } // CreateNormalInterfaceV2 create a normal client, with a CredentialsProvider. @@ -35,13 +39,15 @@ func CreateNormalInterface(endpoint, accessKeyID, accessKeySecret, securityToken // // See [credentials_provider.go] for more details. func CreateNormalInterfaceV2(endpoint string, credentialsProvider CredentialsProvider) ClientInterface { - return &Client{ + client := &Client{ Endpoint: endpoint, credentialsProvider: credentialsProvider, } + client.setSignV4IfInAcdr(endpoint) + return client } -type UpdateTokenFunction = func() (accessKeyID, accessKeySecret, securityToken string, expireTime time.Time, err error) +type UpdateTokenFunction = util.UpdateTokenFunction // CreateTokenAutoUpdateClient create a TokenAutoUpdateClient, // this client will auto fetch security token and retry when operation is `Unauthorized` diff --git a/example/signv4.go b/example/signv4/signv4.go similarity index 72% rename from example/signv4.go rename to example/signv4/signv4.go index 6df15e2b..4e495dde 100644 --- a/example/signv4.go +++ b/example/signv4/signv4.go @@ -5,9 +5,9 @@ import ( "github.com/aliyun/aliyun-log-go-sdk/util" ) -func CreateSignV4Client() { - accessKeyId, accessKeySecret := "", "" // replace with your access key and secret - endpoint := "cn-hangzhou-share.log.aliyuncs.com" // replace with your endpoint +func main() { + accessKeyId, accessKeySecret := "", "" // replace with your access key and secret + endpoint := "cn-hangzhou-intranet.log.aliyuncs.com" // replace with your endpoint client := sls.CreateNormalInterfaceV2(endpoint, sls.NewStaticCredentialsProvider(accessKeyId, accessKeySecret, "")) diff --git a/util/region_test.go b/util/region_test.go index f9e29f3d..7ee20be9 100644 --- a/util/region_test.go +++ b/util/region_test.go @@ -7,13 +7,9 @@ import ( ) func TestParseRegion(t *testing.T) { - region, err := ParseRegion("cn-qingdao-acdr-ut-1-intranet.log.aliyuncs.com") + region, err := ParseRegion("xx-test-acdr-ut-1-intranet.log.aliyuncs.com") assert.NoError(t, err) - assert.Equal(t, "cn-qingdao-acdr-ut-1", region) - - region, err = ParseRegion("cn-chengdu-acdr-ut-1-intranet.log.aliyuncs.com") - assert.NoError(t, err) - assert.Equal(t, "cn-chengdu-acdr-ut-1", region) + assert.Equal(t, "xx-test-acdr-ut-1", region) region, err = ParseRegion("http://cn-hangzhou-share.log.aliyuncs.com") assert.NoError(t, err) diff --git a/util/token.go b/util/token.go index 9ed87769..40329de2 100644 --- a/util/token.go +++ b/util/token.go @@ -11,8 +11,6 @@ import ( "os" "strings" "time" - - sls "github.com/aliyun/aliyun-log-go-sdk" ) const ( @@ -20,6 +18,8 @@ const ( expirationTimeFormat = "2006-01-02T15:04:05Z" ) +type UpdateTokenFunction = func() (accessKeyID, accessKeySecret, securityToken string, expireTime time.Time, err error) + var errNoFile = errors.New("no secret file") // AKInfo ... @@ -183,7 +183,7 @@ func updateTokenFunction(configFilePath string) (accessKeyID, accessKeySecret, s } // NewTokenUpdateFunc create a token update function for ACK or ECS -func NewTokenUpdateFunc(role string, configFilePath string) (tokenUpdateFunc sls.UpdateTokenFunction, shutdown chan struct{}) { +func NewTokenUpdateFunc(role string, configFilePath string) (tokenUpdateFunc UpdateTokenFunction, shutdown chan struct{}) { return func() (accessKeyID string, accessKeySecret string, securityToken string, expireTime time.Time, err error) { return updateTokenFunction(configFilePath) }, make(chan struct{}) From 18143f8f6e0e5eb0df278ec8ec04b71d13fe50a0 Mon Sep 17 00:00:00 2001 From: crimson <1291463831@qq.com> Date: Fri, 23 Feb 2024 17:12:53 +0800 Subject: [PATCH 4/6] add test --- client.go | 2 +- client_test.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/client.go b/client.go index 6ce669d5..63917d5d 100644 --- a/client.go +++ b/client.go @@ -406,7 +406,7 @@ func (c *Client) Close() error { func (c *Client) setSignV4IfInAcdr(endpoint string) { region, err := util.ParseRegion(endpoint) - if err != nil && strings.Contains(region, "-acdr-ut-") { + if err == nil && strings.Contains(region, "-acdr-ut-") { c.AuthVersion = AuthV4 c.Region = region } diff --git a/client_test.go b/client_test.go index bc0aa2b3..80f906fe 100644 --- a/client_test.go +++ b/client_test.go @@ -107,3 +107,20 @@ func (s *ClientTestSuite) TestMeteringMode() { s.Require().NoError(err) s.Require().Equal(CHARGE_BY_FUNCTION, res.MeteringMode) } + +func (s *ClientTestSuite) TestSignv4Acdr() { + { + client := CreateNormalInterface("https://xx-test-acdr-ut-1-intranet.log.aliyuncs.com", "", "", "") + c := client.(*Client) + s.Equal(c.Region, "xx-test-acdr-ut-1") + s.Equal(c.AuthVersion, AuthV4) + } + + { + client := CreateNormalInterface("https://cn-hangzhou-intranet.log.aliyuncs.com", "", "", "") + c := client.(*Client) + s.Equal(c.Region, "") + s.EqualValues(c.AuthVersion, "") + } + +} From 0946ef5a2cfac07b7f6a5528756dabcf1553d1ff Mon Sep 17 00:00:00 2001 From: crimson <1291463831@qq.com> Date: Fri, 23 Feb 2024 17:42:51 +0800 Subject: [PATCH 5/6] refine region parser --- util/region.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/util/region.go b/util/region.go index c3fcec49..ab61cf8e 100644 --- a/util/region.go +++ b/util/region.go @@ -8,6 +8,8 @@ import ( const ENDPOINT_REGEX_PATTERN = `^(?:http[s]?:\/\/)?([a-z-0-9]+)\.(?:sls|log)\.aliyuncs\.com$` +var regionSuffixs = []string{"-intranet", "-share", "-vpc"} + func ParseRegion(endpoint string) (string, error) { var re = regexp.MustCompile(ENDPOINT_REGEX_PATTERN) groups := re.FindStringSubmatch(endpoint) @@ -15,7 +17,10 @@ func ParseRegion(endpoint string) (string, error) { return "", fmt.Errorf("invalid endpoint format: %s", endpoint) } region := groups[1] - region = strings.TrimSuffix(region, "-intranet") - region = strings.TrimSuffix(region, "-share") + for _, suffix := range regionSuffixs { + if strings.HasSuffix(region, suffix) { + return region[:len(region)-len(suffix)], nil + } + } return region, nil } From b431e4f195e1a3d3d62c8e80fd928c4390334c63 Mon Sep 17 00:00:00 2001 From: crimson <1291463831@qq.com> Date: Fri, 23 Feb 2024 17:56:55 +0800 Subject: [PATCH 6/6] rm share --- util/region_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/region_test.go b/util/region_test.go index 7ee20be9..3521f112 100644 --- a/util/region_test.go +++ b/util/region_test.go @@ -11,7 +11,7 @@ func TestParseRegion(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "xx-test-acdr-ut-1", region) - region, err = ParseRegion("http://cn-hangzhou-share.log.aliyuncs.com") + region, err = ParseRegion("http://cn-hangzhou-intranet.log.aliyuncs.com") assert.NoError(t, err) assert.Equal(t, "cn-hangzhou", region) @@ -23,7 +23,7 @@ func TestParseRegion(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "ap-southease-1", region) - region, err = ParseRegion("cn-shanghai-corp-share.sls.aliyuncs.com") + region, err = ParseRegion("cn-shanghai-corp.sls.aliyuncs.com") assert.NoError(t, err) assert.Equal(t, "cn-shanghai-corp", region)