Repository: cdklabs/cdk-monitoring-constructs (language: python)

Issue:
Elasticache Cluster URLs Don't Appear to Be Correct
### Version

7.10.1

### Steps and/or minimal code example to reproduce

Create some elasticache monitoring instances or just do the following:
```typescript
import { Stack } from "aws-cdk-lib";
import {
  AwsConsoleUrlFactory,
  ElastiCacheClusterType,
} from "cdk-monitoring-constructs";

const stack = new Stack();

const f = new AwsConsoleUrlFactory({
  awsAccountId: "123",
  awsAccountRegion: "us-east-1",
});

let r = f.getElastiCacheClusterUrl("c1", ElastiCacheClusterType.REDIS);
let m = f.getElastiCacheClusterUrl("c2", ElastiCacheClusterType.MEMCACHED);

console.log({ redis: stack.resolve(r), memcached: stack.resolve(m) });
```

### Expected behavior

The urls should look like:
https://us-east-1.console.aws.amazon.com/elasticache/home?region=us-east-1#/redis/c1
https://us-east-1.console.aws.amazon.com/elasticache/home?region=us-east-1#/memcached/c2

Even if the clusters don't exist you can tell that the form of the URL is correct - the fields on the page will just be missing.


### Actual behavior

You'll get URLs of the form:
https://us-east-1.console.aws.amazon.com/elasticache/home?region=us-east-1#redis-shards:redis-id=c1
https://us-east-1.console.aws.amazon.com/elasticache/home?region=us-east-1#memcached-nodes:id=c2;nodes

Which don't work - they'll bounce you to the elasticache landing page.

### Other details

I'm not sure the console URLs are documented anywhere, so it's possible that this is different for different accounts or elasticache setups.


Discussion / hints:
As a side-note, making `clusterUrl` read-only exacerbates this, as the user has to create a subclass and override `createTitleWidget` in order to fix, rather than just setting the correct url on the instance.

https://github.com/cdklabs/cdk-monitoring-constructs/blob/d1fda6fd7ea7ae2e07d9ae847273794474f9b36f/lib/monitoring/aws-elasticache/ElastiCacheClusterMonitoring.ts#L93

Any reason it's read-only?

Fix patch:
diff --git a/lib/common/url/AwsConsoleUrlFactory.ts b/lib/common/url/AwsConsoleUrlFactory.ts
index ace99f6e..36880212 100644
--- a/lib/common/url/AwsConsoleUrlFactory.ts
+++ b/lib/common/url/AwsConsoleUrlFactory.ts
@@ -73,10 +73,10 @@ export class AwsConsoleUrlFactory {
     const region = this.awsAccountRegion;
     switch (clusterType) {
       case ElastiCacheClusterType.MEMCACHED:
-        const destinationUrlMemcached = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#memcached-nodes:id=${clusterId};nodes`;
+        const destinationUrlMemcached = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#/memcached/${clusterId}`;
         return this.getAwsConsoleUrl(destinationUrlMemcached);
       case ElastiCacheClusterType.REDIS:
-        const destinationUrlRedis = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#redis-shards:redis-id=${clusterId}`;
+        const destinationUrlRedis = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#/redis/${clusterId}`;
         return this.getAwsConsoleUrl(destinationUrlRedis);
       default:
         throw new Error(`Invalid cache type: ${clusterType}`);


Test patch:
diff --git a/test/common/url/AwsConsoleUrlFactory.test.ts b/test/common/url/AwsConsoleUrlFactory.test.ts
index fa5dad90..6e91c873 100644
--- a/test/common/url/AwsConsoleUrlFactory.test.ts
+++ b/test/common/url/AwsConsoleUrlFactory.test.ts
@@ -277,7 +277,7 @@ test("getElastiCacheClusterUrl (memcached)", () => {
   const factory = new AwsConsoleUrlFactory({ awsAccountId, awsAccountRegion });
 
   const expected =
-    "https://eu-west-1.console.aws.amazon.com/elasticache/home?region=eu-west-1#memcached-nodes:id=DummyDomainName;nodes";
+    "https://eu-west-1.console.aws.amazon.com/elasticache/home?region=eu-west-1#/memcached/DummyDomainName";
 
   expect(
     stack.resolve(
@@ -303,7 +303,7 @@ test("getElastiCacheClusterUrl (redis)", () => {
   const factory = new AwsConsoleUrlFactory({ awsAccountId, awsAccountRegion });
 
   const expected =
-    "https://eu-west-1.console.aws.amazon.com/elasticache/home?region=eu-west-1#redis-shards:redis-id=DummyDomainName";
+    "https://eu-west-1.console.aws.amazon.com/elasticache/home?region=eu-west-1#/redis/DummyDomainName";
 
   expect(
     stack.resolve(