diff --git a/providers/aws/cloudwatch/alarms.go b/providers/aws/cloudwatch/alarms.go index bddf753d1..e705510f8 100644 --- a/providers/aws/cloudwatch/alarms.go +++ b/providers/aws/cloudwatch/alarms.go @@ -14,16 +14,17 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/cloudwatch" - . "github.com/tailwarden/komiser/models" - . "github.com/tailwarden/komiser/providers" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) const ( AverageHoursPerMonth = 730 ) -func Alarms(ctx context.Context, client ProviderClient) ([]Resource, error) { - resources := make([]Resource, 0) +func Alarms(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + resources := make([]models.Resource, 0) var config cloudwatch.DescribeAlarmsInput // This code temporarily changes the region to "us-east-1" and creates a new Pricing client // then changes the region back to what it was before. @@ -33,6 +34,11 @@ func Alarms(ctx context.Context, client ProviderClient) ([]Resource, error) { pricingClient := pricing.NewFromConfig(*client.AWSClient) client.AWSClient.Region = oldRegion cloudWatchClient := cloudwatch.NewFromConfig(*client.AWSClient) + + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "AmazonCloudWatch") + if err != nil { + log.Warnln("Couldn't fetch AmazonCloudWatch cost and usage:", err) + } for { output, err := cloudWatchClient.DescribeAlarms(ctx, &config) if err != nil { @@ -44,11 +50,11 @@ func Alarms(ctx context.Context, client ProviderClient) ([]Resource, error) { ResourceARN: alarm.AlarmArn, }) - tags := make([]Tag, 0) + tags := make([]models.Tag, 0) if err == nil { for _, tag := range outputTags.Tags { - tags = append(tags, Tag{ + tags = append(tags, models.Tag{ Key: *tag.Key, Value: *tag.Value, }) @@ -82,7 +88,7 @@ func Alarms(ctx context.Context, client ProviderClient) ([]Resource, error) { continue } - resources = append(resources, Resource{ + resources = append(resources, models.Resource{ Provider: "AWS", Account: client.Name, Service: "CloudWatch", @@ -92,7 +98,10 @@ func Alarms(ctx context.Context, client ProviderClient) ([]Resource, error) { Cost: costPerMonth, Tags: tags, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#alarmsV2:alarm/%s", client.AWSClient.Region, client.AWSClient.Region, *alarm.AlarmName), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#alarmsV2:alarm/%s", client.AWSClient.Region, client.AWSClient.Region, *alarm.AlarmName), }) } diff --git a/providers/aws/cloudwatch/log_group.go b/providers/aws/cloudwatch/log_group.go index 4a31ec374..a1e78d202 100644 --- a/providers/aws/cloudwatch/log_group.go +++ b/providers/aws/cloudwatch/log_group.go @@ -9,21 +9,27 @@ import ( "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs" log "github.com/sirupsen/logrus" - . "github.com/tailwarden/komiser/models" - . "github.com/tailwarden/komiser/providers" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) -func LogGroups(ctx context.Context, client ProviderClient) ([]Resource, error) { - resources := make([]Resource, 0) +func LogGroups(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + resources := make([]models.Resource, 0) cloudWatchLogsClient := cloudwatchlogs.NewFromConfig(*client.AWSClient) input := &cloudwatchlogs.DescribeLogGroupsInput{} + + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "AmazonCloudWatch") + if err != nil { + log.Warnln("Couldn't fetch AmazonCloudWatch cost and usage:", err) + } for { output, err := cloudWatchLogsClient.DescribeLogGroups(ctx, input) if err != nil { return resources, err } for _, group := range output.LogGroups { - resources = append(resources, Resource{ + resources = append(resources, models.Resource{ Provider: "AWS", Account: client.Name, Service: "CloudWatch Log Group", @@ -31,7 +37,10 @@ func LogGroups(ctx context.Context, client ProviderClient) ([]Resource, error) { Region: client.AWSClient.Region, Name: aws.ToString(group.LogGroupName), FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#logsV2:log-groups/log-group/%s", client.AWSClient.Region, client.AWSClient.Region, aws.ToString(group.LogGroupName)), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#logsV2:log-groups/log-group/%s", client.AWSClient.Region, client.AWSClient.Region, aws.ToString(group.LogGroupName)), }) } if output.NextToken == nil { diff --git a/providers/aws/cloudwatch/log_metrics.go b/providers/aws/cloudwatch/log_metrics.go index a90304e6f..97a25b8a9 100644 --- a/providers/aws/cloudwatch/log_metrics.go +++ b/providers/aws/cloudwatch/log_metrics.go @@ -18,6 +18,7 @@ import ( "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) func getRate(pricingOutput *pricing.GetProductsOutput) (float64, error) { @@ -86,6 +87,11 @@ func MetricStreams(ctx context.Context, client providers.ProviderClient) ([]mode return resources, err } + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "AmazonCloudWatch") + if err != nil { + log.Warnln("Couldn't fetch AmazonCloudWatch cost and usage:", err) + } + input := &cloudwatch.ListMetricStreamsInput{} for { output, err := cloudWatchMetricsClient.ListMetricStreams(ctx, input) @@ -138,7 +144,10 @@ func MetricStreams(ctx context.Context, client providers.ProviderClient) ([]mode Cost: monthlyCost, Tags: tags, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#metric-streams:streamsList/%s", client.AWSClient.Region, client.AWSClient.Region, aws.ToString(stream.Name)), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/cloudwatch/home?region=%s#metric-streams:streamsList/%s", client.AWSClient.Region, client.AWSClient.Region, aws.ToString(stream.Name)), }) } diff --git a/providers/aws/elb/targetgroups.go b/providers/aws/elb/targetgroups.go index b34fafd84..fd66da882 100644 --- a/providers/aws/elb/targetgroups.go +++ b/providers/aws/elb/targetgroups.go @@ -8,12 +8,13 @@ import ( log "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" - . "github.com/tailwarden/komiser/models" - . "github.com/tailwarden/komiser/providers" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) -func TargetGroups(ctx context.Context, client ProviderClient) ([]Resource, error) { - resources := make([]Resource, 0) +func TargetGroups(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + resources := make([]models.Resource, 0) var config elasticloadbalancingv2.DescribeTargetGroupsInput elbtgClient := elasticloadbalancingv2.NewFromConfig(*client.AWSClient) @@ -24,6 +25,11 @@ func TargetGroups(ctx context.Context, client ProviderClient) ([]Resource, error return resources, err } + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "ELB") + if err != nil { + log.Warnln("Couldn't fetch ELB cost and usage:", err) + } + for _, targetgroup := range output.TargetGroups { resourceArn := *targetgroup.TargetGroupArn outputTags, err := elbtgClient.DescribeTags(ctx, &elasticloadbalancingv2.DescribeTagsInput{ @@ -33,17 +39,17 @@ func TargetGroups(ctx context.Context, client ProviderClient) ([]Resource, error return resources, err } - tags := make([]Tag, 0) + tags := make([]models.Tag, 0) for _, tagDescription := range outputTags.TagDescriptions { for _, tag := range tagDescription.Tags { - tags = append(tags, Tag{ + tags = append(tags, models.Tag{ Key: *tag.Key, Value: *tag.Value, }) } } - resources = append(resources, Resource{ + resources = append(resources, models.Resource{ Provider: "AWS", Account: client.Name, Service: "Target Group", @@ -52,7 +58,10 @@ func TargetGroups(ctx context.Context, client ProviderClient) ([]Resource, error Name: *targetgroup.TargetGroupName, Tags: tags, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#TargetGroup:targetGroupArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#TargetGroup:targetGroupArn=%s", client.AWSClient.Region, client.AWSClient.Region, resourceArn), }) } diff --git a/providers/aws/neptune/clusters.go b/providers/aws/neptune/clusters.go index cd279a05d..6f53bb822 100644 --- a/providers/aws/neptune/clusters.go +++ b/providers/aws/neptune/clusters.go @@ -22,9 +22,10 @@ func Clusters(ctx context.Context, client providers.ProviderClient) ([]models.Re } for _, cluster := range output.DBClusters { - - clusterName := *cluster.DatabaseName - + clusterName := "" + if cluster.DatabaseName != nil { + clusterName = *cluster.DatabaseName + } resources = append(resources, models.Resource{ Provider: "AWS", Account: client.Name, @@ -33,7 +34,7 @@ func Clusters(ctx context.Context, client providers.ProviderClient) ([]models.Re ResourceId: *cluster.DBClusterArn, Name: clusterName, FetchedAt: time.Now(), - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/neptune/home?region=%s#database-details:id=%s;resource-type=cluster;tab=connectivity", client.AWSClient.Region, client.AWSClient.Region, *cluster.DatabaseName), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/neptune/home?region=%s#database-details:id=%s;resource-type=cluster;tab=connectivity", client.AWSClient.Region, client.AWSClient.Region, clusterName), }) } diff --git a/providers/aws/rds/auto_backups.go b/providers/aws/rds/auto_backups.go index 777bec933..cfbae69ef 100644 --- a/providers/aws/rds/auto_backups.go +++ b/providers/aws/rds/auto_backups.go @@ -10,13 +10,17 @@ import ( log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) func AutoBackups(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { var config rds.DescribeDBInstanceAutomatedBackupsInput resources := make([]models.Resource, 0) rdsClient := rds.NewFromConfig(*client.AWSClient) - + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "RDS") + if err != nil { + log.Warnln("Couldn't fetch S3 cost and usage:", err) + } for { output, err := rdsClient.DescribeDBInstanceAutomatedBackups(ctx, &config) if err != nil { @@ -37,6 +41,7 @@ func AutoBackups(ctx context.Context, client providers.ProviderClient) ([]models FetchedAt: time.Now(), Link: fmt.Sprintf("https:/%s.console.aws.amazon.com/rds/home?region=%s#dbinstance:id=%s", client.AWSClient.Region, client.AWSClient.Region, *backup.DBInstanceIdentifier), Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), "Engine": *backup.Engine, "EngineVersion": *backup.EngineVersion, }, diff --git a/providers/aws/rds/cluster_snapshot.go b/providers/aws/rds/cluster_snapshot.go index 0766b4021..2545d400d 100644 --- a/providers/aws/rds/cluster_snapshot.go +++ b/providers/aws/rds/cluster_snapshot.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/rds" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" "github.com/tailwarden/komiser/utils" ) @@ -18,7 +19,10 @@ func ClusterSnapshots(ctx context.Context, client providers.ProviderClient) ([]m var config rds.DescribeDBClusterSnapshotsInput resources := make([]models.Resource, 0) rdsClient := rds.NewFromConfig(*client.AWSClient) - + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "RDS") + if err != nil { + log.Warnln("Couldn't fetch S3 cost and usage:", err) + } for { output, err := rdsClient.DescribeDBClusterSnapshots(ctx, &config) if err != nil { @@ -58,6 +62,7 @@ func ClusterSnapshots(ctx context.Context, client providers.ProviderClient) ([]m Tags: tags, Link: fmt.Sprintf("https:/%s.console.aws.amazon.com/rds/home?region=%s#snapshots-list:id=%s", client.AWSClient.Region, client.AWSClient.Region, *clusterSnapshot.DBClusterSnapshotIdentifier), Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), "Engine": *clusterSnapshot.Engine, "EngineVersion": *clusterSnapshot.EngineVersion, }, diff --git a/providers/aws/rds/clusters.go b/providers/aws/rds/clusters.go index ec3d398e4..17f10df3a 100644 --- a/providers/aws/rds/clusters.go +++ b/providers/aws/rds/clusters.go @@ -9,15 +9,19 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/rds" - . "github.com/tailwarden/komiser/models" - . "github.com/tailwarden/komiser/providers" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) -func Clusters(ctx context.Context, client ProviderClient) ([]Resource, error) { +func Clusters(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { var config rds.DescribeDBClustersInput - resources := make([]Resource, 0) + resources := make([]models.Resource, 0) rdsClient := rds.NewFromConfig(*client.AWSClient) - + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "RDS") + if err != nil { + log.Warnln("Couldn't fetch S3 cost and usage:", err) + } for { output, err := rdsClient.DescribeDBClusters(ctx, &config) if err != nil { @@ -25,9 +29,9 @@ func Clusters(ctx context.Context, client ProviderClient) ([]Resource, error) { } for _, cluster := range output.DBClusters { - tags := make([]Tag, 0) + tags := make([]models.Tag, 0) for _, tag := range cluster.TagList { - tags = append(tags, Tag{ + tags = append(tags, models.Tag{ Key: *tag.Key, Value: *tag.Value, }) @@ -40,7 +44,7 @@ func Clusters(ctx context.Context, client ProviderClient) ([]Resource, error) { _clusterName = *cluster.DatabaseName } - resources = append(resources, Resource{ + resources = append(resources, models.Resource{ Provider: "AWS", Account: client.Name, Service: "RDS", @@ -54,6 +58,7 @@ func Clusters(ctx context.Context, client ProviderClient) ([]Resource, error) { Metadata: map[string]string{ "Engine": *cluster.Engine, "EngineVersion": *cluster.EngineVersion, + "serviceCost": fmt.Sprint(serviceCost), }, }) } diff --git a/providers/aws/rds/db_proxy_endpoints.go b/providers/aws/rds/db_proxy_endpoints.go index de96ca752..f5c2bb86c 100644 --- a/providers/aws/rds/db_proxy_endpoints.go +++ b/providers/aws/rds/db_proxy_endpoints.go @@ -3,12 +3,14 @@ package rds import ( "context" "fmt" + "time" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/rds" log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" - "time" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) func ProxyEndpoints(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { @@ -17,7 +19,10 @@ func ProxyEndpoints(ctx context.Context, client providers.ProviderClient) ([]mod } resources := make([]models.Resource, 0) rdsClient := rds.NewFromConfig(*client.AWSClient) - + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "RDS") + if err != nil { + log.Warnln("Couldn't fetch S3 cost and usage:", err) + } for { output, err := rdsClient.DescribeDBProxyEndpoints(ctx, &config) if err != nil { @@ -67,7 +72,10 @@ func ProxyEndpoints(ctx context.Context, client providers.ProviderClient) ([]mod Name: _endpointName, FetchedAt: time.Now(), Tags: tags, - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/rds/home?region=%s#db-proxy-details:id=%s", client.AWSClient.Region, client.AWSClient.Region, *endpoint.DBProxyEndpointName), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/rds/home?region=%s#db-proxy-details:id=%s", client.AWSClient.Region, client.AWSClient.Region, *endpoint.DBProxyEndpointName), }) } diff --git a/providers/aws/rds/proxies.go b/providers/aws/rds/proxies.go index edd2860c4..8e8b60736 100644 --- a/providers/aws/rds/proxies.go +++ b/providers/aws/rds/proxies.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/rds" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" "github.com/tailwarden/komiser/utils" ) @@ -23,6 +24,10 @@ func Proxies(ctx context.Context, client providers.ProviderClient) ([]models.Res client.AWSClient.Region = "us-east-1" client.AWSClient.Region = oldRegion + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "RDS") + if err != nil { + log.Warnln("Couldn't fetch S3 cost and usage:", err) + } for { output, err := rdsClient.DescribeDBProxies(ctx, &config) if err != nil { @@ -51,7 +56,10 @@ func Proxies(ctx context.Context, client providers.ProviderClient) ([]models.Res Cost: monthlyCost, Name: _ProxyName, FetchedAt: time.Now(), - Link: fmt.Sprintf("https:/%s.console.aws.amazon.com/rds/home?region=%s#proxies:id=%s", client.AWSClient.Region, client.AWSClient.Region, *proxy.DBProxyName), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https:/%s.console.aws.amazon.com/rds/home?region=%s#proxies:id=%s", client.AWSClient.Region, client.AWSClient.Region, *proxy.DBProxyName), }) } diff --git a/providers/aws/rds/snapshots.go b/providers/aws/rds/snapshots.go index 84bfdcfb7..00dc83171 100644 --- a/providers/aws/rds/snapshots.go +++ b/providers/aws/rds/snapshots.go @@ -10,6 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) func Snapshots(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { @@ -17,6 +18,10 @@ func Snapshots(ctx context.Context, client providers.ProviderClient) ([]models.R resources := make([]models.Resource, 0) rdsClient := rds.NewFromConfig(*client.AWSClient) + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "RDS") + if err != nil { + log.Warnln("Couldn't fetch S3 cost and usage:", err) + } for { output, err := rdsClient.DescribeDBSnapshots(ctx, &config) if err != nil { @@ -43,7 +48,10 @@ func Snapshots(ctx context.Context, client providers.ProviderClient) ([]models.R Name: _snapshotName, FetchedAt: time.Now(), Tags: tags, - Link: fmt.Sprintf("https://%s.console.aws.amazon.com/rds/home?region=%s#snapshot:id=%s", client.AWSClient.Region, client.AWSClient.Region, *snapshot.DBSnapshotIdentifier), + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/rds/home?region=%s#snapshot:id=%s", client.AWSClient.Region, client.AWSClient.Region, *snapshot.DBSnapshotIdentifier), }) } diff --git a/providers/aws/secretmanager/secrets.go b/providers/aws/secretmanager/secrets.go new file mode 100644 index 000000000..d33b20093 --- /dev/null +++ b/providers/aws/secretmanager/secrets.go @@ -0,0 +1,48 @@ +package secretmanager + +import ( + "context" + "fmt" + "time" + + "github.com/aws/aws-sdk-go-v2/service/secretsmanager" + log "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" +) + +func Secrets(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { + var config secretsmanager.ListSecretsInput + resources := make([]models.Resource, 0) + neptuneClient := secretsmanager.NewFromConfig(*client.AWSClient) + + output, err := neptuneClient.ListSecrets(ctx, &config) + if err != nil { + return resources, err + } + + for _, secret := range output.SecretList { + secretName := "" + if secret.Name != nil { + secretName = *secret.Name + } + resources = append(resources, models.Resource{ + Provider: "AWS", + Account: client.Name, + Service: "Secret", + Region: client.AWSClient.Region, + ResourceId: *secret.ARN, + Name: secretName, + FetchedAt: time.Now(), + Link: fmt.Sprintf("https://%s.console.aws.amazon.com/secretsmanager/secret?name=%s®ion=%s", client.AWSClient.Region, secretName, client.AWSClient.Region), + }) + } + log.WithFields(log.Fields{ + "provider": "AWS", + "account": client.Name, + "region": client.AWSClient.Region, + "service": "Secret", + "resources": len(resources), + }).Info("Fetched resources") + return resources, nil +} diff --git a/providers/aws/systemsmanager/managedinstances.go b/providers/aws/systemsmanager/managedinstances.go index 4fc665a0c..afae1cfd8 100644 --- a/providers/aws/systemsmanager/managedinstances.go +++ b/providers/aws/systemsmanager/managedinstances.go @@ -9,8 +9,10 @@ import ( "github.com/aws/aws-sdk-go-v2/service/ec2/types" "github.com/aws/aws-sdk-go-v2/service/ssm" "github.com/aws/aws-sdk-go-v2/service/sts" + log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" + awsUtils "github.com/tailwarden/komiser/providers/aws/utils" ) func GetManagedEc2(ctx context.Context, client providers.ProviderClient) ([]models.Resource, error) { @@ -19,6 +21,11 @@ func GetManagedEc2(ctx context.Context, client providers.ProviderClient) ([]mode ssmClient := ssm.NewFromConfig(*client.AWSClient) ec2Client := ec2.NewFromConfig(*client.AWSClient) + serviceCost, err := awsUtils.GetCostAndUsage(ctx, client.AWSClient.Region, "SystemsManager") + if err != nil { + log.Warnln("Couldn't fetch SystemsManager cost and usage:", err) + } + var nexttoken *string for { @@ -68,6 +75,9 @@ func GetManagedEc2(ctx context.Context, client providers.ProviderClient) ([]mode CreatedAt: *instance.LaunchTime, FetchedAt: time.Now(), Tags: tags, + Metadata: map[string]string{ + "serviceCost": fmt.Sprint(serviceCost), + }, Link: fmt.Sprintf("https://%s.console.aws.amazon.com/ec2/home?region=%s#InstanceDetails:instanceId=%s", client.AWSClient.Region, client.AWSClient.Region, *instance.InstanceId), })