Skip to content

Commit

Permalink
feat(aws): Add Support For Config Rules and Compliance (#4730)
Browse files Browse the repository at this point in the history

#### Summary

<!--
Explain what problem this PR addresses
-->

<!--
  • Loading branch information
bbernays committed Nov 17, 2022
1 parent bdf3867 commit 100f4ba
Show file tree
Hide file tree
Showing 10 changed files with 289 additions and 0 deletions.
20 changes: 20 additions & 0 deletions plugins/source/aws/codegen/recipes/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,26 @@ func ConfigResources() []*Resource {
},
}...),
},
{
SubService: "config_rules",
Struct: new(types.ConfigRule),
SkipFields: []string{"ConfigRuleArn"},
ExtraColumns: append(defaultRegionalColumns,
[]codegen.ColumnDefinition{
{
Name: "arn",
Type: schema.TypeString,
Resolver: `schema.PathResolver("ConfigRuleArn")`,
Options: schema.ColumnCreationOptions{PrimaryKey: true},
},
}...),
Relations: []string{"ConfigRuleCompliances()"},
},
{
SubService: "config_rule_compliances",
Struct: new(types.ComplianceByConfigRule),
ExtraColumns: defaultRegionalColumns,
},
}

// set default values
Expand Down
2 changes: 2 additions & 0 deletions plugins/source/aws/docs/tables/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@
| [aws_config_configuration_recorders](aws_config_configuration_recorders.md) |
| [aws_config_conformance_packs](aws_config_conformance_packs.md) |
|[aws_config_conformance_pack_rule_compliances](aws_config_conformance_pack_rule_compliances.md) |
| [aws_config_config_rules](aws_config_config_rules.md) |
|[aws_config_config_rule_compliances](aws_config_config_rule_compliances.md) |
| [aws_dax_clusters](aws_dax_clusters.md) |
| [aws_directconnect_connections](aws_directconnect_connections.md) |
| [aws_directconnect_gateways](aws_directconnect_gateways.md) |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Table: aws_config_config_rule_compliances



The primary key for this table is **_cq_id**.

## Relations
This table depends on [aws_config_config_rules](aws_config_config_rules.md).

## Columns
| Name | Type |
| ------------- | ------------- |
|_cq_source_name|String|
|_cq_sync_time|Timestamp|
|_cq_id (PK)|UUID|
|_cq_parent_id|UUID|
|account_id|String|
|region|String|
|compliance|JSON|
|config_rule_name|String|
29 changes: 29 additions & 0 deletions plugins/source/aws/docs/tables/aws_config_config_rules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Table: aws_config_config_rules



The primary key for this table is **arn**.

## Relations
The following tables depend on aws_config_config_rules:
- [aws_config_config_rule_compliances](aws_config_config_rule_compliances.md)

## Columns
| Name | Type |
| ------------- | ------------- |
|_cq_source_name|String|
|_cq_sync_time|Timestamp|
|_cq_id|UUID|
|_cq_parent_id|UUID|
|account_id|String|
|region|String|
|arn (PK)|String|
|source|JSON|
|config_rule_id|String|
|config_rule_name|String|
|config_rule_state|String|
|created_by|String|
|description|String|
|input_parameters|String|
|maximum_execution_frequency|String|
|scope|JSON|
1 change: 1 addition & 0 deletions plugins/source/aws/resources/plugin/tables.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package config

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/configservice"
"github.com/aws/aws-sdk-go-v2/service/configservice/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/plugin-sdk/schema"
)

func fetchConfigConfigRuleCompliances(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error {
ruleDetail := parent.Item.(types.ConfigRule)
c := meta.(*client.Client)
svc := c.Services().Configservice

input := &configservice.DescribeComplianceByConfigRuleInput{
ConfigRuleNames: []string{aws.ToString(ruleDetail.ConfigRuleName)},
}
p := configservice.NewDescribeComplianceByConfigRulePaginator(svc, input)
for p.HasMorePages() {
response, err := p.NextPage(ctx)
if err != nil {
return err
}
res <- response.ComplianceByConfigRules
}
return nil
}
85 changes: 85 additions & 0 deletions plugins/source/aws/resources/services/config/config_rules.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions plugins/source/aws/resources/services/config/config_rules_fetch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package config

import (
"context"

"github.com/aws/aws-sdk-go-v2/service/configservice"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/plugin-sdk/schema"
)

func fetchConfigConfigRules(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error {
c := meta.(*client.Client)
svc := c.Services().Configservice

input := &configservice.DescribeConfigRulesInput{}
p := configservice.NewDescribeConfigRulesPaginator(svc, input)
for p.HasMorePages() {
response, err := p.NextPage(ctx)
if err != nil {
return err
}
res <- response.ConfigRules
}
return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package config

import (
"testing"

"github.com/aws/aws-sdk-go-v2/service/configservice"
"github.com/aws/aws-sdk-go-v2/service/configservice/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks"
"github.com/cloudquery/plugin-sdk/faker"
"github.com/golang/mock/gomock"
)

func buildConfigRules(t *testing.T, ctrl *gomock.Controller) client.Services {
m := mocks.NewMockConfigserviceClient(ctrl)
l := types.ConfigRule{}
if err := faker.FakeObject(&l); err != nil {
t.Fatal(err)
}
sl := types.ComplianceByConfigRule{}
if err := faker.FakeObject(&sl); err != nil {
t.Fatal(err)
}
m.EXPECT().DescribeConfigRules(gomock.Any(), gomock.Any(), gomock.Any()).Return(
&configservice.DescribeConfigRulesOutput{
ConfigRules: []types.ConfigRule{l},
}, nil)
m.EXPECT().DescribeComplianceByConfigRule(gomock.Any(), gomock.Any(), gomock.Any()).Return(
&configservice.DescribeComplianceByConfigRuleOutput{
ComplianceByConfigRules: []types.ComplianceByConfigRule{sl},
}, nil)
return client.Services{
Configservice: m,
}
}

func TestConfigRules(t *testing.T) {
client.AwsMockTestHelper(t, ConfigRules(), buildConfigRules, client.TestOptions{})
}

0 comments on commit 100f4ba

Please sign in to comment.