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.
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.
-
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
Configurez
instrumentationpour 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.Spécifiez
cloudWatchAgentSidecarde 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.
Exécutez CloudWatch l'agent en tant que service daemon en mode
HOSTréseau.Configurez
instrumentationpour 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.
Exécutez CloudWatch l'agent en tant que service de réplication avec Service Connect.
Configurez
instrumentationpour instrumenter l’application à l’aide de l’agent ADOT pour Python.Remplacez les variables d'environnement en les configurant
overrideEnvironmentsde 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, }); } }
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
initpour 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.
Ajoutez une configuration supplémentaire à votre conteneur d’applications.
Configuration
NODE_OPTIONS.(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, }); }
Déploiement de la pile mise à jour : exécutez la commande
cdk synthdans le répertoire principal de l’application. Pour déployer le service dans votre AWS compte, exécutez lacdk deploycommande 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: 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.my-app
Si vous avez utilisé la stratégie démon, deux services seront créés :
CloudWatchAgentDaemonest 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.: 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.my-app
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.: 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.my-app