Skip to content

Commit 892b339

Browse files
authored
Migrate from AWS SDK for Go v1 to v2 (#191)
* Migrate from AWS SDK for Go v1 to v2 This commit completes the migration from AWS SDK for Go v1 to v2 across the entire codebase, modernizing the AWS integration and improving performance and maintainability. Major changes: - Updated go.mod dependencies from aws-sdk-go v1.55.5 to aws-sdk-go-v2 - Migrated core AWS client infrastructure from session-based to config-based initialization - Updated all service implementations (RDS, VPC, EC2, Route53, ElastiCache, IAM, MSK) - Converted pagination patterns from callback-based to paginator/iterator patterns - Updated error handling from awserr to smithy error patterns - Fixed type system changes (pointer vs direct values, Int64 vs Int32) - Updated all test files to use new SDK v2 types and mock interfaces - Regenerated mock clients to match new interface definitions Technical details: - Session management replaced with aws.Config throughout - Method signatures updated (removed WithContext suffixes) - Import paths changed to aws-sdk-go-v2 namespace - Type references updated to service-specific type packages - Field access patterns fixed for pointer handling changes - All tests now pass with SDK v2 types and patterns - Fixed RDS AllocatedStorage metric integer overflow caused by int32 type change The AllocatedStorage field changed from *int64 to *int32 in SDK v2, causing overflow when calculating storage in bytes. Fixed by casting to int64 before multiplication to prevent negative values like -2.147483648e+09 The application maintains full backward compatibility in terms of functionality while benefiting from improved performance, better context handling, and enhanced type safety provided by SDK v2. 🤖 Generated with Claude Code Assisted-by: Claude <[email protected]> Signed-off-by: Rafa Porres Molina <[email protected]> * Improve pagination patterns to use AWS SDK v2 paginators consistently Updated IAM and Route53 services to use proper AWS SDK v2 paginator patterns through awsclient interface methods for better consistency and performance. Changes: - Added ListRolesAll() method to awsclient interface using iam.NewListRolesPaginator - Added ListHostedZonesAll() method to awsclient interface using route53.NewListHostedZonesPaginator - Updated getIAMRoleCount() to use ListRolesAll() instead of manual pagination - Updated getAllHostedZones() to use ListHostedZonesAll() instead of manual pagination - Regenerated mock clients to include new paginator methods - Updated IAM tests to use new ListRolesAll method expectations - Cleaned up unused imports All existing "All" methods in awsclient already used proper paginators: - DescribeDBLogFilesAll, DescribeDBInstancesAll, DescribePendingMaintenanceActionsAll - DescribeCacheClustersAll, ListClustersAll Now all pagination follows consistent AWS SDK v2 paginator patterns, improving performance and reducing code complexity. 🤖 Generated with Claude Code Assisted-by: Claude <[email protected]> Signed-off-by: Rafa Porres Molina <[email protected]> * Count iam roles without getting all into memory Signed-off-by: Rafa Porres Molina <[email protected]> * Di's refactor * remove unused aws client methods * use count instead of full object when only count needed * use aws account summary api for iam roles metrics * call AwsExporterMetrics.IncrementErrors() in usage side only to avoid double increment Co-authored-by: Di Wang <[email protected]> Signed-off-by: Rafa Porres Molina <[email protected]> --------- Signed-off-by: Rafa Porres Molina <[email protected]>
1 parent 3585c0f commit 892b339

19 files changed

+705
-775
lines changed

go.mod

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,17 @@ go 1.22
44

55
require (
66
github.com/alecthomas/kingpin/v2 v2.4.0
7-
github.com/aws/aws-sdk-go v1.55.5
7+
github.com/aws/aws-sdk-go v1.55.8
8+
github.com/aws/aws-sdk-go-v2 v1.30.3
9+
github.com/aws/aws-sdk-go-v2/config v1.27.24
10+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.173.0
11+
github.com/aws/aws-sdk-go-v2/service/elasticache v1.40.0
12+
github.com/aws/aws-sdk-go-v2/service/iam v1.34.0
13+
github.com/aws/aws-sdk-go-v2/service/kafka v1.35.1
14+
github.com/aws/aws-sdk-go-v2/service/rds v1.82.0
15+
github.com/aws/aws-sdk-go-v2/service/route53 v1.42.0
16+
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.23.0
17+
github.com/aws/aws-sdk-go-v2/service/sts v1.30.1
818
github.com/golang/mock v1.6.0
919
github.com/prometheus/client_golang v1.20.5
1020
github.com/prometheus/client_model v0.6.1
@@ -15,6 +25,16 @@ require (
1525

1626
require (
1727
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
28+
github.com/aws/aws-sdk-go-v2/credentials v1.17.24 // indirect
29+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.9 // indirect
30+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
31+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
32+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect
34+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect
35+
github.com/aws/aws-sdk-go-v2/service/sso v1.22.1 // indirect
36+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.2 // indirect
37+
github.com/aws/smithy-go v1.20.3 // indirect
1838
github.com/beorn7/perks v1.0.1 // indirect
1939
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2040
github.com/davecgh/go-spew v1.1.1 // indirect

go.sum

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,48 @@ github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjH
22
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
33
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
44
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
5-
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
6-
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
5+
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
6+
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
7+
github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
8+
github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
9+
github.com/aws/aws-sdk-go-v2/config v1.27.24 h1:NM9XicZ5o1CBU/MZaHwFtimRpWx9ohAUAqkG6AqSqPo=
10+
github.com/aws/aws-sdk-go-v2/config v1.27.24/go.mod h1:aXzi6QJTuQRVVusAO8/NxpdTeTyr/wRcybdDtfUwJSs=
11+
github.com/aws/aws-sdk-go-v2/credentials v1.17.24 h1:YclAsrnb1/GTQNt2nzv+756Iw4mF8AOzcDfweWwwm/M=
12+
github.com/aws/aws-sdk-go-v2/credentials v1.17.24/go.mod h1:Hld7tmnAkoBQdTMNYZGzztzKRdA4fCdn9L83LOoigac=
13+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.9 h1:Aznqksmd6Rfv2HQN9cpqIV/lQRMaIpJkLLaJ1ZI76no=
14+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.9/go.mod h1:WQr3MY7AxGNxaqAtsDWn+fBxmd4XvLkzeqQ8P1VM0/w=
15+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
16+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
17+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
18+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
19+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
20+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
21+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.173.0 h1:ta62lid9JkIpKZtZZXSj6rP2AqY5x1qYGq53ffxqD9Q=
22+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.173.0/go.mod h1:o6QDjdVKpP5EF0dp/VlvqckzuSDATr1rLdHt3A5m0YY=
23+
github.com/aws/aws-sdk-go-v2/service/elasticache v1.40.0 h1:z1PzTl/8G2mk7D7nfn8ay6BvjDUK5xqbv5C75ycQ/kU=
24+
github.com/aws/aws-sdk-go-v2/service/elasticache v1.40.0/go.mod h1:RHxzPy8YHOOIEFxK5WYIsDA8TEDIBd8A0BenmqV9PKw=
25+
github.com/aws/aws-sdk-go-v2/service/iam v1.34.0 h1:mFKCIAaarygVjgur8XgJgO3tNga4Uvu0AQPzTIemfAg=
26+
github.com/aws/aws-sdk-go-v2/service/iam v1.34.0/go.mod h1:sX/naR5tYtlGFN0Bjg9VPNgYNg/rqiDUuKTW9peFnZk=
27+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
28+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
29+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
30+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
31+
github.com/aws/aws-sdk-go-v2/service/kafka v1.35.1 h1:Q4Jr/gf+7LHjBFTdecQJn4ugVoVszCHzyq1EztrHHkc=
32+
github.com/aws/aws-sdk-go-v2/service/kafka v1.35.1/go.mod h1:7/xNH8gqz3k4p4OyW5+s8ecOp1Xg+vBTPMKpMNjeeik=
33+
github.com/aws/aws-sdk-go-v2/service/rds v1.82.0 h1:+1qRsLNukmvIDNBjz5Osqy4dvIBLwpCeMhmrh9evOUw=
34+
github.com/aws/aws-sdk-go-v2/service/rds v1.82.0/go.mod h1:j27FNXhbbHXC3ExFsJkoxq2Y+4dQypf8KFX1IkgwVvM=
35+
github.com/aws/aws-sdk-go-v2/service/route53 v1.42.0 h1:eTLaQC3n6hjuiLEC/YYL5xV1JNfg+6BfhTjGdkTxoRc=
36+
github.com/aws/aws-sdk-go-v2/service/route53 v1.42.0/go.mod h1:aIGJVylrqjjBnf2NU2O1oHOOoBDFvHw6hy/GhelYksQ=
37+
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.23.0 h1:DOU93d+FhkZM/iWnxy52NEq1rfjycLJHhtG/MwcPQb0=
38+
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.23.0/go.mod h1:PyGv4oTed21K85Eu27j4u/8QyMlMHI0MivoNzziG6fg=
39+
github.com/aws/aws-sdk-go-v2/service/sso v1.22.1 h1:p1GahKIjyMDZtiKoIn0/jAj/TkMzfzndDv5+zi2Mhgc=
40+
github.com/aws/aws-sdk-go-v2/service/sso v1.22.1/go.mod h1:/vWdhoIoYA5hYoPZ6fm7Sv4d8701PiG5VKe8/pPJL60=
41+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.2 h1:ORnrOK0C4WmYV/uYt3koHEWBLYsRDwk2Np+eEoyV4Z0=
42+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.2/go.mod h1:xyFHA4zGxgYkdD73VeezHt3vSKEG9EmFnGwoKlP00u4=
43+
github.com/aws/aws-sdk-go-v2/service/sts v1.30.1 h1:+woJ607dllHJQtsnJLi52ycuqHMwlW+Wqm2Ppsfp4nQ=
44+
github.com/aws/aws-sdk-go-v2/service/sts v1.30.1/go.mod h1:jiNR3JqT15Dm+QWq2SRgh0x0bCNSRP2L25+CqPNpJlQ=
45+
github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
46+
github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
747
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
848
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
949
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=

main.go

Lines changed: 96 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"context"
45
"log/slog"
56
"net/http"
67
"os"
@@ -12,9 +13,9 @@ import (
1213
"github.com/alecthomas/kingpin/v2"
1314
"github.com/app-sre/aws-resource-exporter/pkg"
1415
"github.com/app-sre/aws-resource-exporter/pkg/awsclient"
15-
"github.com/aws/aws-sdk-go/aws"
16-
"github.com/aws/aws-sdk-go/aws/session"
17-
"github.com/aws/aws-sdk-go/service/sts"
16+
"github.com/aws/aws-sdk-go-v2/aws"
17+
"github.com/aws/aws-sdk-go-v2/config"
18+
"github.com/aws/aws-sdk-go-v2/service/sts"
1819
"github.com/prometheus/client_golang/prometheus"
1920
"github.com/prometheus/client_golang/prometheus/promhttp"
2021
"github.com/prometheus/common/promslog"
@@ -36,9 +37,9 @@ func main() {
3637
os.Exit(run())
3738
}
3839

39-
func getAwsAccountNumber(logger *slog.Logger, sess *session.Session) (string, error) {
40-
stsClient := sts.New(sess)
41-
identityOutput, err := stsClient.GetCallerIdentity(&sts.GetCallerIdentityInput{})
40+
func getAwsAccountNumber(logger *slog.Logger, cfg aws.Config) (string, error) {
41+
stsClient := sts.NewFromConfig(cfg)
42+
identityOutput, err := stsClient.GetCallerIdentity(context.Background(), &sts.GetCallerIdentityInput{})
4243
if err != nil {
4344
logger.Error("Could not retrieve caller identity of the aws account", "err", err)
4445
return "", err
@@ -48,103 +49,129 @@ func getAwsAccountNumber(logger *slog.Logger, sess *session.Session) (string, er
4849

4950
func setupCollectors(logger *slog.Logger, configFile string) ([]prometheus.Collector, error) {
5051
var collectors []prometheus.Collector
51-
config, err := pkg.LoadExporterConfiguration(logger, configFile)
52+
exporterConfig, err := pkg.LoadExporterConfiguration(logger, configFile)
5253
if err != nil {
5354
return nil, err
5455
}
55-
logger.Info("Configuring vpc with regions", "regions", strings.Join(config.VpcConfig.Regions, ","))
56-
logger.Info("Configuring rds with regions", "regions", strings.Join(config.RdsConfig.Regions, ","))
57-
logger.Info("Configuring ec2 with regions", "regions", strings.Join(config.EC2Config.Regions, ","))
58-
logger.Info("Configuring route53 with region", "region", config.Route53Config.Region)
59-
logger.Info("Configuring elasticache with regions", "regions", strings.Join(config.ElastiCacheConfig.Regions, ","))
60-
logger.Info("Configuring msk with regions", "regions", strings.Join(config.MskConfig.Regions, ","))
61-
logger.Info("Will VPC metrics be gathered?", "vpc-enabled", config.VpcConfig.Enabled)
62-
logger.Info("Will IAM metrics be gathered?", "iam-enabled", config.IamConfig.Enabled)
63-
56+
logger.Info("Configuring vpc with regions", "regions", strings.Join(exporterConfig.VpcConfig.Regions, ","))
57+
logger.Info("Configuring rds with regions", "regions", strings.Join(exporterConfig.RdsConfig.Regions, ","))
58+
logger.Info("Configuring ec2 with regions", "regions", strings.Join(exporterConfig.EC2Config.Regions, ","))
59+
logger.Info("Configuring route53 with region", "region", exporterConfig.Route53Config.Region)
60+
logger.Info("Configuring elasticache with regions", "regions", strings.Join(exporterConfig.ElastiCacheConfig.Regions, ","))
61+
logger.Info("Configuring msk with regions", "regions", strings.Join(exporterConfig.MskConfig.Regions, ","))
62+
logger.Info("Will VPC metrics be gathered?", "vpc-enabled", exporterConfig.VpcConfig.Enabled)
63+
logger.Info("Will IAM metrics be gathered?", "iam-enabled", exporterConfig.IamConfig.Enabled)
64+
65+
ctx := context.Background()
6466
sessionRegion := "us-east-1"
6567
if sr := os.Getenv("AWS_REGION"); sr != "" {
6668
sessionRegion = sr
6769
}
6870

69-
// Create a single session here, because we need the accountid, before we create the other configs
70-
awsConfig := aws.NewConfig().WithRegion(sessionRegion)
71-
sess := session.Must(session.NewSession(awsConfig))
72-
awsAccountId, err := getAwsAccountNumber(logger, sess)
71+
// Create a single config here, because we need the accountid, before we create the other configs
72+
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(sessionRegion))
73+
if err != nil {
74+
logger.Error("Could not load AWS config", "err", err)
75+
return collectors, err
76+
}
77+
awsAccountId, err := getAwsAccountNumber(logger, cfg)
7378
if err != nil {
7479
return collectors, err
7580
}
76-
var vpcSessions []*session.Session
77-
if config.VpcConfig.Enabled {
78-
for _, region := range config.VpcConfig.Regions {
79-
config := aws.NewConfig().WithRegion(region)
80-
sess := session.Must(session.NewSession(config))
81-
vpcSessions = append(vpcSessions, sess)
81+
var vpcConfigs []aws.Config
82+
if exporterConfig.VpcConfig.Enabled {
83+
for _, region := range exporterConfig.VpcConfig.Regions {
84+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
85+
if err != nil {
86+
logger.Error("Could not load AWS config for VPC", "region", region, "err", err)
87+
return collectors, err
88+
}
89+
vpcConfigs = append(vpcConfigs, regionCfg)
8290
}
83-
vpcExporter := pkg.NewVPCExporter(vpcSessions, logger, config.VpcConfig, awsAccountId)
91+
vpcExporter := pkg.NewVPCExporter(vpcConfigs, logger, exporterConfig.VpcConfig, awsAccountId)
8492
collectors = append(collectors, vpcExporter)
8593
go vpcExporter.CollectLoop()
8694
}
87-
logger.Info("Will RDS metrics be gathered?", "rds-enabled", config.RdsConfig.Enabled)
88-
var rdsSessions []*session.Session
89-
if config.RdsConfig.Enabled {
90-
for _, region := range config.RdsConfig.Regions {
91-
config := aws.NewConfig().WithRegion(region)
92-
sess := session.Must(session.NewSession(config))
93-
rdsSessions = append(rdsSessions, sess)
95+
logger.Info("Will RDS metrics be gathered?", "rds-enabled", exporterConfig.RdsConfig.Enabled)
96+
var rdsConfigs []aws.Config
97+
if exporterConfig.RdsConfig.Enabled {
98+
for _, region := range exporterConfig.RdsConfig.Regions {
99+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
100+
if err != nil {
101+
logger.Error("Could not load AWS config for RDS", "region", region, "err", err)
102+
return collectors, err
103+
}
104+
rdsConfigs = append(rdsConfigs, regionCfg)
94105
}
95-
rdsExporter := pkg.NewRDSExporter(rdsSessions, logger, config.RdsConfig, awsAccountId)
106+
rdsExporter := pkg.NewRDSExporter(rdsConfigs, logger, exporterConfig.RdsConfig, awsAccountId)
96107
collectors = append(collectors, rdsExporter)
97108
go rdsExporter.CollectLoop()
98109
}
99-
logger.Info("Will EC2 metrics be gathered?", "ec2-enabled", config.EC2Config.Enabled)
100-
var ec2Sessions []*session.Session
101-
if config.EC2Config.Enabled {
102-
for _, region := range config.EC2Config.Regions {
103-
config := aws.NewConfig().WithRegion(region)
104-
sess := session.Must(session.NewSession(config))
105-
ec2Sessions = append(ec2Sessions, sess)
110+
logger.Info("Will EC2 metrics be gathered?", "ec2-enabled", exporterConfig.EC2Config.Enabled)
111+
var ec2Configs []aws.Config
112+
if exporterConfig.EC2Config.Enabled {
113+
for _, region := range exporterConfig.EC2Config.Regions {
114+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
115+
if err != nil {
116+
logger.Error("Could not load AWS config for EC2", "region", region, "err", err)
117+
return collectors, err
118+
}
119+
ec2Configs = append(ec2Configs, regionCfg)
106120
}
107-
ec2Exporter := pkg.NewEC2Exporter(ec2Sessions, logger, config.EC2Config, awsAccountId)
121+
ec2Exporter := pkg.NewEC2Exporter(ec2Configs, logger, exporterConfig.EC2Config, awsAccountId)
108122
collectors = append(collectors, ec2Exporter)
109123
go ec2Exporter.CollectLoop()
110124
}
111-
logger.Info("Will Route53 metrics be gathered?", "route53-enabled", config.Route53Config.Enabled)
112-
if config.Route53Config.Enabled {
113-
awsConfig := aws.NewConfig().WithRegion(config.Route53Config.Region)
114-
sess := session.Must(session.NewSession(awsConfig))
115-
r53Exporter := pkg.NewRoute53Exporter(sess, logger, config.Route53Config, awsAccountId)
125+
logger.Info("Will Route53 metrics be gathered?", "route53-enabled", exporterConfig.Route53Config.Enabled)
126+
if exporterConfig.Route53Config.Enabled {
127+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(exporterConfig.Route53Config.Region))
128+
if err != nil {
129+
logger.Error("Could not load AWS config for Route53", "region", exporterConfig.Route53Config.Region, "err", err)
130+
return collectors, err
131+
}
132+
r53Exporter := pkg.NewRoute53Exporter(regionCfg, logger, exporterConfig.Route53Config, awsAccountId)
116133
collectors = append(collectors, r53Exporter)
117134
go r53Exporter.CollectLoop()
118135
}
119-
logger.Info("Will ElastiCache metrics be gathered?", "elasticache-enabled", config.ElastiCacheConfig.Enabled)
120-
var elasticacheSessions []*session.Session
121-
if config.ElastiCacheConfig.Enabled {
122-
for _, region := range config.ElastiCacheConfig.Regions {
123-
config := aws.NewConfig().WithRegion(region)
124-
sess := session.Must(session.NewSession(config))
125-
elasticacheSessions = append(elasticacheSessions, sess)
136+
logger.Info("Will ElastiCache metrics be gathered?", "elasticache-enabled", exporterConfig.ElastiCacheConfig.Enabled)
137+
var elasticacheConfigs []aws.Config
138+
if exporterConfig.ElastiCacheConfig.Enabled {
139+
for _, region := range exporterConfig.ElastiCacheConfig.Regions {
140+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
141+
if err != nil {
142+
logger.Error("Could not load AWS config for ElastiCache", "region", region, "err", err)
143+
return collectors, err
144+
}
145+
elasticacheConfigs = append(elasticacheConfigs, regionCfg)
126146
}
127-
elasticacheExporter := pkg.NewElastiCacheExporter(elasticacheSessions, logger, config.ElastiCacheConfig, awsAccountId)
147+
elasticacheExporter := pkg.NewElastiCacheExporter(elasticacheConfigs, logger, exporterConfig.ElastiCacheConfig, awsAccountId)
128148
collectors = append(collectors, elasticacheExporter)
129149
go elasticacheExporter.CollectLoop()
130150
}
131-
logger.Info("Will MSK metrics be gathered?", "msk-enabled", config.MskConfig.Enabled)
132-
var mskSessions []*session.Session
133-
if config.MskConfig.Enabled {
134-
for _, region := range config.MskConfig.Regions {
135-
config := aws.NewConfig().WithRegion(region)
136-
sess := session.Must(session.NewSession(config))
137-
mskSessions = append(mskSessions, sess)
151+
logger.Info("Will MSK metrics be gathered?", "msk-enabled", exporterConfig.MskConfig.Enabled)
152+
var mskConfigs []aws.Config
153+
if exporterConfig.MskConfig.Enabled {
154+
for _, region := range exporterConfig.MskConfig.Regions {
155+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
156+
if err != nil {
157+
logger.Error("Could not load AWS config for MSK", "region", region, "err", err)
158+
return collectors, err
159+
}
160+
mskConfigs = append(mskConfigs, regionCfg)
138161
}
139-
mskExporter := pkg.NewMSKExporter(mskSessions, logger, config.MskConfig, awsAccountId)
162+
mskExporter := pkg.NewMSKExporter(mskConfigs, logger, exporterConfig.MskConfig, awsAccountId)
140163
collectors = append(collectors, mskExporter)
141164
go mskExporter.CollectLoop()
142165
}
143-
logger.Info("Will IAM metrics be gathered?", "iam-enabled", config.IamConfig.Enabled)
144-
if config.IamConfig.Enabled {
145-
awsConfig := aws.NewConfig().WithRegion(config.IamConfig.Region) // IAM is global, this region just for AWS SDK initialization
146-
sess := session.Must(session.NewSession(awsConfig))
147-
iamExporter := pkg.NewIAMExporter(sess, logger, config.IamConfig, awsAccountId)
166+
logger.Info("Will IAM metrics be gathered?", "iam-enabled", exporterConfig.IamConfig.Enabled)
167+
if exporterConfig.IamConfig.Enabled {
168+
// IAM is global, this region just for AWS SDK initialization
169+
regionCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(exporterConfig.IamConfig.Region))
170+
if err != nil {
171+
logger.Error("Could not load AWS config for IAM", "region", exporterConfig.IamConfig.Region, "err", err)
172+
return collectors, err
173+
}
174+
iamExporter := pkg.NewIAMExporter(regionCfg, logger, exporterConfig.IamConfig, awsAccountId)
148175
collectors = append(collectors, iamExporter)
149176
go iamExporter.CollectLoop()
150177
}

0 commit comments

Comments
 (0)