Once I mitigate ResourceNotFoundException when trying to add ServiceCatalog LaunchRoleConstraint to the Portfolio.
It turned out, that in the background, CDK is creating PortfolioProductAssociation when portfolio_obj.add_product(product_obj) method is used.
It work fine until you want to add an existing role - then you need to use CfnLaunchRoleConstraint instead of using e.g. portfolio_obj.set_local_launch_role_name().
set_local_launch_role_name() method by default adds proper depends on to association object - pure CfnLaunchRoleConstraint object is not.
So, here we can mitigate ResourceNotFoundException because setting-up launch constraints requires already done association of the product to the portfolio - appropriate depends on reference is required.
To fix it I just use CfnPortfolioProductAssociation instead add_product method, so I was able to create depends on with association...
My question is: is it possible to somehow retrieve such objects, like this association object (generated by add_product() method), into my stack class, to be able to refer to them?
I know that is not a necessary functionality, due to each Cfn* resource - I'm just curious...
(I'm using Python CDK-v2)
Yes, you can retrieve the underlying Cfn* objects that are created by L2 objects, either in the constructor, or through helper functions like
add_product()by using escape hatches:https://docs.aws.amazon.com/cdk/v2/guide/cfn_layer.html#cfn_layer_resource
The trick about this is getting the Id of the resource you want. Sometimes you can just use
node.default_childbut if it's not the default child of the L2/L3 construct then you may neednode.find_child. But that can be tough because in this case the Id is not a static value and would be hard to guess:https://github.com/aws/aws-cdk/blob/74318c7d22bfc00de9e005f68a0a6aaa58c7db39/packages/%40aws-cdk/aws-servicecatalog/lib/private/association-manager.ts#L24
So instead you can look at just iterating over all children until you find the CfnPortfolioProductAssociation class. I'm not a python guy so I'm going to psuedo code it here:
Note: if I got the python code here wrong PLEASE edit this response to fix it.