AWS Cloud Development Kit (AWS CDK)를 사용하여 배포 - Amazon CloudWatch

AWS Cloud Development Kit (AWS CDK)를 사용하여 배포

1단계: 계정에서 Application Signals 활성화

이 계정에서 아직 Application Signals를 활성화하지 않은 경우 서비스를 검색하는 데 필요한 권한을 Application Signals에 부여해야 합니다. 그렇게 하려면 다음을 수행합니다. 계정에 대해 한 번만 수행하면 됩니다.

애플리케이션에 대해 Application Signals 활성화
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 서비스를 선택합니다.

  3. 서비스 검색 시작을 선택합니다.

  4. 확인란을 선택하고 서비스 검색 시작을 선택합니다.

    계정에서 처음으로 이 단계를 완료하면 AWSServiceRoleForCloudWatchApplicationSignals 서비스 역할이 생성됩니다. 이 역할은 Application Signals에 다음 권한을 부여합니다.

    • xray:GetServiceGraph

    • logs:StartQuery

    • logs:GetQueryResults

    • cloudwatch:GetMetricData

    • cloudwatch:ListMetrics

    • tag:GetResources

    이에 대한 자세한 내용은 CloudWatch Application Signals에 대한 서비스 연결 역할 권한 섹션을 참조하세요.

2단계 - IAM 역할 생성

IAM 역할을 생성해야 합니다. 이 역할을 이미 생성한 경우 권한을 추가해야 할 수 있습니다.

  • ECS 태스크 역할 - 컨테이너는 이 역할을 사용하여 실행됩니다. CloudWatchAgentServerPolicy 외에도 권한은 애플리케이션에 필요한 것이어야 합니다.

IAM 역할 생성에 대한 자세한 내용은 IAM 역할 생성 단원을 참조하세요.

3단계: AWS CDK에서 CloudWatch 에이전트를 사용하여 애플리케이션 계측

AWS CDK를 사용하여 Amazon ECS용 Application Signals를 활성화하려면 아래에 설명된 단계를 따릅니다. 이 문서의 코드 조각은 TypeScript로 제공되었습니다. 다른 언어별 버전은 AWS CDK cloudwatch-agent에 지원되는 프로그래밍 언어를 참조하세요.

참고

이 문서에서는 AWS CDK를 사용하는 Application Signals 설정 프로세스에 대한 개요를 제공합니다. MOUNT_VOLUME>, MOUNT_CONTAINER_PATH>, INIT_CONTAINER_COMMAND> 및 ENVIRONMENT_VARIABLES의 값을 지정하는 언어별 설정 지침은 4단계: CloudWatch 에이전트를 사용하여 애플리케이션 계측 섹션을 참조하세요.

CloudWatch 에이전트를 사용하여 애플리케이션 계측
  1. 애플리케이션 태스크 정의에서 바인드 탑재를 지정합니다. 애플리케이션이 사용하는 언어에 따라 MOUNT_VOLUME을 바꿉니다. 예를 들어, Java의 경우 opentelemetry-auto-instrumentation을 사용합니다. 다음 단계에서 이 볼륨은 컨테이너 간에 파일을 공유하는 데 사용됩니다. 이 바인드 탑재는 이 절차의 뒷부분에서 사용합니다.

    const taskDefinition = new ecs.FargateTaskDefinition(this, 'MyTaskDefinition', { ... volumes: [{ name: MOUNT_VOLUME, }] );
  2. 다음으로 CloudWatch 에이전트를 추가합니다. CloudWatch 에이전트 추가를 사용하는 방법은 사이드카 전략과 대몬 전략의 두 가지가 있습니다. 각 방법의 장단점에 대한 자세한 내용은 사용자 지정 설정을 사용하여 Amazon ECS에서 Application Signals를 활성화합니다. 섹션을 참조하고 환경에 가장 적합한 방법을 선택하세요.

    • 사이트카 전략 – 애플리케이션의 태스크 정의에 ecs-cwagent라는 새 컨테이너를 추가합니다. $IMAGE를 Amazon Elastic Container Registry의 최신 CloudWatch 컨테이너 이미지 경로로 바꿉니다. 자세한 내용은 Amazon ECR의 cloudwatch-agent를 참조하세요.

      const cwAgentContainer = taskDefinition.addContainer('ecs-cwagent', { image: ecs.ContainerImage.fromRegistry("$IMAGE"), environment: { CW_CONFIG_CONTENT: '{"agent": {"debug": true}, "traces": {"traces_collected": {"application_signals": {"enabled": true}}}, "logs": {"metrics_collected": {"application_signals": {"enabled": true}}}}', }, logging: new ecs.AwsLogDriver({ streamPrefix: 'ecs', logGroup: new logs.LogGroup(this, 'CwAgentLogGroup', { logGroupName: '/ecs/ecs-cwagent', }), }), });
    • 대몬 전략 - 스택에서 ecs-cwagent라는 새 서비스를 생성합니다. $TASK_ROLE_ARN$EXECUTION_ROLE_ARN2단계 - IAM 역할 생성에서 준비한 IAM 역할로 바꿉니다. $IMAGE를 Amazon Elastic Container Registry의 최신 CloudWatch 컨테이너 이미지 경로로 바꿉니다. 자세한 내용은 Amazon ECR의 cloudwatch-agent를 참조하세요.

      참고

      대몬 서비스는 호스트에 2개의 포트를 노출합니다. 포트 4316은 지표 및 트레이스를 수신하는 엔드포인트로 사용되고 2000은 CloudWatch 트레이스 샘플러 엔드포인트로 사용됩니다. 이 설정을 사용하면 에이전트가 호스트에서 실행되는 모든 애플리케이션 태스크에서 원격 측정 데이터를 수집하고 전송할 수 있습니다. 충돌을 방지하기 위해 호스트의 다른 서비스에서 이러한 포트를 사용하지 않도록 합니다.

      const cwAgentTaskDefinition = new ecs.Ec2TaskDefinition(this, 'CwAgentDaemonTaskDef', { taskRole: "$TASK_ROLE_ARN", executionRole: "$EXECUTION_ROLE_ARN", }); // Add the CloudWatch agent container const cwAgentContainer = cwAgentTaskDefinition.addContainer('ecs-cwagent', { image: ecs.ContainerImage.fromRegistry("$IMAGE"), cpu: 128, memoryLimitMiB: 64, portMappings: [ { containerPort: 4316, hostPort: 4316, }, { containerPort: 2000, hostPort: 2000, }, ], logging: new ecs.AwsLogDriver({ streamPrefix: 'ecs', logGroup: new logs.LogGroup(this, 'CwAgentLogGroup', { logGroupName: '/ecs/ecs-cwagent-daemon', }), }), environment: { CW_CONFIG_CONTENT: '{"agent": {"debug": true}, "traces": {"traces_collected": {"application_signals": {"enabled": true}}}, "logs": {"metrics_collected": {"application_signals": {"enabled": true}}}}', }, }); // Add the CloudWatch agent service running as a daemon const cwAgentService = new ecs.Ec2Service(this, 'CwAgentDaemonService', { cluster, taskDefinition: cwAgentTaskDefinition, daemon: true, });
  3. 애플리케이션의 태스크 정의에 새 컨테이너를 추가합니다. $IMAGEAWS Distro for OpenTelemetry Amazon ECR 이미지 리포지토리의 최신 이미지로 바꿉니다. 애플리케이션이 사용하는 언어에 따라 MOUNT_CONTAINER_PATHINIT_CONTAINER_COMMAND를 바꿉니다.

    예를 들어, Java의 경우 INIT_CONTAINER_COMMAND=["cp", "/javaagent.jar", "/otel-auto-instrumentation/javaagent.jar"], MOUNT_CONTAINER_PATH='/otel-auto-instrumentation'을 사용합니다.

    const initContainer = taskDefinition.addContainer('init', { image: ecs.ContainerImage.fromRegistry("$IMAGE"), essential: false, command: INIT_CONTAINER_COMMAND }); initContainer.addMountPoints({ sourceVolume: MOUNT_VOLUME, containerPath: MOUNT_CONTAINER_PATH, readOnly: false });
  4. 애플리케이션이 사용하는 언어에 따라 환경 변수 ENVIRONMENT_VARIABLES를 애플리케이션 컨테이너에 추가합니다. 그리고 볼륨 MOUNT_VOLUME을 애플리케이션 컨테이너에 탑재합니다.

    참고

    MOUNT_VOLUME>, MOUNT_CONTAINER_PATH>, INIT_CONTAINER_COMMAND> 및 ENVIRONMENT_VARIABLES의 값을 지정하는 언어별 설정 지침은 4단계: CloudWatch 에이전트를 사용하여 애플리케이션 계측 섹션을 참조하세요.

    다음은 그 예제입니다.

    const appContainer = taskDefinition.addContainer('my-app', { ... environment: { ... ENVIRONMENT_VARIABLES }, }); appContainer.addMountPoints({ sourceVolume: MOUNT_VOLUME, containerPath: MOUNT_CONTAINER_PATH, readOnly: false });

ESM 모듈 형식으로 Node.js 애플리케이션 설정

ESM 모듈 형식의 Node.js 애플리케이션을 제한적으로 지원합니다. 세부 정보는 ESM 사용 Node.js에 대해 알려진 제한 사항을 참조하세요.

ESM 모듈 형식의 경우 init 컨테이너를 사용한 Application Signals 활성화를 통한 Node.js 계측 SDK 주입에는 해당되지 않습니다. 이전 절차의 1단계와 3단계를 건너뛰고 다음을 대신 수행합니다.

ESM을 사용하는 Node.js 애플리케이션에 Application Signals를 활성화하려면
  1. 관련 종속성을 자동 계측용 Node.js 애플리케이션에 설치합니다.

    npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
  2. 이전 절차의 4단계에서 볼륨 의 탑재를 제거합니다.

    appContainer.addMountPoints({ sourceVolume: MOUNT_VOLUME, containerPath: MOUNT_CONTAINER_PATH, readOnly: false });

    환경 변수 NODE_OPTIONS을(를) --import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs(으)로 설정합니다.

4단계: 업데이트된 스택 배포

애플리케이션의 기본 디렉터리에서 cdk synth 명령을 실행합니다. AWS 계정에 서비스를 배포하려면 애플리케이션의 기본 디렉터리에서 cdk deploy 명령을 실행합니다.

사이드카 전략을 사용한 경우 한 가지 서비스가 생성됩니다.

  • APPLICATION_SERVICE는 애플리케이션의 서비스입니다. 여기에는 다음 세 가지의 구성 옵션이 포함됩니다.

    • init– Application Signals를 초기화하는 데 필요한 컨테이너입니다.

    • ecs-cwagent– CloudWatch 에이전트를 실행하는 컨테이너입니다.

    • my-app- 설명서의 예제 애플리케이션 컨테이너입니다. 실제 워크로드에서는 이 특정 컨테이너가 존재하지 않거나 자체 서비스 컨테이너로 대체될 수 있습니다.

대몬 전략을 사용한 경우 두 가지 서비스가 생성됩니다.

  • CWAgentDaemonService는 CloudWatch 에이전트 대몬 서비스입니다.

  • APPLICATION_SERVICE는 애플리케이션의 서비스입니다. 여기에는 다음 두 가지의 구성 옵션이 포함됩니다.

    • init– Application Signals를 초기화하는 데 필요한 컨테이너입니다.

    • my-app- 설명서의 예제 애플리케이션 컨테이너입니다. 실제 워크로드에서는 이 특정 컨테이너가 존재하지 않거나 자체 서비스 컨테이너로 대체될 수 있습니다.