Skip to content

Commit a715e4f

Browse files
authored
fix(aws): Support syncing AWS SSO Account Assignments for non management accounts (#10881)
#### Summary closes #10844 Rather than just using the management account id as the input for `ListAccountAssignments` we now call `ListAccountsForProvisionedPermissionSet` and use the list of Account Ids returned as the input. This will increase the number of API calls required, but there is no way of parallelizing the requests without implementing https://github.com/cloudquery/plugin-sdk/issues/338
1 parent 0644ead commit a715e4f

File tree

4 files changed

+44
-10
lines changed

4 files changed

+44
-10
lines changed

plugins/source/aws/resources/services/ssoadmin/account_assignments.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package ssoadmin
33
import (
44
"context"
55

6+
"github.com/aws/aws-sdk-go-v2/aws"
67
"github.com/aws/aws-sdk-go-v2/service/ssoadmin"
78
"github.com/aws/aws-sdk-go-v2/service/ssoadmin/types"
89
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
@@ -24,20 +25,36 @@ func accountAssignments() *schema.Table {
2425
func fetchSsoadminAccountAssignments(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
2526
cl := meta.(*client.Client)
2627
svc := cl.Services().Ssoadmin
27-
config := ssoadmin.ListAccountAssignmentsInput{
28-
AccountId: &cl.AccountID,
28+
configListAccountForPPS := ssoadmin.ListAccountsForProvisionedPermissionSetInput{
2929
InstanceArn: parent.Parent.Item.(types.InstanceMetadata).InstanceArn,
3030
PermissionSetArn: parent.Item.(*types.PermissionSet).PermissionSetArn,
3131
}
32-
paginator := ssoadmin.NewListAccountAssignmentsPaginator(svc, &config)
33-
for paginator.HasMorePages() {
34-
page, err := paginator.NextPage(ctx, func(o *ssoadmin.Options) {
32+
33+
paginatorListAccountForPPS := ssoadmin.NewListAccountsForProvisionedPermissionSetPaginator(svc, &configListAccountForPPS)
34+
for paginatorListAccountForPPS.HasMorePages() {
35+
accounts, err := paginatorListAccountForPPS.NextPage(ctx, func(o *ssoadmin.Options) {
3536
o.Region = cl.Region
3637
})
3738
if err != nil {
3839
return err
3940
}
40-
res <- page.AccountAssignments
41+
for _, account := range accounts.AccountIds {
42+
configLAA := ssoadmin.ListAccountAssignmentsInput{
43+
AccountId: aws.String(account),
44+
InstanceArn: parent.Parent.Item.(types.InstanceMetadata).InstanceArn,
45+
PermissionSetArn: parent.Item.(*types.PermissionSet).PermissionSetArn,
46+
}
47+
paginator := ssoadmin.NewListAccountAssignmentsPaginator(svc, &configLAA)
48+
for paginator.HasMorePages() {
49+
page, err := paginator.NextPage(ctx, func(o *ssoadmin.Options) {
50+
o.Region = cl.Region
51+
})
52+
if err != nil {
53+
return err
54+
}
55+
res <- page.AccountAssignments
56+
}
57+
}
4158
}
4259
return nil
4360
}

plugins/source/aws/resources/services/ssoadmin/instances_mock_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ func buildInstances(t *testing.T, ctrl *gomock.Controller) client.Services {
4444
&ssoadmin.DescribePermissionSetOutput{
4545
PermissionSet: &ps,
4646
}, nil)
47-
47+
mSSOAdmin.EXPECT().ListAccountsForProvisionedPermissionSet(gomock.Any(), gomock.Any(), gomock.Any()).Return(
48+
&ssoadmin.ListAccountsForProvisionedPermissionSetOutput{
49+
AccountIds: []string{*as.AccountId},
50+
}, nil)
4851
mSSOAdmin.EXPECT().ListAccountAssignments(gomock.Any(), gomock.Any(), gomock.Any()).Return(
4952
&ssoadmin.ListAccountAssignmentsOutput{
5053
AccountAssignments: []types.AccountAssignment{as},

plugins/source/aws/resources/services/ssoadmin/permission_sets.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,24 @@ import (
1313
func permissionSets() *schema.Table {
1414
tableName := "aws_ssoadmin_permission_sets"
1515
return &schema.Table{
16-
Name: tableName,
17-
Description: `https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_PermissionSet.html`,
16+
Name: tableName,
17+
Description: `https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_PermissionSet.html.
18+
The 'request_account_id' and 'request_region' columns are added to show the account_id and region of where the request was made from.`,
1819
Resolver: fetchSsoadminPermissionSets,
1920
PreResourceResolver: getSsoadminPermissionSet,
2021
Transform: transformers.TransformWithStruct(&types.PermissionSet{}),
2122
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "identitystore"),
2223
Columns: []schema.Column{
24+
{
25+
Name: "request_account_id",
26+
Type: schema.TypeString,
27+
Resolver: client.ResolveAWSAccount,
28+
},
29+
{
30+
Name: "request_region",
31+
Type: schema.TypeString,
32+
Resolver: client.ResolveAWSRegion,
33+
},
2334
{
2435
Name: "inline_policy",
2536
Type: schema.TypeJSON,

website/tables/aws/aws_ssoadmin_permission_sets.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
This table shows data for Ssoadmin Permission Sets.
44

5-
https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_PermissionSet.html
5+
https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_PermissionSet.html.
6+
The 'request_account_id' and 'request_region' columns are added to show the account_id and region of where the request was made from.
67

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

@@ -21,6 +22,8 @@ The following tables depend on aws_ssoadmin_permission_sets:
2122
|_cq_sync_time|Timestamp|
2223
|_cq_id (PK)|UUID|
2324
|_cq_parent_id|UUID|
25+
|request_account_id|String|
26+
|request_region|String|
2427
|inline_policy|JSON|
2528
|created_date|Timestamp|
2629
|description|String|

0 commit comments

Comments
 (0)