03/08/2021, 10:01 PM
Really hacky... in the stack performing the output...
protected readonly ImmutableDictionary<string, object>.Builder OutputBuilder = ImmutableDictionary.CreateBuilder<string, object>();

    OutputBuilder.Add(location, Output.Create(ImmutableDictionary.CreateBuilder<string, object>()
       .Append(new KeyValuePair<string, object>("GatewayUrl", apim.GatewayUrl))
       .Append(new KeyValuePair<string, object>("ResourceGroup", resourceGroup.Name))
       .Append(new KeyValuePair<string, object>("ServiceName", apim.Name))
then to consume it...
public static class OutputExtensions
        public static Output<string> RequireSubDictionaryOutput(this StackReference stackReference, string outputName, string mainKey, string subKey)
            return stackReference.RequireOutput(outputName).Apply<string>(_ => {
                var mainArray = (ImmutableDictionary<string, object>)((ImmutableDictionary<string, object>)_)[mainKey];
                return mainArray[subKey]?.ToString() ?? "";
Then used:
var apimResourceGroup = sharedStack.RequireSubDictionaryOutput("Gateways", location, "ResourceGroup");
                var apimServiceName = sharedStack.RequireSubDictionaryOutput("Gateways", location, "ServiceName");
Like I said... very hacky... The usecase is that the "shared" stack outputs multiple API-Management services, one for each region, then the service stacks need to add themselves to each of the regions. That requires them to know the RG and ServiceName of them.