diff --git a/.changelog/34738.txt b/.changelog/34738.txt new file mode 100644 index 000000000000..f07f93f63137 --- /dev/null +++ b/.changelog/34738.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_ram_principal_association: Fix `reading RAM Resource Share (...) Principal Association (...): couldn't find resource (21 retries)` errors when a high number of principals are associated with a resource share +``` diff --git a/internal/service/ram/find.go b/internal/service/ram/find.go index 11ec170a13f8..5a5124c5d49a 100644 --- a/internal/service/ram/find.go +++ b/internal/service/ram/find.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ram" + "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) @@ -140,15 +141,46 @@ func FindResourceSharePrincipalAssociationByShareARNPrincipal(ctx context.Contex ResourceShareArns: aws.StringSlice([]string{resourceShareARN}), } - output, err := conn.GetResourceShareAssociationsWithContext(ctx, input) + return findResourceShareAssociation(ctx, conn, input) +} + +func findResourceShareAssociation(ctx context.Context, conn *ram.RAM, input *ram.GetResourceShareAssociationsInput) (*ram.ResourceShareAssociation, error) { + output, err := findResourceShareAssociations(ctx, conn, input) if err != nil { return nil, err } - if output == nil || len(output.ResourceShareAssociations) == 0 || output.ResourceShareAssociations[0] == nil { - return nil, nil + return tfresource.AssertSinglePtrResult(output) +} + +func findResourceShareAssociations(ctx context.Context, conn *ram.RAM, input *ram.GetResourceShareAssociationsInput) ([]*ram.ResourceShareAssociation, error) { + var output []*ram.ResourceShareAssociation + + err := conn.GetResourceShareAssociationsPagesWithContext(ctx, input, func(page *ram.GetResourceShareAssociationsOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, v := range page.ResourceShareAssociations { + if v != nil { + output = append(output, v) + } + } + + return !lastPage + }) + + if tfawserr.ErrCodeEquals(err, ram.ErrCodeUnknownResourceException) { + return nil, &retry.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err } - return output.ResourceShareAssociations[0], nil + return output, nil }