Wilfried Woivré

Cloud Solution Architect - MVP Microsoft Azure

Logic Apps - Stocker et récupérer l'heure de la dernière exécution

Categories : Azure Azure   Logic Apps Logic Apps


Pour gérer ma veille technologique, j’utilise aussi Azure, et entre autre Azure Function et Azure Logic Apps. Pour récupérer toutes les publications via un flux RSS, il est possible de le faire via une Logic Apps assez simplement, cependant afin de ne pas récupérer les publications déjà lues, il est convenable d’ajouter un filtre pour récupérer uniquement celles publiées après une certaine date.

Pour des questions de simplicité, il faut donc stocker la date de la dernière exécution de la Logic Apps, et pour cela rien de mieux qu’une Azure Table Storage pour stocker cette information.

Voici donc un template bicep qui contient tout ce qu’il faut pour avoir un exemple à exécuter dans votre environnement Azure.

Celui-ci contient :

  • Azure Storage
  • User Managed Identity
  • Role Assignment de la Managed Identity sur votre Storage avec le droit built-in Storage Table Data Contributor
  • Connection à Azure Storage (nécessaire pour Logic Apps)
  • Logic Apps avec 2 tâches pour lire l’entrée dans le storage, et la créer à la fin du workflow

Si vous souhaitez plus d’information sur comment construire votre Logic App via un template ARM, j’ai publié un article il y a quelques années Créez vos Logic Apps via des templates ARM et mauvaise nouvelle ce n’est toujours pas trivial à faire.

Le code est publié sur Github si vous le souhaitez : Template bicep

var demoName = 'demoblog'
var partitionKey = 'demoblog'
var rowKey = 'lastexecution'

resource storage 'Microsoft.Storage/storageAccounts@2021-09-01' = {
  name: '${demoName}${uniqueString(deployment().name)}'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
    minimumTlsVersion: 'TLS1_2'
  }
}

resource tableService 'Microsoft.Storage/storageAccounts/tableServices@2021-09-01' = {
  name: 'default'
  parent: storage
}

resource table 'Microsoft.Storage/storageAccounts/tableServices/tables@2021-09-01' = {
  name: 'config'
  parent: tableService
}

resource customIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2022-01-31-preview' = {
  name: '${demoName}${uniqueString(deployment().name)}'
  location: resourceGroup().location
}

resource logicApp 'Microsoft.Logic/workflows@2019-05-01' = {
  name: '${demoName}${uniqueString(deployment().name)}'
  location: resourceGroup().location
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${customIdentity.id}': {}
    }
  }
  properties: {
    definition: {
      '$schema': 'https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#'
      contentVersion: '1.0.0.0'
      parameters: {
        '$connections': {
          defaultValue: {
          }
          type: 'Object'
        }
      }
      triggers: {
        recurrence: {
          type: 'recurrence'
          recurrence: {
            interval: 1
            frequency: 'Day'
          }
        }
      }
      actions: {
        Get_Last_Time_Execution: {
          inputs: {
            host: {
              connection: {
                name: '@parameters(\'$connections\')[\'azuretables\'][\'connectionId\']'
              }
            }
            method: 'get'
            path: '/v2/storageAccounts/@{encodeURIComponent(encodeURIComponent(\'${storage.name}\'))}/tables/@{encodeURIComponent(\'${table.name}\')}/entities(PartitionKey=\'@{encodeURIComponent(\'${partitionKey}\')}\',RowKey=\'@{encodeURIComponent(\'${rowKey}\')}\')'
          }
          runAfter: {
          }
          type: 'ApiConnection'
        }
        Update_Last_Time_Execution: {
          inputs: {
            host: {
              connection: {
                name: '@parameters(\'$connections\')[\'azuretables\'][\'connectionId\']'
              }
            }
            method: 'put'
            body: {
              Value: '@{utcNow() }'
            }
            path: '/v2/storageAccounts/@{encodeURIComponent(encodeURIComponent(\'${storage.name}\'))}/tables/@{encodeURIComponent(\'${table.name}\')}/entities(PartitionKey=\'@{encodeURIComponent(\'${partitionKey}\')}\',RowKey=\'@{encodeURIComponent(\'${rowKey}\')}\')'
          }
          runAfter: {
            Get_Last_Time_Execution: [
              'Succeeded'
              'Failed'
            ]
          }
          type: 'ApiConnection'
        }
      }
    }
    parameters: {
      '$connections': {
        value: {
          azuretables: {
            connectionId: azuretables.id
            connectionName: 'azuretables'
            connectionProperties: {
              authentication: {
                identity: customIdentity.id
                type: 'ManagedServiceIdentity'
              }
            }
            id: subscriptionResourceId('Microsoft.Web/locations/managedApis',  resourceGroup().location,  'azuretables')
          }
        }
      }
    }
  }
}

resource roleAssignement 'Microsoft.Authorization/roleAssignments@2020-10-01-preview' = {
  scope: storage
  name: guid('${demoName}${uniqueString(deployment().name)}')
  properties: {
    principalId: customIdentity.properties.principalId
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3')
    principalType: 'ServicePrincipal'
  }
}
resource azuretables 'Microsoft.Web/connections@2016-06-01' = {

  name: 'azuretables'
  location: resourceGroup().location
  properties: {
    displayName: 'storage'
    api: {
      id: subscriptionResourceId('Microsoft.Web/locations/managedApis', resourceGroup().location, 'azuretables')
    }
    customParameterValues: {
    }
    'parameterValueSet': {
      name: 'managedIdentityAuth'
      values: {
      }
    }
  }
}

Voilà si cela peut vous sauvez des heures de casse têtes, je suis content pour vous.

Comments

Post comment
Loading...