Passer au contenu principal
Utilisez un template AWS CloudFormation pour configurer le streaming des métriques CloudWatch vers AppSignal. Le template crée toutes les ressources requises en un seul déploiement, au lieu de configurer chacune manuellement via la console AWS. Pour un aperçu des métriques CloudWatch dans AppSignal, y compris les Magic Dashboards et la dénomination des métriques, consultez Métriques AWS CloudWatch. Si vous préférez configurer chaque ressource manuellement, consultez le guide de configuration via la console.

Avant de commencer

Préparez les informations suivantes :
  • La clé Push API au niveau de l’application de votre app. Pour la trouver, ouvrez la page des paramètres des clés d’API, ou rendez-vous dans les paramètres de votre organisation et sélectionnez Dev zone > API keys.
  • La région AWS où vous souhaitez déployer la stack

Ce que crée le template

Le template CloudFormation crée les ressources suivantes :
  1. Un bucket S3 pour stocker les enregistrements dont la livraison a échoué, avec une expiration de cycle de vie de 30 jours et une politique de conservation à la suppression.
  2. Un rôle IAM qui permet à Amazon Data Firehose d’écrire les enregistrements échoués dans le bucket S3.
  3. Un delivery stream Firehose qui envoie les métriques au point de terminaison AppSignal via HTTPS.
  4. Un rôle IAM qui permet aux CloudWatch Metric Streams d’écrire dans le delivery stream Firehose.
  5. Un CloudWatch metric stream qui exporte les métriques au format OpenTelemetry 1.0.

Template CloudFormation

Copiez le template suivant et enregistrez-le sous le nom appsignal-cloudwatch-metrics.yaml :
YAML
AWSTemplateFormatVersion: "2010-09-09"
Description: >
  Stream CloudWatch metrics to AppSignal using Amazon Data Firehose.

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: AppSignal Configuration
        Parameters:
          - AppLevelPushApiKey
    ParameterLabels:
      AppLevelPushApiKey:
        default: "App-level Push API Key (find at https://appsignal.com/redirect-to/app?to=api_keys&key_tab=app)"

Parameters:
  AppLevelPushApiKey:
    Type: String
    NoEcho: true
    Description: >
      Your App-level Push API key from AppSignal.

Resources:
  # 1. S3 bucket for failed deliveries
  FailedDeliveryBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub "appsignal-firehose-${AWS::StackName}-${AWS::AccountId}-${AWS::Region}"
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      LifecycleConfiguration:
        Rules:
          - Id: ExpireFailedDeliveries
            Status: Enabled
            ExpirationInDays: 30

  # 2. IAM role for Firehose to write to S3
  FirehoseS3Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: firehose.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: FirehoseS3Access
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "s3:AbortMultipartUpload"
                  - "s3:GetBucketLocation"
                  - "s3:GetObject"
                  - "s3:ListBucket"
                  - "s3:ListBucketMultipartUploads"
                  - "s3:PutObject"
                Resource:
                  - !GetAtt FailedDeliveryBucket.Arn
                  - !Sub "${FailedDeliveryBucket.Arn}/*"

  # 3. Firehose delivery stream
  MetricsDeliveryStream:
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties:
      DeliveryStreamType: DirectPut
      HttpEndpointDestinationConfiguration:
        EndpointConfiguration:
          Url: "https://appsignal-endpoint.net/metrics/aws-cloudwatch"
          AccessKey: !Ref AppLevelPushApiKey
          Name: AppSignal
        RequestConfiguration:
          ContentEncoding: GZIP
        BufferingHints:
          IntervalInSeconds: 60
          SizeInMBs: 1
        S3BackupMode: FailedDataOnly
        S3Configuration:
          BucketARN: !GetAtt FailedDeliveryBucket.Arn
          RoleARN: !GetAtt FirehoseS3Role.Arn
        RoleARN: !GetAtt FirehoseS3Role.Arn

  # 4. IAM role for CloudWatch Metric Streams to write to Firehose
  MetricStreamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: streams.metrics.cloudwatch.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: MetricStreamFirehoseAccess
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "firehose:PutRecord"
                  - "firehose:PutRecordBatch"
                Resource: !GetAtt MetricsDeliveryStream.Arn

  # 5. CloudWatch metric stream
  CloudWatchMetricStream:
    Type: AWS::CloudWatch::MetricStream
    Properties:
      FirehoseArn: !GetAtt MetricsDeliveryStream.Arn
      RoleArn: !GetAtt MetricStreamRole.Arn
      OutputFormat: "opentelemetry1.0"

Outputs:
  DeliveryStreamName:
    Description: Name of the Firehose delivery stream.
    Value: !Ref MetricsDeliveryStream

  MetricStreamName:
    Description: Name of the CloudWatch metric stream.
    Value: !Ref CloudWatchMetricStream

  FailedDeliveryBucketName:
    Description: S3 bucket for failed delivery records.
    Value: !Ref FailedDeliveryBucket

Déployer la stack

  1. Ouvrez la console AWS CloudFormation.
  2. Sélectionnez Create stack et choisissez With new resources (standard).
  3. Sous Specify template, sélectionnez Upload a template file et téléchargez appsignal-cloudwatch-metrics.yaml.
  4. Sélectionnez Next.
  5. Entrez un nom de stack, par exemple appsignal-cloudwatch-metrics.
  6. Pour AppLevelPushApiKey, saisissez la clé Push API au niveau de l’application de votre app.
  7. Sélectionnez Next deux fois, puis cochez I acknowledge that AWS CloudFormation might create IAM resources et sélectionnez Submit.
La création de la stack prend quelques minutes. Une fois que le statut affiche CREATE_COMPLETE, CloudWatch commence à diffuser les métriques vers AppSignal.

Filtrer des services AWS spécifiques

Par défaut, le template diffuse les métriques de tous les services AWS du compte. Pour ne diffuser que des services spécifiques, ajoutez IncludeFilters à la ressource CloudWatchMetricStream :
YAML
CloudWatchMetricStream:
  Type: AWS::CloudWatch::MetricStream
  Properties:
    FirehoseArn: !GetAtt MetricsDeliveryStream.Arn
    RoleArn: !GetAtt MetricStreamRole.Arn
    OutputFormat: "opentelemetry1.0"
    IncludeFilters:
      - Namespace: AWS/EC2
      - Namespace: AWS/RDS
      - Namespace: AWS/ELB
Remplacez les namespaces par les services AWS que vous souhaitez surveiller. Consultez les services AWS qui publient des métriques CloudWatch pour une liste complète des namespaces disponibles.

Vérifier le déploiement

  1. Dans la console AWS, recherchez “CloudFormation” et sélectionnez Stacks. Ouvrez votre stack et sélectionnez l’onglet Resources pour confirmer que toutes les ressources affichent CREATE_COMPLETE.
  2. Dans la console AWS, recherchez “CloudWatch”. Dans la barre latérale gauche, allez dans Metrics > Streams et confirmez que le statut du metric stream est Running.
  3. Dans la console AWS, recherchez “Firehose”. Ouvrez le delivery stream et utilisez la fonction Test with demo data pour vérifier la connectivité.
  4. Dans AppSignal, ouvrez le tableau de bord de votre app et vérifiez que les métriques CloudWatch apparaissent dans votre tableau de bord personnalisé.
Si les métriques n’apparaissent pas après quelques minutes, vérifiez le bucket S3 pour les enregistrements de livraison échoués. Si vous avez besoin d’aide, contactez-nous.

Déploiements multi-régions

Le template déploie toutes les ressources dans une seule région AWS. Si vous exécutez des charges de travail dans plusieurs régions, déployez une copie distincte de cette stack dans chaque région. Cela maintient le transfert de données au sein de chaque région et évite les frais de transfert inter-régions.

Nettoyage

Pour supprimer toutes les ressources créées par ce template, supprimez la stack dans la console CloudFormation. Le bucket S3 pour les livraisons échouées a une DeletionPolicy de Retain, il est donc conservé lors de la suppression de la stack afin d’éviter de perdre des enregistrements de livraison échoués. Les enregistrements de livraison échoués dans le bucket sont automatiquement supprimés après 30 jours par la règle de cycle de vie. Vous pouvez supprimer le bucket manuellement lorsque vous n’en avez plus besoin.