Aktifkan Sinyal Aplikasi di Amazon ECS menggunakan AWS CDK - Amazon CloudWatch

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Aktifkan Sinyal Aplikasi di Amazon ECS menggunakan AWS CDK

Untuk mengaktifkan Sinyal Aplikasi di Amazon ECS menggunakan AWS CDK, lakukan hal berikut.

  1. Aktifkan Sinyal Aplikasi untuk aplikasi Anda — Jika Anda belum mengaktifkan Sinyal Aplikasi di akun ini, Anda harus memberikan Sinyal Aplikasi izin yang diperlukan untuk menemukan layanan Anda.

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

    CloudFormation Sumber daya Discovery memberikan izin berikut kepada Sinyal Aplikasi:

    • xray:GetServiceGraph

    • logs:StartQuery

    • logs:GetQueryResults

    • cloudwatch:GetMetricData

    • cloudwatch:ListMetrics

    • tag:GetResources

    Untuk informasi selengkapnya tentang peran ini, silakan lihat Izin peran terkait layanan untuk Sinyal Aplikasi CloudWatch.

  2. Instrumentasikan aplikasi Anda dengan AWS::ApplicationSignals Construct Library di AWS CDK. Cuplikan kode dalam dokumen ini disediakan di. TypeScript Untuk alternatif khusus bahasa lainnya, lihat Bahasa pemrograman yang didukung untuk CDK. AWS

    • Aktifkan Sinyal Aplikasi di Amazon ECS dengan mode sespan

      1. Konfigurasikan instrumentation untuk instrumen aplikasi dengan AWS Distro for OpenTelemetry (ADOT) SDK Agent. Berikut ini adalah contoh instrumentasi aplikasi Java. Lihat InstrumentationVersionuntuk semua versi bahasa yang didukung.

      2. Tentukan cloudWatchAgentSidecar untuk mengkonfigurasi CloudWatch Agen sebagai wadah sespan.

        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, }); } }
    • Aktifkan Sinyal Aplikasi di Amazon ECS dengan mode daemon

      catatan

      Strategi penyebaran daemon tidak didukung di Amazon ECS Fargate dan hanya didukung di Amazon ECS di Amazon EC2.

      1. Jalankan CloudWatch Agen sebagai layanan daemon dengan mode HOST jaringan.

      2. Konfigurasikan instrumentation untuk instrumen aplikasi dengan Agen Python ADOT.

        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, }); } }
    • Aktifkan Sinyal Aplikasi di Amazon ECS dengan mode replika

      catatan

      Menjalankan layanan CloudWatch Agen menggunakan mode replika memerlukan konfigurasi grup keamanan khusus untuk mengaktifkan komunikasi dengan layanan lain. Untuk fungsionalitas Sinyal Aplikasi, konfigurasikan grup keamanan dengan aturan masuk minimum: Port 2000 (HTTP) dan Port 4316 (HTTP). Konfigurasi ini memastikan konektivitas yang tepat antara CloudWatch Agen dan layanan dependen.

      1. Jalankan CloudWatch Agen sebagai layanan replika dengan service connect.

      2. Konfigurasikan instrumentation untuk instrumen aplikasi dengan Agen Python ADOT.

      3. Ganti variabel lingkungan dengan mengonfigurasi overrideEnvironments untuk menggunakan titik akhir service connect untuk berkomunikasi ke server agen. CloudWatch

        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. Menyiapkan aplikasi Node.js dengan format modul ESM. Ada dukungan terbatas untuk aplikasi Node.js dengan format modul ESM. Untuk informasi selengkapnya, lihat Batasan yang diketahui tentang Node.js dengan ESM.

    Untuk format modul ESM, mengaktifkan Sinyal Aplikasi dengan menggunakan init wadah untuk menyuntikkan SDK instrumentasi Node.js tidak berlaku. Lewati Langkah 2 dalam prosedur ini, dan lakukan hal berikut sebagai gantinya.

    • Instal dependensi yang relevan ke aplikasi Node.js Anda untuk autoinstrumentasi.

      npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.
    • Perbarui TaskDefinition.

      1. Tambahkan konfigurasi tambahan ke wadah aplikasi Anda.

      2. Konfigurasi NODE_OPTIONS.

      3. (Opsional) Tambahkan CloudWatch Agen jika Anda memilih mode sespan.

        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. Menyebarkan tumpukan yang diperbarui — Jalankan cdk synth perintah di direktori utama aplikasi Anda. Untuk menyebarkan layanan di AWS akun Anda, jalankan cdk deploy perintah di direktori utama aplikasi Anda.

    Jika Anda menggunakan strategi sespan, Anda akan melihat satu layanan dibuat:

    • APPLICATION_SERVICEadalah layanan aplikasi Anda. Ini mencakup tiga wadah berikut:

      • init— Wadah yang diperlukan untuk menginisialisasi Sinyal Aplikasi.

      • ecs-cwagent— Sebuah wadah yang menjalankan CloudWatch agen

      • my-app— Ini adalah contoh wadah aplikasi dalam dokumentasi kami. Dalam beban kerja Anda yang sebenarnya, penampung khusus ini mungkin tidak ada atau mungkin diganti dengan kontainer layanan Anda sendiri.

    Jika Anda menggunakan strategi daemon, Anda akan melihat dua layanan yang dibuat:

    • CloudWatchAgentDaemon adalah layanan CloudWatch agen daemon.

    • APPLICATION_SERVICEadalah layanan aplikasi Anda. Ini mencakup dua wadah berikut:

      • init— Wadah yang diperlukan untuk menginisialisasi Sinyal Aplikasi.

      • my-app— Ini adalah contoh wadah aplikasi dalam dokumentasi kami. Dalam beban kerja Anda yang sebenarnya, penampung khusus ini mungkin tidak ada atau mungkin diganti dengan kontainer layanan Anda sendiri.

    Jika Anda menggunakan strategi replika, Anda akan melihat dua layanan dibuat:

    • CloudWatchAgentServiceadalah layanan replika CloudWatch agen.

    • APPLICATION_SERVICEadalah layanan aplikasi Anda. Ini mencakup dua wadah berikut:

      • init— Wadah yang diperlukan untuk menginisialisasi Sinyal Aplikasi.

      • my-app— Ini adalah contoh wadah aplikasi dalam dokumentasi kami. Dalam beban kerja Anda yang sebenarnya, penampung khusus ini mungkin tidak ada atau mungkin diganti dengan kontainer layanan Anda sendiri.