Création d’un connecteur personnalisé à une source de données
Cette rubrique décrit comment connecter une source de données personnalisée à CloudWatch. Vous pouvez connecter une source de données personnalisée à CloudWatch de deux manières :
-
Utilisez un exemple de modèle fourni par CloudWatch. Vous pouvez utiliser JavaScript ou Python avec ce modèle. Ces modèles incluent un exemple de code Lambda qui vous sera utile lors de la création de votre fonction Lambda. Vous pouvez ensuite modifier la fonction Lambda à partir du modèle pour vous connecter à votre source de données personnalisée.
-
Créez une fonction AWS Lambda à partir de zéro qui implémente le connecteur de source de données, la requête de données et la préparation des séries chronologiques pour leur utilisation dans CloudWatch. Cette fonction doit préagréger ou fusionner des points de données si nécessaire, et doit également aligner la période et les horodatages pour être compatible avec CloudWatch.
Table des matières
Utilisation d’un modèle
L’utilisation d’un modèle crée un exemple de fonction Lambda et peut vous aider à créer votre connecteur personnalisé plus rapidement. Ces exemples de fonctions fournissent des exemples de code pour de nombreux scénarios courants liés à la création d’un connecteur personnalisé. Vous pouvez examiner le code Lambda après avoir créé un connecteur avec un modèle, puis le modifier pour l’utiliser pour vous connecter à votre source de données.
En outre, si vous utilisez le modèle, CloudWatch se charge de créer la politique d’autorisations Lambda et d’associer des balises de ressources à la fonction Lambda.
Pour utiliser le modèle afin de créer un connecteur vers une source de données personnalisée
Ouvrez la console CloudWatch à l’adresse https://console.aws.amazon.com/cloudwatch/
. -
Dans le panneau de navigation, sélectionnez Settings (Paramètres).
Choisissez l’onglet Sources de données de métriques.
Choisissez Create data source.
Choisissez le bouton radio Personnalisé – modèle de démarrage, puis Choisissez Suivant.
Entrez un nom pour la source de données.
Sélectionnez l’un des modèles répertoriés.
Sélectionnez Node.js ou Python.
Choisissez Create data source.
La nouvelle source personnalisée que vous venez d’ajouter n’apparaît pas tant que la pile CloudFormation n’a pas fini de la créer. Pour vérifier la progression, vous pouvez choisir Voir le statut de ma pile CloudFormation. Vous pouvez également choisir l’icône d’actualisation pour mettre à jour cette liste.
Lorsque votre nouvelle source de données apparaît dans cette liste, elle est prête à être testée dans la console et modifiée.
(Facultatif) Pour interroger les données de test de cette source dans la console, suivez les instructions de la rubrique Création d’un graphique de mesures à partir d’une autre source de données.
Modifiez la fonction Lambda en fonction de vos besoins.
Dans le panneau de navigation, sélectionnez Settings (Paramètres).
Choisissez l’onglet Sources de données de métriques.
Choisissez Afficher dans la console Lambda pour la source que vous souhaitez modifier.
Vous pouvez désormais modifier la fonction pour accéder à votre source de données. Pour de plus amples informations, consultez Étape 1 : créer la fonction.
Note
En utilisant le modèle, lorsque vous écrivez votre fonction Lambda, vous n’avez pas besoin de suivre les instructions contenues dans Étape 2 : créer une stratégie d’autorisations Lambda ou. Étape 3 : attacher une balise de ressource à la fonction Lambda Ces étapes ont été effectuées par CloudWatch, car vous avez utilisé le modèle.
Création d’une source de données personnalisée de toutes pièces
Suivez les étapes de cette section pour créer une fonction Lambda qui connecte CloudWatch à une source de données.
Étape 1 : créer la fonction
Un connecteur de source de données personnalisé doit prendre en charge les événements GetMetricData provenant de CloudWatch. Vous pouvez également éventuellement implémenter un événement DescribeGetMetricData pour fournir aux utilisateurs de la documentation sur l’utilisation du connecteur dans la console CloudWatch. La réponse DescribeGetMetricData peut également être utilisée pour définir les valeurs par défaut utilisées dans le générateur de requêtes personnalisées CloudWatch.
CloudWatch fournit des extraits de code sous forme d’exemples pour vous aider à démarrer. Pour plus d’informations, veuillez consulter le référentiel d’exemples à l’adresse https://github.com/aws-samples/cloudwatch-data-source-samples
Contraintes
La réponse de Lambda doit être inférieure à 6 Mo. Si la réponse dépasse 6 Mo, la réponse
GetMetricDatamarque la fonction Lambda commeInternalErroret aucune donnée n’est renvoyée.La fonction Lambda doit être exécutée dans les 10 secondes à des fins de visualisation et de tableau de bord, ou dans les 4,5 secondes pour l’utilisation des alarmes. Si le temps d’exécution dépasse ce délai, la réponse
GetMetricDatamarque la fonction Lambda commeInternalErroret aucune donnée n’est renvoyée.La fonction Lambda doit envoyer sa sortie en utilisant des horodatages d’époque en secondes.
Si la fonction Lambda ne rééchantillonne pas les données, mais renvoie des données qui ne correspondent pas à l’heure de début et à la durée de la période demandées par l’utilisateur de CloudWatch, ces données sont ignorées par CloudWatch. Les données supplémentaires sont supprimées de toute visualisation ou alarme. Toutes les données qui ne se situent pas entre l’heure de début et de fin sont également supprimées.
Par exemple, si un utilisateur demande des données entre 10 h et 11 h avec une période de 5 minutes, les intervalles de temps « 10:00:00 à 10:04:59 » et « 10:05:00 à 10:09:59 » sont les intervalles de temps valides pour le renvoi des données. Vous devez renvoyer une série chronologique qui inclut
10:00 value1,10:05 value2, etc. Si la fonction renvoie10:03 valueX, par exemple, elle est supprimée, car 10:03 ne correspond pas à l’heure de début et à la période demandées.Les requêtes multilignes ne sont pas prises en charge par les connecteurs de source de données CloudWatch. Chaque retour à la ligne est remplacé par un espace lorsque la requête est exécutée, ou lorsque vous créez une alarme ou un widget de tableau de bord avec la requête. Dans certains cas, cela peut rendre votre requête non valide.
Evénement GetMetricData
Charge utile de la requête
Voici un exemple de charge utile de la requête GetMetricData envoyée en entrée à la fonction Lambda.
{ "EventType": "GetMetricData", "GetMetricDataRequest": { "StartTime": 1697060700, "EndTime": 1697061600, "Period": 300, "Arguments": ["serviceregistry_external_http_requests{host_cluster!=\"prod\"}"] } }
StartTime : l’horodatage indiquant les premières données à renvoyer. Le type est horodatage, époque, secondes.
EndTime : l’horodatage indiquant les dernières données à renvoyer. Le type est horodatage, époque, secondes.
Période : nombre de secondes que représente chaque agrégation des données de métriques. La valeur minimale est 60 secondes. Le type est secondes.
Arguments : tableau d’arguments à transmettre à l’expression mathématique de la métrique Lambda. Pour plus d’informations sur le passage d’arguments, veuillez consulter la rubrique Comment transmettre des arguments à votre fonction Lambda.
Charge utile de la réponse
Voici un exemple de charge utile de la réponse GetMetricData renvoyée par la fonction Lambda.
{ "MetricDataResults": [ { "StatusCode": "Complete", "Label": "CPUUtilization", "Timestamps": [ 1697060700, 1697061000, 1697061300 ], "Values": [ 15000, 14000, 16000 ] } ] }
La charge utile de la réponse contiendra soit un champ MetricDataResults, soit un champ Error, mais pas les deux.
Un champ MetricDataResults est une liste de champs de séries temporelles de type MetricDataResult. Chacun de ces champs de série temporelle peut comprendre les champs suivants.
StatusCode : (Facultatif)
Completeindique que tous les points de données de l’intervalle de temps demandé ont été renvoyés.PartialDatasignifie qu’un ensemble incomplet de points de données a été renvoyé. Si cet argument est omis, la valeur par défaut estComplete.Valeurs Valides:
Complete|InternalError|PartialData|ForbiddenMessages : liste facultative de messages contenant des informations supplémentaires sur les données renvoyées.
Type : tableau d’objets MessageData avec des chaînes
CodeetValue.Label : étiquette lisible par l’homme associée aux données.
Type : String
Timestamps : horodatages des points de données, formatés en fonction de l’époque. Le nombre d’horodatages correspond toujours au nombre de valeurs et la valeur de
Timestamps[x]estValues[x].Type : tableau d’horodatage
Values : valeurs des points de données de la métrique, correspondant à
Timestamps. Le nombre de valeurs correspond toujours au nombre d’horodatages et la valeur deTimestamps[x]estValues[x].Type : tableau de doubles
Pour en savoir plus sur les objets Error, veuillez consulter les sections suivantes.
Formats de réponse aux erreurs
Vous pouvez éventuellement utiliser la réponse d’erreur pour fournir plus d’informations sur les erreurs. Nous vous recommandons de renvoyer une erreur lors de la validation du code lorsqu’une erreur de validation se produit, par exemple lorsqu’un paramètre est manquant ou de type incorrect.
Voici un exemple de réponse lorsque la fonction Lambda souhaite déclencher une exception de validation GetMetricData.
{ "Error": { "Code": "Validation", "Value": "Invalid Prometheus cluster" } }
Voici un exemple de réponse lorsque la fonction Lambda indique qu’elle n’est pas en mesure de renvoyer des données en raison d’un problème d’accès. La réponse est traduite en une seule série chronologique avec un code d’état Forbidden.
{ "Error": { "Code": "Forbidden", "Value": "Unable to access ..." } }
Voici un exemple de cas où la fonction Lambda déclenche une exception globale InternalError, qui est traduite en une série temporelle unique avec un code d’état InternalError et un message. Chaque fois qu’un code d’erreur a une valeur autre que Validation ou Forbidden, CloudWatch part du principe qu’il s’agit d’une erreur interne générique.
{ "Error": { "Code": "PrometheusClusterUnreachable", "Value": "Unable to communicate with the cluster" } }
Evénement DescribeGetMetricData
Charge utile de la requête
L’exemple qui suit illustre la charge utile d’une requête DescribeGetMetricData.
{ "EventType": "DescribeGetMetricData" }
Charge utile de la réponse
L’exemple qui suit illustre la charge utile d’une réponse DescribeGetMetricData.
{ "Description": "Data source connector", "ArgumentDefaults": [{ Value: "default value" }] }
Description : description de l’utilisation du connecteur de source de données. Cette description s’affichera dans la console CloudWatch. Markdown est pris en charge.
Type : String
ArgumentDefaults : tableau facultatif de valeurs par défaut des arguments utilisés pour préremplir le générateur de source de données personnalisé.
Si
[{ Value: "default value 1"}, { Value: 10}]est renvoyé, le générateur de requêtes de la console CloudWatch affiche deux entrées, la première avec la « valeur par défaut 1 » et la seconde avec 10.Si
ArgumentDefaultsn’est pas fourni, une seule entrée est affichée avec le type par défaut défini surString.Type : tableau d’objets contenant Value et Type.
Error : (facultatif) un champ d’erreur peut être inclus dans n’importe quelle réponse. Vous pouvez voir des exemples dans Evénement GetMetricData.
Considérations importantes relatives aux alarmes CloudWatch
Si vous comptez utiliser la source de données pour configurer des alarmes CloudWatch, vous devez la configurer pour qu’elle rapporte les données avec horodatage toutes les minutes à CloudWatch. Pour plus d’informations et d’autres considérations relatives à la création d’alarmes sur des métriques provenant de sources de données connectées, veuillez consulter la rubrique Création d’une alarme basée sur une source de données connectée.
(Facultatif) Utilisation de AWS Secrets Manager pour le stockage des informations d’identification
Si votre fonction Lambda doit utiliser des informations d’identification pour accéder à la source de données, nous vous recommandons d’utiliser AWS Secrets Manager pour stocker ces informations d’identification au lieu de les coder en dur dans votre fonction Lambda. Pour plus d’informations sur l’utilisation d’AWS Secrets Manager avec Lambda, veuillez consulter la rubrique Utilisez des secrets AWS Secrets Manager dans les fonctions AWS Lambda.
(Facultatif) Connexion à une source de données dans un VPC
Si votre source de données se trouve dans un VPC géré par Amazon Virtual Private Cloud, vous devez configurer votre fonction Lambda pour y accéder. Pour plus d’informations, veuillez consulter la rubrique Connexion des réseaux sortants aux ressources d’un VPC.
Vous devrez peut-être également configurer les points de terminaison du service VPC pour accéder à des services tels qu’AWS Secrets Manager. Pour plus d’informations, consultez Accès à un service AWS à l’aide du point de terminaison d’un VPC d’interface.
Étape 2 : créer une stratégie d’autorisations Lambda
Vous devez créer une déclaration de politique qui accorde à CloudWatch l’autorisation d’utiliser la fonction Lambda que vous avez créée. Vous pouvez utiliser l’AWS CLI ou la console Lambda pour créer la déclaration de politique.
Pour utiliser l’AWS CLI pour créer la déclaration de politique
Entrez la commande suivante. Remplacez
123456789012par votre identifiant de compte, remplacezmy-data-source-functionpar le nom de votre fonction Lambda et remplacezMyDataSource-DataSourcePermission1234par une valeur unique arbitraire.aws lambda add-permission --function-namemy-data-source-function--statement-idMyDataSource-DataSourcePermission1234--action lambda:InvokeFunction --principal lambda.datasource.cloudwatch.amazonaws.com --source-account123456789012
Étape 3 : attacher une balise de ressource à la fonction Lambda
La console CloudWatch détermine quelles fonctions Lambda sont des connecteurs de source de données à l’aide d’une balise. Lorsque vous créez une source de données à l’aide de l’un des assistants, la balise est automatiquement appliquée par la pile CloudFormation qui la configure. Lorsque vous créez vous-même une source de données, vous pouvez utiliser la balise suivante pour votre fonction Lambda. Cela fait apparaître votre connecteur dans la liste déroulante Sources de données de la console CloudWatch lorsque vous interrogez des métriques.
Une étiquette avec la clé
cloudwatch:datasourceet la valeurcustom.