Activez les signaux d'application sur Amazon ECS à l'aide de AWS CDK - Amazon CloudWatch

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.

Activez les signaux d'application sur Amazon ECS à l'aide de AWS CDK

Pour activer les signaux d'application sur Amazon ECS à l'aide de AWS CDK, procédez comme suit.

  1. Activation d’la vigie applicative pour vos applications : si la vigie applicative n’est pas encore activé dans ce compte, vous devez accorder à ce service les autorisations nécessaires pour découvrir vos services.

    import { aws_applicationsignals as applicationsignals } from 'aws-cdk-lib'; const cfnDiscovery = new applicationsignals.CfnDiscovery(this, 'ApplicationSignalsServiceRole', { } );

    La CloudFormation ressource Discovery accorde à Application Signals les autorisations suivantes :

    • xray:GetServiceGraph

    • logs:StartQuery

    • logs:GetQueryResults

    • cloudwatch:GetMetricData

    • cloudwatch:ListMetrics

    • tag:GetResources

    Pour plus d’informations sur ce rôle, consultez Autorisations de rôle liées au service pour les signaux d'application CloudWatch.

  2. Instrumentez votre application avec la bibliothèque AWS::Application Signals Construct du AWS CDK. Les extraits de code contenus dans ce document sont fournis dans. TypeScript Pour d'autres alternatives spécifiques à un langage, voir Langages de programmation pris en charge pour le AWS CDK.

    • Activation de la vigie applicative sur Amazon ECS en mode sidecar

      1. Configurez instrumentation pour instrumenter l'application avec l' AWS agent du SDK Distro for OpenTelemetry (ADOT). L’exemple suivant illustre l’instrumentation d’une application Java. Consultez toutes InstrumentationVersionles versions linguistiques prises en charge.

      2. Spécifiez cloudWatchAgentSidecar de configurer l' CloudWatch agent en tant que conteneur annexe.

        import { Construct } from 'constructs'; import * as appsignals from '@aws-cdk/aws-applicationsignals-alpha'; import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ecs from 'aws-cdk-lib/aws-ecs'; class MyStack extends cdk.Stack { public constructor(scope?: Construct, id?: string, props: cdk.StackProps = {}) { super(); const vpc = new ec2.Vpc(this, 'TestVpc', {}); const cluster = new ecs.Cluster(this, 'TestCluster', { vpc }); const fargateTaskDefinition = new ecs.FargateTaskDefinition(this, 'SampleAppTaskDefinition', { cpu: 2048, memoryLimitMiB: 4096, }); fargateTaskDefinition.addContainer('app', { image: ecs.ContainerImage.fromRegistry('test/sample-app'), }); new appsignals.ApplicationSignalsIntegration(this, 'ApplicationSignalsIntegration', { taskDefinition: fargateTaskDefinition, instrumentation: { sdkVersion: appsignals.JavaInstrumentationVersion.V2_10_0, }, serviceName: 'sample-app', cloudWatchAgentSidecar: { containerName: 'ecs-cwagent', enableLogging: true, cpu: 256, memoryLimitMiB: 512, } }); new ecs.FargateService(this, 'MySampleApp', { cluster: cluster, taskDefinition: fargateTaskDefinition, desiredCount: 1, }); } }
    • Activation de la vigie applicative sur Amazon ECS en mode démon

      Note

      La stratégie de déploiement en mode démon n’est pas prise en charge sur Amazon ECS Fargate et est uniquement compatible avec Amazon ECS sur Amazon EC2.

      1. Exécutez CloudWatch l'agent en tant que service daemon en mode HOST réseau.

      2. Configurez instrumentation pour instrumenter l’application à l’aide de l’agent ADOT pour Python.

        import { Construct } from 'constructs'; import * as appsignals from '@aws-cdk/aws-applicationsignals-alpha'; import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ecs from 'aws-cdk-lib/aws-ecs'; class MyStack extends cdk.Stack { public constructor(scope?: Construct, id?: string, props: cdk.StackProps = {}) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'TestVpc', {}); const cluster = new ecs.Cluster(this, 'TestCluster', { vpc }); // Define Task Definition for CloudWatch agent (Daemon) const cwAgentTaskDefinition = new ecs.Ec2TaskDefinition(this, 'CloudWatchAgentTaskDefinition', { networkMode: ecs.NetworkMode.HOST, }); new appsignals.CloudWatchAgentIntegration(this, 'CloudWatchAgentIntegration', { taskDefinition: cwAgentTaskDefinition, containerName: 'ecs-cwagent', enableLogging: false, cpu: 128, memoryLimitMiB: 64, portMappings: [ { containerPort: 4316, hostPort: 4316, }, { containerPort: 2000, hostPort: 2000, }, ], }); // Create the CloudWatch Agent daemon service new ecs.Ec2Service(this, 'CloudWatchAgentDaemon', { cluster, taskDefinition: cwAgentTaskDefinition, daemon: true, // Runs one container per EC2 instance }); // Define Task Definition for user application const sampleAppTaskDefinition = new ecs.Ec2TaskDefinition(this, 'SampleAppTaskDefinition', { networkMode: ecs.NetworkMode.HOST, }); sampleAppTaskDefinition.addContainer('app', { image: ecs.ContainerImage.fromRegistry('test/sample-app'), cpu: 0, memoryLimitMiB: 512, }); // No CloudWatch Agent sidecar is needed as application container communicates to CloudWatch Agent daemon through host network new appsignals.ApplicationSignalsIntegration(this, 'ApplicationSignalsIntegration', { taskDefinition: sampleAppTaskDefinition, instrumentation: { sdkVersion: appsignals.PythonInstrumentationVersion.V0_8_0 }, serviceName: 'sample-app' }); new ecs.Ec2Service(this, 'MySampleApp', { cluster, taskDefinition: sampleAppTaskDefinition, desiredCount: 1, }); } }
    • Activation de la vigie applicative sur Amazon ECS en mode réplica

      Note

      CloudWatch L'exécution du service Agent en mode réplique nécessite des configurations de groupes de sécurité spécifiques pour permettre la communication avec d'autres services. Pour la fonctionnalité de la vigie applicative, configurez le groupe de sécurité avec les règles de trafic entrant minimales : port 2000 (HTTP) et port 4316 (HTTP). Cette configuration garantit une connectivité adéquate entre l' CloudWatch agent et les services dépendants.

      1. Exécutez CloudWatch l'agent en tant que service de réplication avec Service Connect.

      2. Configurez instrumentation pour instrumenter l’application à l’aide de l’agent ADOT pour Python.

      3. Remplacez les variables d'environnement en les configurant overrideEnvironments de manière à utiliser les points de terminaison Service Connect pour communiquer avec le serveur de l' CloudWatch agent.

        import { Construct } from 'constructs'; import * as appsignals from '@aws-cdk/aws-applicationsignals-alpha'; import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import { PrivateDnsNamespace } from 'aws-cdk-lib/aws-servicediscovery'; class MyStack extends cdk.Stack { public constructor(scope?: Construct, id?: string, props: cdk.StackProps = {}) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'TestVpc', {}); const cluster = new ecs.Cluster(this, 'TestCluster', { vpc }); const dnsNamespace = new PrivateDnsNamespace(this, 'Namespace', { vpc, name: 'local', }); const securityGroup = new ec2.SecurityGroup(this, 'ECSSG', { vpc }); securityGroup.addIngressRule(securityGroup, ec2.Port.tcpRange(0, 65535)); // Define Task Definition for CloudWatch agent (Replica) const cwAgentTaskDefinition = new ecs.FargateTaskDefinition(this, 'CloudWatchAgentTaskDefinition', {}); new appsignals.CloudWatchAgentIntegration(this, 'CloudWatchAgentIntegration', { taskDefinition: cwAgentTaskDefinition, containerName: 'ecs-cwagent', enableLogging: false, cpu: 128, memoryLimitMiB: 64, portMappings: [ { name: 'cwagent-4316', containerPort: 4316, hostPort: 4316, }, { name: 'cwagent-2000', containerPort: 2000, hostPort: 2000, }, ], }); // Create the CloudWatch Agent replica service with service connect new ecs.FargateService(this, 'CloudWatchAgentService', { cluster: cluster, taskDefinition: cwAgentTaskDefinition, securityGroups: [securityGroup], serviceConnectConfiguration: { namespace: dnsNamespace.namespaceArn, services: [ { portMappingName: 'cwagent-4316', dnsName: 'cwagent-4316-http', port: 4316, }, { portMappingName: 'cwagent-2000', dnsName: 'cwagent-2000-http', port: 2000, }, ], }, desiredCount: 1, }); // Define Task Definition for user application const sampleAppTaskDefinition = new ecs.FargateTaskDefinition(this, 'SampleAppTaskDefinition', {}); sampleAppTaskDefinition.addContainer('app', { image: ecs.ContainerImage.fromRegistry('test/sample-app'), cpu: 0, memoryLimitMiB: 512, }); // Overwrite environment variables to connect to the CloudWatch Agent service just created new appsignals.ApplicationSignalsIntegration(this, 'ApplicationSignalsIntegration', { taskDefinition: sampleAppTaskDefinition, instrumentation: { sdkVersion: appsignals.PythonInstrumentationVersion.V0_8_0, }, serviceName: 'sample-app', overrideEnvironments: [ { name: appsignals.CommonExporting.OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT, value: 'http://cwagent-4316-http:4316/v1/metrics', }, { name: appsignals.TraceExporting.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, value: 'http://cwagent-4316-http:4316/v1/traces', }, { name: appsignals.TraceExporting.OTEL_TRACES_SAMPLER_ARG, value: 'endpoint=http://cwagent-2000-http:2000', }, ], }); // Create ECS Service with service connect configuration new ecs.FargateService(this, 'MySampleApp', { cluster: cluster, taskDefinition: sampleAppTaskDefinition, serviceConnectConfiguration: { namespace: dnsNamespace.namespaceArn, }, desiredCount: 1, }); } }
  3. Configuration d’une application Node.js utilisant le format de module ESM. La prise en charge des applications Node.js utilisant le format de module ESM est limitée. Pour plus d’informations, consultez la section Limitations connues des applications Node.js avec ESM.

    Dans le cas du format ESM, l’activation de la vigie applicative à l’aide du conteneur init pour injecter le kit SDK d’instrumentation Node.js ne s’applique pas. Ignorez l’étape 2 de cette procédure et procédez plutôt comme suit.

    • Installez les dépendances nécessaires à l’instrumentation automatique dans votre application Node.js.

      npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.
    • Mettre à jour TaskDefinition.

      1. Ajoutez une configuration supplémentaire à votre conteneur d’applications.

      2. Configuration NODE_OPTIONS.

      3. (Facultatif) Ajoutez CloudWatch un agent si vous choisissez le mode sidecar.

        import { Construct } from 'constructs'; import * as appsignals from '@aws-cdk/aws-applicationsignals-alpha'; import * as ecs from 'aws-cdk-lib/aws-ecs'; class MyStack extends cdk.Stack { public constructor(scope?: Construct, id?: string, props: cdk.StackProps = {}) { super(scope, id, props); const fargateTaskDefinition = new ecs.FargateTaskDefinition(stack, 'TestTaskDefinition', { cpu: 256, memoryLimitMiB: 512, }); const appContainer = fargateTaskDefinition.addContainer('app', { image: ecs.ContainerImage.fromRegistry('docker/cdk-test'), }); const volumeName = 'opentelemetry-auto-instrumentation' fargateTaskDefinition.addVolume({name: volumeName}); // Inject additional configurations const injector = new appsignals.NodeInjector(volumeName, appsignals.NodeInstrumentationVersion.V0_5_0); injector.renderDefaultContainer(fargateTaskDefinition); // Configure NODE_OPTIONS appContainer.addEnvironment('NODE_OPTIONS', '--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs') // Optional: add CloudWatch agent const cwAgent = new appsignals.CloudWatchAgentIntegration(stack, 'AddCloudWatchAgent', { containerName: 'ecs-cwagent', taskDefinition: fargateTaskDefinition, memoryReservationMiB: 50, }); appContainer.addContainerDependencies({ container: cwAgent.agentContainer, condition: ecs.ContainerDependencyCondition.START, }); }
  4. Déploiement de la pile mise à jour : exécutez la commande cdk synth dans le répertoire principal de l’application. Pour déployer le service dans votre AWS compte, exécutez la cdk deploy commande dans le répertoire principal de votre application.

    Si vous avez utilisé la stratégie sidecar, un seul service sera créé :

    • APPLICATION_SERVICEest le service de votre application. Il comprend les trois conteneurs suivants :

      • init : conteneur requis pour l’initialisation de la vigie applicative.

      • ecs-cwagent— Un conteneur exécutant l' CloudWatch agent

      • my-app : exemple de conteneur d’application dans notre documentation. Dans vos charges de travail réelles, ce conteneur spécifique n’existe peut-être pas ou peut être remplacé par vos propres conteneurs de service.

    Si vous avez utilisé la stratégie démon, deux services seront créés :

    • CloudWatchAgentDaemon est le service CloudWatch agent daemon.

    • APPLICATION_SERVICEest le service de votre application. Il comprend les deux conteneurs suivants :

      • init : conteneur requis pour l’initialisation de la vigie applicative.

      • my-app : exemple de conteneur d’application dans notre documentation. Dans vos charges de travail réelles, ce conteneur spécifique n’existe peut-être pas ou peut être remplacé par vos propres conteneurs de service.

    Si vous avez utilisé la stratégie de réplication, deux services seront créés :

    • CloudWatchAgentServiceest le service de réplication de l' CloudWatch agent.

    • APPLICATION_SERVICEest le service de votre application. Il comprend les deux conteneurs suivants :

      • init : conteneur requis pour l’initialisation de la vigie applicative.

      • my-app : exemple de conteneur d’application dans notre documentation. Dans vos charges de travail réelles, ce conteneur spécifique n’existe peut-être pas ou peut être remplacé par vos propres conteneurs de service.