0

I am trying to get Amazon's Route53 Recovery Controller to update control states from a .net application and I keep getting an error. I see on the documentation that I need to set the region and cluster endpoint, but I can't figure out how to do it.

Here a sample of the code I am using:

AmazonRoute53RecoveryControlConfigConfig configConfig = new AmazonRoute53RecoveryControlConfigConfig();
            
configConfig.RegionEndpoint = RegionEndpoint.USWest2;

AmazonRoute53RecoveryControlConfigClient configClient = new AmazonRoute53RecoveryControlConfigClient(_awsCredentials, configConfig);

DescribeClusterResponse describeClusterResponse = await configClient.DescribeClusterAsync(new DescribeClusterRequest()
{
    ClusterArn = "arn:aws:route53-recovery-control::Account:cluster/data"
});

foreach (ClusterEndpoint clusterEndpoint in describeClusterResponse.Cluster.ClusterEndpoints)
{
    AmazonRoute53RecoveryClusterConfig clusterConfig = new AmazonRoute53RecoveryClusterConfig();
    clusterConfig.RegionEndpoint = RegionEndpoint.GetBySystemName(clusterEndpoint.Region);

    AmazonRoute53RecoveryClusterClient client = new AmazonRoute53RecoveryClusterClient(_awsCredentials, clusterConfig);
                
    GetRoutingControlStateResponse getRoutingControlStateResponseWest = await client.GetRoutingControlStateAsync(new GetRoutingControlStateRequest()
    {
        RoutingControlArn = "arn:aws:route53-recovery-control::Account:controlpanel/data/routingcontrol/data"
    });

    GetRoutingControlStateResponse getRoutingControlStateResponseEast = await client.GetRoutingControlStateAsync(new GetRoutingControlStateRequest()
    {
        RoutingControlArn = "arn:aws:route53-recovery-control::Account:controlpanel/data/routingcontrol/data"
    });

    UpdateRoutingControlStatesRequest request = new UpdateRoutingControlStatesRequest();
    request.UpdateRoutingControlStateEntries = new List<UpdateRoutingControlStateEntry>()
    {
       new UpdateRoutingControlStateEntry()
       {
           RoutingControlArn = "arn:aws:route53-recovery-control::Account:controlpanel/data/routingcontrol/data",
           RoutingControlState = getRoutingControlStateResponseWest.RoutingControlState == RoutingControlState.On ? RoutingControlState.Off : RoutingControlState.On
       },
       new UpdateRoutingControlStateEntry()
       {
           RoutingControlArn = "arn:aws:route53-recovery-control::Account:controlpanel/data/routingcontrol/data",
           RoutingControlState = getRoutingControlStateResponseEast.RoutingControlState == RoutingControlState.On ? RoutingControlState.Off : RoutingControlState.On
       }
   };

   UpdateRoutingControlStatesResponse response = await client.UpdateRoutingControlStatesAsync(request);

   if (response.HttpStatusCode == HttpStatusCode.OK)
   {
      break;
   }
}

When this code executes I get this error when it tries to get the control state: The requested name is valid, but no data of the requested type was found.

I see in the java example you can set the region and the data plane url endpoint, but I don't see the equivalent in .net.

https://docs.aws.amazon.com/r53recovery/latest/dg/example_route53-recovery-cluster_UpdateRoutingControlState_section.html

This works when I use the cli which I can also set the region and url endpoint.

https://docs.aws.amazon.com/r53recovery/latest/dg/getting-started-cli-routing.control-state.html

What am I doing wrong here?

1 Answers1

0

There is a solution to this question here: https://github.com/aws/aws-sdk-net/issues/1978.

Essentially use the ServiceURL on the configuration object and add a trailing / to the endpoint url.

AmazonRoute53RecoveryClusterConfig clusterRecoveryConfig = new AmazonRoute53RecoveryClusterConfig();
clusterRecoveryConfig.ServiceURL = $"{clusterEndpoint.Endpoint}/";

AmazonRoute53RecoveryClusterClient client = new AmazonRoute53RecoveryClusterClient(_awsCredentials, clusterRecoveryConfig);