Skip to content

Commit 02bcef7

Browse files
authored
✨ feat: support config provider support aws appconfig (#123)
1 parent c88d6a1 commit 02bcef7

File tree

13 files changed

+145
-40
lines changed

13 files changed

+145
-40
lines changed

go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ go 1.22.0
55
toolchain go1.22.2
66

77
require (
8-
github.com/aws/aws-sdk-go-v2 v1.26.1
8+
github.com/aws/aws-sdk-go-v2 v1.30.3
99
github.com/aws/aws-sdk-go-v2/config v1.27.11
1010
github.com/aws/aws-sdk-go-v2/credentials v1.17.11
11+
github.com/aws/aws-sdk-go-v2/service/appconfigdata v1.16.3
1112
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1
1213
github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1
1314
github.com/casbin/casbin/v2 v2.87.1
@@ -187,8 +188,8 @@ require (
187188
require (
188189
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
189190
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect
190-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect
191-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect
191+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
192+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
192193
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
193194
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect
194195
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect

go.sum

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI
104104
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
105105
github.com/aws/aws-sdk-go v1.50.32 h1:POt81DvegnpQKM4DMDLlHz1CO6OBnEoQ1gRhYFd7QRY=
106106
github.com/aws/aws-sdk-go v1.50.32/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
107-
github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA=
108-
github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
107+
github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
108+
github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
109109
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to=
110110
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg=
111111
github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA=
@@ -114,14 +114,16 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHH
114114
github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo=
115115
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4=
116116
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg=
117-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg=
118-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I=
119-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0=
120-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc=
117+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
118+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
119+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
120+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
121121
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
122122
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
123123
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU=
124124
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0=
125+
github.com/aws/aws-sdk-go-v2/service/appconfigdata v1.16.3 h1:a8T5x683phwsf2Us9G63hqepjlTyKAO5KteNuMlNO2I=
126+
github.com/aws/aws-sdk-go-v2/service/appconfigdata v1.16.3/go.mod h1:h22STrNFoH0uMiKwxw3VXy1Tu7kgXLHcdjhOewAvD1Y=
125127
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 h1:dZXY07Dm59TxAjJcUfNMJHLDI/gLMxTRZefn2jFAVsw=
126128
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1/go.mod h1:lVLqEtX+ezgtfalyJs7Peb0uv9dEpAQP5yuq2O26R44=
127129
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs=

pkg/config/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/mss-boot-io/mss-boot/pkg"
2323
"github.com/mss-boot-io/mss-boot/pkg/config/source"
24+
"github.com/mss-boot-io/mss-boot/pkg/config/source/appconfig"
2425
"github.com/mss-boot-io/mss-boot/pkg/config/source/configmap"
2526
sourceConsul "github.com/mss-boot-io/mss-boot/pkg/config/source/consul"
2627
sourceFS "github.com/mss-boot-io/mss-boot/pkg/config/source/fs"
@@ -64,6 +65,8 @@ func Init(cfg source.Entity, options ...source.Option) (err error) {
6465
f, err = configmap.New(options...)
6566
case source.Consul:
6667
f, err = sourceConsul.New(options...)
68+
case source.APPConfig:
69+
f, err = appconfig.New(options...)
6770
default:
6871
f, err = sourceLocal.New(options...)
6972
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package appconfig
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"io/fs"
8+
"strings"
9+
"time"
10+
11+
"github.com/aws/aws-sdk-go-v2/aws"
12+
awsConfig "github.com/aws/aws-sdk-go-v2/config"
13+
"github.com/aws/aws-sdk-go-v2/service/appconfigdata"
14+
15+
"github.com/mss-boot-io/mss-boot/pkg/config/source"
16+
)
17+
18+
/*
19+
* @Author: lwnmengjing<lwnmengjing@qq.com>
20+
* @Date: 2024/7/18 19:23:30
21+
* @Last Modified by: lwnmengjing<lwnmengjing@qq.com>
22+
* @Last Modified time: 2024/7/18 19:23:30
23+
*/
24+
25+
type Source struct {
26+
opt *source.Options
27+
}
28+
29+
func (s *Source) Open(string) (fs.File, error) {
30+
return nil, errors.New("method Get not implemented")
31+
}
32+
33+
func (s *Source) ReadFile(name string) ([]byte, error) {
34+
ctx, cancel := context.WithTimeout(context.TODO(), s.opt.Timeout)
35+
defer cancel()
36+
for i := range source.Extends {
37+
sessionOutput, err := s.opt.APPConfigDataClient.
38+
StartConfigurationSession(ctx, &appconfigdata.StartConfigurationSessionInput{
39+
ApplicationIdentifier: aws.String(s.opt.ProjectName),
40+
EnvironmentIdentifier: aws.String(s.opt.Namespace),
41+
ConfigurationProfileIdentifier: aws.String(fmt.Sprintf("%s.%s", name, source.Extends[i])),
42+
})
43+
if err != nil {
44+
if strings.Contains(err.Error(), "ConfigurationProfile not found") {
45+
continue
46+
}
47+
return nil, err
48+
}
49+
output, err := s.opt.APPConfigDataClient.
50+
GetLatestConfiguration(ctx, &appconfigdata.GetLatestConfigurationInput{
51+
ConfigurationToken: sessionOutput.InitialConfigurationToken,
52+
})
53+
if err != nil {
54+
return nil, err
55+
}
56+
s.opt.Extend = source.Extends[i]
57+
return output.Configuration, nil
58+
}
59+
return nil, nil
60+
}
61+
62+
func (s *Source) Watch(_ source.Entity, _ func([]byte, any) error) error {
63+
return nil
64+
}
65+
66+
// GetExtend get extend
67+
func (s *Source) GetExtend() source.Scheme {
68+
return s.opt.Extend
69+
}
70+
71+
func New(options ...source.Option) (*Source, error) {
72+
s := &Source{
73+
opt: source.DefaultOptions(),
74+
}
75+
for _, opt := range options {
76+
opt(s.opt)
77+
}
78+
if s.opt.Timeout == 0 {
79+
s.opt.Timeout = 5 * time.Second
80+
}
81+
if s.opt.ProjectName == "" {
82+
return nil, errors.New("project name is required")
83+
}
84+
if s.opt.Namespace == "" {
85+
return nil, errors.New("namespace is required")
86+
}
87+
ctx, cancel := context.WithTimeout(context.TODO(), s.opt.Timeout)
88+
defer cancel()
89+
cfg, err := awsConfig.LoadDefaultConfig(ctx)
90+
if err != nil {
91+
return nil, err
92+
}
93+
s.opt.APPConfigDataClient = appconfigdata.NewFromConfig(cfg)
94+
return s, nil
95+
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)