Intégration des recommandations opérationnelles dans votre application avecAWS CloudFormation - AWS Hub de Résilience

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Intégration des recommandations opérationnelles dans votre application avecAWS CloudFormation

Après avoir choisiCréation d'un modèle CloudFormationdans leRecommandations opérationnelles,AWS Resilience Hubcrée unAWS CloudFormationmodèle qui décrit l'expérience spécifique d'alarme, de procédure d'exploitation standard (SOP) ou de simulation d'injection de défauts (FIS) pour votre application. LeAWS CloudFormationest stocké dans un compartiment Amazon S3, et vous pouvez vérifier le chemin S3 vers le modèle dans leDétails du modèledans leRecommandations opérationnelles.

Par exemple, la liste ci-dessous illustre un format JSONAWS CloudFormationmodèle qui décrit une recommandation d'alarme rendue parAWS Resilience Hub. Il s'agit d'une alarme de limitation de lecture pour une table DynamoDB appeléeEmployees.

LeResourcesdu modèle décrit la sectionAWS::CloudWatch::Alarmalarme activée lorsque le nombre d'événements d'accélération de lecture pour la table DynamoDB dépasse 1. Et les deuxAWS::SSM::Parameterles ressources définissent des métadonnées qui permettentAWS Resilience Hubpour identifier les ressources installées sans avoir à analyser l'application réelle.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "SNSTopicARN" : { "Type" : "String", "Description" : "The ARN of the SNS topic to which alarm status changes are to be sent. This must be in the same region being deployed.", "AllowedPattern" : "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):sns:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+=,@.-]{1,256}$" } }, "Resources" : { "ReadthrottleeventsthresholdexceededEmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9Alarm" : { "Type" : "AWS::CloudWatch::Alarm", "Properties" : { "AlarmDescription" : "Alarm by Resilience Hub that reports when amount of read throttle events is greater than 1", "AlarmName" : "ResilienceHub-ReadThrottleEventsAlarm-2020-04-01_Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9", "AlarmActions" : [ { "Ref" : "SNSTopicARN" } ], "MetricName" : "ReadThrottleEvents", "Namespace" : "AWS/DynamoDB", "Statistic" : "Sum", "Dimensions" : [ { "Name" : "TableName", "Value" : "Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9" } ], "Period" : 60, "EvaluationPeriods" : 1, "DatapointsToAlarm" : 1, "Threshold" : 1, "ComparisonOperator" : "GreaterThanOrEqualToThreshold", "TreatMissingData" : "notBreaching", "Unit" : "Count" }, "Metadata" : { "AWS::ResilienceHub::Monitoring" : { "recommendationId" : "dynamodb:alarm:health-read_throttle_events:2020-04-01" } } }, "dynamodbalarmhealthreadthrottleevents20200401EmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9AlarmSSMParameter" : { "Type" : "AWS::SSM::Parameter", "Properties" : { "Name" : "/ResilienceHub/Alarm/3f904525-4bfa-430f-96ef-58ec9b19aa73/dynamodb-alarm-health-read-throttle-events-2020-04-01_Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9", "Type" : "String", "Value" : { "Fn::Sub" : "${ReadthrottleeventsthresholdexceededEmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9Alarm}" }, "Description" : "SSM Parameter for identifying installed resources." } }, "dynamodbalarmhealthreadthrottleevents20200401EmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9AlarmInfoSSMParameter" : { "Type" : "AWS::SSM::Parameter", "Properties" : { "Name" : "/ResilienceHub/Info/Alarm/3f904525-4bfa-430f-96ef-58ec9b19aa73/dynamodb-alarm-health-read-throttle-events-2020-04-01_Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9", "Type" : "String", "Value" : { "Fn::Sub" : "{\"alarmName\":\"${ReadthrottleeventsthresholdexceededEmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9Alarm}\",\"referenceId\":\"dynamodb:alarm:health_read_throttle_events:2020-04-01\",\"resourceId\":\"Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9\",\"relatedSOPs\":[\"dynamodb:sop:update_provisioned_capacity:2020-04-01\"]}" }, "Description" : "SSM Parameter for identifying installed resources." } } } }

Modification duAWS CloudFormationmodèle

Le moyen le plus simple d'intégrer une ressource alarme, SOP ou FIS dans votre application principale consiste simplement à l'ajouter en tant que ressource supplémentaire dans le modèle qui décrit votre modèle d'application. Le fichier au format JSON fourni ci-dessous fournit un aperçu de base de la façon dont une table DynamoDB est décrite dans unAWS CloudFormationmodèle. Une application réelle est susceptible d'inclure plusieurs autres ressources, telles que des tables supplémentaires.

{ "AWSTemplateFormatVersion": "2010-09-09T00:00:00.000Z", "Description": "Application Stack with Employees Table", "Outputs": { "DynamoDBTable": { "Description": "The DynamoDB Table Name", "Value": {"Ref": "Employees"} } }, "Resources": { "Employees": { "Type": "AWS::DynamoDB::Table", "Properties": { "BillingMode": "PAY_PER_REQUEST", "AttributeDefinitions": [ { "AttributeName": "USER_ID", "AttributeType": "S" }, { "AttributeName": "RANGE_ATTRIBUTE", "AttributeType": "S" } ], "KeySchema": [ { "AttributeName": "USER_ID", "KeyType": "HASH" }, { "AttributeName": "RANGE_ATTRIBUTE", "KeyType": "RANGE" } ], "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, "Tags": [ { "Key": "Key", "Value": "Value" } ], "LocalSecondaryIndexes": [ { "IndexName": "resiliencehub-index-local-1", "KeySchema": [ { "AttributeName": "USER_ID", "KeyType": "HASH" }, { "AttributeName": "RANGE_ATTRIBUTE", "KeyType": "RANGE" } ], "Projection": { "ProjectionType": "ALL" } } ], "GlobalSecondaryIndexes": [ { "IndexName": "resiliencehub-index-1", "KeySchema": [ { "AttributeName": "USER_ID", "KeyType": "HASH" } ], "Projection": { "ProjectionType": "ALL" } } ] } } } }

Pour permettre le déploiement de la ressource d'alarme avec votre application, vous devez maintenant remplacer les ressources codées en dur par une référence dynamique dans les piles d'applications.

Il en va de même deAWS::CloudWatch::Alarmdéfinition de ressource, modifiez les éléments suivants :

"Value" : "Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9"

vers ce qui suit :

"Value" : {"Ref": "Employees"}

Et sous leAWS::SSM::Parameterdéfinition de ressource, modifiez les éléments suivants :

"Fn::Sub" : "{\"alarmName\":\"${ReadthrottleeventsthresholdexceededDynamoDBEmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9Alarm}\",\"referenceId\":\"dynamodb:alarm:health_read_throttle_events:2020-04-01\",\"resourceId\":\"Employees-ON-DEMAND-0-DynamoDBTable-PXBZQYH3DCJ9\",\"relatedSOPs\":[\"dynamodb:sop:update_provisioned_capacity:2020-04-01\"]}"

vers ce qui suit :

"Fn::Sub" : "{\"alarmName\":\"${ReadthrottleeventsthresholdexceededEmployeesONDEMAND0DynamoDBTablePXBZQYH3DCJ9Alarm}\",\"referenceId\":\"dynamodb:alarm:health_read_throttle_events:2020-04-01\",\"resourceId\":\"${Employees}\",\"relatedSOPs\":[\"dynamodb:sop:update_provisioned_capacity:2020-04-01\"]}"

Lors de la modificationAWS CloudFormationmodèles de SOP et d'expériences de simulation d'injection de défauts (FIS), vous adopterez la même approche, en remplaçant les ID de référence codés en dur par des références dynamiques qui continuent de fonctionner même après des modifications matérielles.

En utilisant une référence à la table DynamoDB, vous autorisezAWS CloudFormationpour effectuer les tâches suivantes :

  • Créez d'abord la table de base de données.

  • Utilisez toujours l'ID réel de la ressource générée dans l'alarme et mettez à jour l'alarme dynamiquement siAWS CloudFormationdoit remplacer la ressource.

Note

Vous pouvez choisir des méthodes plus avancées pour gérer vos ressources applicatives avecAWS CloudFormationtels quePiles imbriquéesouse référant à des sorties de ressources dans unAWS CloudFormationempiler. (Mais si vous souhaitez que la pile de recommandations reste séparée de la pile principale, vous devez configurer un moyen de transmettre les informations entre les deux piles.)

En outre, des outils tiers, tels que Terraform by HashiCorp, peuvent également être utilisés pour provisionner l'infrastructure en tant que code (iAC).