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 });

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