AWS Cloud Development Kit (AWS CDK)를 사용하여 배포
1단계: 계정에서 Application Signals 활성화
이 계정에서 아직 Application Signals를 활성화하지 않은 경우 서비스를 검색하는 데 필요한 권한을 Application Signals에 부여해야 합니다. 그렇게 하려면 다음을 수행합니다. 계정에 대해 한 번만 수행하면 됩니다.
애플리케이션에 대해 Application Signals 활성화
https://console.aws.amazon.com/cloudwatch/
에서 CloudWatch 콘솔을 엽니다. 탐색 창에서 서비스를 선택합니다.
서비스 검색 시작을 선택합니다.
확인란을 선택하고 서비스 검색 시작을 선택합니다.
계정에서 처음으로 이 단계를 완료하면 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 에이전트를 사용하여 애플리케이션 계측
애플리케이션 태스크 정의에서 바인드 탑재를 지정합니다. 애플리케이션이 사용하는 언어에 따라
MOUNT_VOLUME
을 바꿉니다. 예를 들어, Java의 경우opentelemetry-auto-instrumentation
을 사용합니다. 다음 단계에서 이 볼륨은 컨테이너 간에 파일을 공유하는 데 사용됩니다. 이 바인드 탑재는 이 절차의 뒷부분에서 사용합니다.const taskDefinition = new ecs.FargateTaskDefinition(this, 'MyTaskDefinition', { ... volumes: [{ name:
MOUNT_VOLUME
, }] );다음으로 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_ARN
을 2단계 - 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, });
애플리케이션의 태스크 정의에 새 컨테이너를 추가합니다.
$IMAGE
를 AWS Distro for OpenTelemetry Amazon ECR 이미지 리포지토리의 최신 이미지로 바꿉니다. 애플리케이션이 사용하는 언어에 따라 MOUNT_CONTAINER_PATH
및INIT_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 });애플리케이션이 사용하는 언어에 따라 환경 변수
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