Quero começar o post de hoje com um desafio, a tarefa é a seguinte: recuperar a lista de recursos criados em uma Assinatura do Azure nos últimos 7 dias.
Como você implementaria?
Deixa nos comentários qual foi a primeira solução que veio na sua cabeça.
Azure Resource Graph
Se sua resposta envolve utilizar o Azure Resource Graph para buscar uma lista de recursos ordenada pela data de criação, lamento informar, mas, assim como eu, você vai perceber que a tarefa é um pouco mais complicada do que parece.
O problema reside em não existir uma padronização nas propriedades dos tipos de recurso no Azure, ao que parece cada equipe define as propriedades e apensar da documentação ser ótima com relação a isso é complicado, para não dizer impossível, de se conseguir uma lista apurada e mantê-la atualizada.
Executando uma query simples nos recursos da minha assinatura (e olha que nem tenho tantos tipos criados assim) consegui uma lista de ~12 propriedades diferentes.
resources
| where properties contains("time") or properties contains("date")
Alguns dos diferentes tipos de nome:
- createdTime
- createdDate
- creationTime
- timeCreated
- timestamp
- issueDate
- e outras
Após descobrir isso, ainda existem recursos que não possuem nenhum tipo óbvio de propriedade de criação.
Agora vem a pergunta: como resolver o problema?
Temos duas possibilidades, a primeira seria cria uma Azure Policy que obrigaria todos os recursos a ter uma tag com o nome dataCriacao e o valor seria a data corrente, mas ainda teríamos o problema de não conseguir retornar os recursos já criados na query.
A solução é usar outra tabela no próprio Azure Resource Graph a tabela resourcechanges, responsável por manter uma lista de atualização nos últimos 14 dias de todas as mudanças do Azure.
Agora que temos as informações que precisamos, eu montei a query final do seguinte modo:
resourcechanges
| extend targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType), changeTime = todatetime(properties.changeAttributes.timestamp)
| where changeTime > ago(7d) and changeType == "Create"
| order by changeTime desc
| project resourceId=targetResourceId, resourceType=properties.targetResourceType, location, resourceGroup, changeTime
Prontinho, agora conseguimos capturar os recursos criados e podemos fazer as análises necessárias.
Me conta aí nos comentários qual foi a solução que você pensou
[]s e até a próxima.