Skip to content

Instantly share code, notes, and snippets.

@bogdangaliceanu
Created August 26, 2022 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bogdangaliceanu/b9bf3cc60bc01c4a7e972f0ddecbd813 to your computer and use it in GitHub Desktop.
Save bogdangaliceanu/b9bf3cc60bc01c4a7e972f0ddecbd813 to your computer and use it in GitHub Desktop.
Amazon Neptune Autoscaling - NeptuneInstanceDescriber
public interface INeptuneInstanceDescriber : IDisposable
{
Task<(DBInstance Writer, ImmutableArray<DBInstance> Readers)> GetInstances(string clusterIdentifier);
}
// provides the current cluster topology (i.e. the instances that exist and their availability)
// see https://docs.aws.amazon.com/neptune/latest/userguide/api-instances.html#DBInstance and related pages
public class NeptuneInstanceDescriber : INeptuneInstanceDescriber
{
private readonly IAmazonNeptune neptune;
public NeptuneInstanceDescriber(IAmazonNeptune neptune)
{
this.neptune = neptune;
}
public async Task<(DBInstance Writer, ImmutableArray<DBInstance> Readers)> GetInstances(string clusterIdentifier)
{
var describeClusterRequest = new DescribeDBClustersRequest { DBClusterIdentifier = clusterIdentifier };
var cluster = (await neptune.DescribeDBClustersAsync(describeClusterRequest)).DBClusters.Single();
var writerMember = cluster.DBClusterMembers.Single(m => m.IsClusterWriter);
var readerMembers = cluster.DBClusterMembers.Where(m => !m.IsClusterWriter).ToImmutableArray();
var describeInstancesRequest = new DescribeDBInstancesRequest
{
Filters = new List<Filter> {new() {Name = "db-cluster-id", Values = new List<string> {clusterIdentifier}}}
};
var instances = (await neptune.DescribeDBInstancesAsync(describeInstancesRequest)).DBInstances;
var writer = instances.Single(i => i.DBInstanceIdentifier == writerMember.DBInstanceIdentifier);
var readers = instances
.Where(i => readerMembers.Any(r => r.DBInstanceIdentifier == i.DBInstanceIdentifier))
.ToImmutableArray();
return (writer, readers);
}
public void Dispose()
{
neptune.Dispose();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment