in src/Amazon.AspNetCore.DataProtection.SSM/SSMXmlRepository.cs [219:299]
private async Task<bool> DeleteElementsAsync(Action<IReadOnlyCollection<IDeletableElement>> chooseElements)
{
if (chooseElements == null)
{
throw new ArgumentNullException(nameof(chooseElements));
}
var deletableElements = new List<DeletableElement>();
var request = new GetParametersByPathRequest
{
Path = _parameterNamePrefix,
WithDecryption = true
};
GetParametersByPathResponse response = null;
do
{
request.NextToken = response?.NextToken;
try
{
response = await _ssmClient.GetParametersByPathAsync(request).ConfigureAwait(false);
}
catch (Exception e)
{
_logger.LogError(
e,
"Error calling SSM to get parameters starting with {ParameterNamePrefix}: {ExceptionMessage}",
_parameterNamePrefix,
e.Message);
throw;
}
foreach (var parameter in response.Parameters ?? new())
{
try
{
var xml = XElement.Parse(parameter.Value);
deletableElements.Add(new DeletableElement(parameter, xml));
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
{
_logger.LogError(e, "Error parsing key {ParameterName}, key will be skipped: {ExceptionMessage}", parameter.Name, e.Message);
}
}
} while (!string.IsNullOrEmpty(response.NextToken));
chooseElements(deletableElements);
var elementsToDelete = deletableElements
.Where(e => e.DeletionOrder.HasValue)
.OrderBy(e => e.DeletionOrder.GetValueOrDefault());
foreach (var deletableElement in elementsToDelete)
{
var parameter = deletableElement.Parameter;
_logger.LogDebug("Deleting DataProtection key from SSM Parameter Store with parameter name {ParameterName}", parameter.Name);
try
{
var deleteParameterRequest = new DeleteParameterRequest
{
Name = parameter.Name
};
await _ssmClient.DeleteParameterAsync(deleteParameterRequest).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to delete DataProtection key from SSM Parameter Store with parameter name {ParameterName}: {ExceptionMessage}", parameter.Name, ex.Message);
// Stop processing deletions to avoid deleting a revocation entry for a key that we failed to delete.
return false;
}
}
return true;
}