Skip to content

Commit 9b43a2a

Browse files
authored
feat: Add AWS Config Compliance Details table (#10544)
This adds an `aws_config_config_rule_compliance_details` table, requested by a user in the thread on #7711 (comment). This table allows you to get evaluation results for resources discovered through AWS config rule evaluations, which you can then query together with other CloudQuery resources.
1 parent cabd93f commit 9b43a2a

16 files changed

+130
-16
lines changed

plugins/source/aws/docs/tables/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
- [aws_computeoptimizer_enrollment_statuses](../../../../../website/tables/aws/aws_computeoptimizer_enrollment_statuses.md)
123123
- [aws_computeoptimizer_lambda_function_recommendations](../../../../../website/tables/aws/aws_computeoptimizer_lambda_function_recommendations.md)
124124
- [aws_config_config_rules](../../../../../website/tables/aws/aws_config_config_rules.md)
125+
- [aws_config_config_rule_compliance_details](../../../../../website/tables/aws/aws_config_config_rule_compliance_details.md)
125126
- [aws_config_config_rule_compliances](../../../../../website/tables/aws/aws_config_config_rule_compliances.md)
126127
- [aws_config_remediation_configurations](../../../../../website/tables/aws/aws_config_remediation_configurations.md)
127128
- [aws_config_configuration_aggregators](../../../../../website/tables/aws/aws_config_configuration_aggregators.md)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package config
2+
3+
import (
4+
"context"
5+
6+
"github.com/aws/aws-sdk-go-v2/service/configservice"
7+
"github.com/aws/aws-sdk-go-v2/service/configservice/types"
8+
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
9+
"github.com/cloudquery/plugin-sdk/v2/schema"
10+
"github.com/cloudquery/plugin-sdk/v2/transformers"
11+
)
12+
13+
func configRuleComplianceDetails() *schema.Table {
14+
tableName := "aws_config_config_rule_compliance_details"
15+
return &schema.Table{
16+
Name: tableName,
17+
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_EvaluationResult.html`,
18+
Resolver: fetchConfigConfigRuleComplianceDetails,
19+
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "config"),
20+
// no primary key because all the relevant candidate fields can either be null or are not
21+
// uniquely identifying of a resource. For example, ResourceEvaluationId can be null,
22+
// and so can ResultToken. However, hashing the entire object can work because a combination of
23+
// all fields must be unique.
24+
Transform: transformers.TransformWithStruct(&types.EvaluationResult{}),
25+
Columns: []schema.Column{
26+
client.DefaultAccountIDColumn(false),
27+
client.DefaultRegionColumn(false),
28+
{
29+
Name: "config_rule_name",
30+
Type: schema.TypeString,
31+
Resolver: schema.ParentColumnResolver("config_rule_name"),
32+
},
33+
},
34+
}
35+
}
36+
37+
func fetchConfigConfigRuleComplianceDetails(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
38+
ruleDetail := parent.Item.(types.ConfigRule)
39+
c := meta.(*client.Client)
40+
svc := c.Services().Configservice
41+
42+
input := &configservice.GetComplianceDetailsByConfigRuleInput{
43+
ConfigRuleName: ruleDetail.ConfigRuleName,
44+
Limit: 100,
45+
}
46+
p := configservice.NewGetComplianceDetailsByConfigRulePaginator(svc, input)
47+
for p.HasMorePages() {
48+
response, err := p.NextPage(ctx, func(options *configservice.Options) {
49+
options.Region = c.Region
50+
})
51+
if err != nil {
52+
return err
53+
}
54+
res <- response.EvaluationResults
55+
}
56+
return nil
57+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package config
2+
3+
import (
4+
"testing"
5+
6+
"github.com/aws/aws-sdk-go-v2/service/configservice"
7+
"github.com/aws/aws-sdk-go-v2/service/configservice/types"
8+
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
9+
"github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks"
10+
"github.com/cloudquery/plugin-sdk/v2/faker"
11+
"github.com/golang/mock/gomock"
12+
)
13+
14+
func buildComplianceDetails(t *testing.T, m *mocks.MockConfigserviceClient) client.Services {
15+
l := types.EvaluationResult{}
16+
if err := faker.FakeObject(&l); err != nil {
17+
t.Fatal(err)
18+
}
19+
m.EXPECT().GetComplianceDetailsByConfigRule(gomock.Any(), gomock.Any(), gomock.Any()).Return(
20+
&configservice.GetComplianceDetailsByConfigRuleOutput{
21+
EvaluationResults: []types.EvaluationResult{l},
22+
}, nil)
23+
return client.Services{
24+
Configservice: m,
25+
}
26+
}

plugins/source/aws/resources/services/config/config_rules.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func ConfigRules() *schema.Table {
1414
tableName := "aws_config_config_rules"
1515
return &schema.Table{
1616
Name: tableName,
17-
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeConfigRules.html`,
17+
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigRule.html`,
1818
Resolver: fetchConfigConfigRules,
1919
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "config"),
2020
Transform: transformers.TransformWithStruct(&types.ConfigRule{}),
@@ -33,6 +33,7 @@ func ConfigRules() *schema.Table {
3333

3434
Relations: []*schema.Table{
3535
configRuleCompliances(),
36+
configRuleComplianceDetails(),
3637
remediationConfigurations(),
3738
},
3839
}
@@ -42,8 +43,7 @@ func fetchConfigConfigRules(ctx context.Context, meta schema.ClientMeta, parent
4243
c := meta.(*client.Client)
4344
svc := c.Services().Configservice
4445

45-
input := &configservice.DescribeConfigRulesInput{}
46-
p := configservice.NewDescribeConfigRulesPaginator(svc, input)
46+
p := configservice.NewDescribeConfigRulesPaginator(svc, nil)
4747
for p.HasMorePages() {
4848
response, err := p.NextPage(ctx, func(options *configservice.Options) {
4949
options.Region = c.Region

plugins/source/aws/resources/services/config/config_rules_mock_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func buildConfigRules(t *testing.T, ctrl *gomock.Controller) client.Services {
3030
ComplianceByConfigRules: []types.ComplianceByConfigRule{sl},
3131
}, nil)
3232
buildRemediationConfigurations(t, m)
33+
buildComplianceDetails(t, m)
3334
return client.Services{
3435
Configservice: m,
3536
}

plugins/source/aws/resources/services/config/configuration_aggregators.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func ConfigurationAggregators() *schema.Table {
1414
tableName := "aws_config_configuration_aggregators"
1515
return &schema.Table{
1616
Name: tableName,
17-
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeConfigurationAggregators.html`,
17+
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigurationAggregator.html`,
1818
Resolver: fetchConfigurationAggregators,
1919
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "config"),
2020
Transform: transformers.TransformWithStruct(&types.ConfigurationAggregator{}),
@@ -38,8 +38,7 @@ func fetchConfigurationAggregators(ctx context.Context, meta schema.ClientMeta,
3838
c := meta.(*client.Client)
3939
svc := c.Services().Configservice
4040

41-
input := &configservice.DescribeConfigurationAggregatorsInput{}
42-
p := configservice.NewDescribeConfigurationAggregatorsPaginator(svc, input)
41+
p := configservice.NewDescribeConfigurationAggregatorsPaginator(svc, nil)
4342
for p.HasMorePages() {
4443
response, err := p.NextPage(ctx, func(options *configservice.Options) {
4544
options.Region = c.Region

plugins/source/aws/resources/services/config/delivery_channels.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func DeliveryChannels() *schema.Table {
1414
tableName := "aws_config_delivery_channels"
1515
return &schema.Table{
1616
Name: tableName,
17-
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeDeliveryChannels.html`,
17+
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_DeliveryChannel.html`,
1818
Resolver: fetchDeliveryChannels,
1919
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "config"),
2020
Transform: transformers.TransformWithStruct(&types.DeliveryChannel{}, transformers.WithPrimaryKeys("Name")),

plugins/source/aws/resources/services/config/remediation_configurations.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func remediationConfigurations() *schema.Table {
1414
tableName := "aws_config_remediation_configurations"
1515
return &schema.Table{
1616
Name: tableName,
17-
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeRemediationConfigurations.html`,
17+
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_RemediationConfiguration.html`,
1818
Resolver: fetchRemediationConfigurations,
1919
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "config"),
2020
Transform: transformers.TransformWithStruct(&types.RemediationConfiguration{},

plugins/source/aws/resources/services/config/retention_configurations.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func RetentionConfigurations() *schema.Table {
1414
tableName := "aws_config_retention_configurations"
1515
return &schema.Table{
1616
Name: tableName,
17-
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeRetentionConfigurations.html`,
17+
Description: `https://docs.aws.amazon.com/config/latest/APIReference/API_RetentionConfiguration.html`,
1818
Resolver: fetchRetentionConfigurations,
1919
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "config"),
2020
Transform: transformers.TransformWithStruct(&types.RetentionConfiguration{},
@@ -31,8 +31,7 @@ func fetchRetentionConfigurations(ctx context.Context, meta schema.ClientMeta, p
3131
c := meta.(*client.Client)
3232
svc := c.Services().Configservice
3333

34-
input := &configservice.DescribeRetentionConfigurationsInput{}
35-
p := configservice.NewDescribeRetentionConfigurationsPaginator(svc, input)
34+
p := configservice.NewDescribeRetentionConfigurationsPaginator(svc, nil)
3635
for p.HasMorePages() {
3736
response, err := p.NextPage(ctx, func(options *configservice.Options) {
3837
options.Region = c.Region

website/pages/docs/plugins/sources/aws/tables.md

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)