Cloud Monitoring으로 환경 모니터링

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

Cloud Composer에서 Cloud MonitoringCloud Logging을 사용할 수 있습니다.

Cloud Monitoring은 클라우드 기반 애플리케이션의 성능, 업타임, 전반적인 상태에 관한 정보를 제공하며 Cloud Monitoring은 Cloud Composer에서 측정항목, 이벤트, 메타데이터를 수집하여 대시보드와 차트를 통해 통계를 생성합니다. Cloud Monitoring을 사용하여 Cloud Composer 환경 및 Airflow 측정항목의 성능과 상태를 파악할 수 있습니다.

Logging은 환경 클러스터의 스케줄러 및 작업자 컨테이너로 생성된 로그를 캡처합니다. 이러한 로그에는 디버깅에 도움이 되는 시스템 수준 및 Airflow 종속 항목 정보가 포함됩니다. 로그를 보는 방법에 대한 자세한 내용은 Airflow 로그 보기를 참조하세요.

시작하기 전에

  • Cloud Composer 환경의 로그 및 측정항목에 액세스하려면 다음과 같은 권한이 필요합니다.

    • 로그 및 측정항목에 대한 읽기 전용 액세스: logging.viewermonitoring.viewer
    • 비공개 로그를 포함한 로그에 대한 읽기 전용 액세스: logging.privateLogViewer
    • 측정항목에 대한 읽기/쓰기 액세스: monitoring.editor

    Cloud Composer의 다른 권한과 역할에 대한 자세한 내용은 액세스 제어를 참조하세요.

  • 중복 로깅을 방지하기 위해 Google Kubernetes Engine용 Cloud Logging이 중지되어 있습니다.

  • Cloud Logging은 Google Cloud 프로젝트에서 발생하는 각 상태와 이벤트에 대한 항목을 생성합니다. 제외 필터를 사용하면 Cloud Composer에서 Cloud Logging이 생성하는 로그를 비롯해 로그 볼륨을 줄일 수 있습니다.

    jobs.py에서 로그를 제외하면 상태 점검 실패 및 CrashLoopBackOff 오류가 발생할 수 있습니다. 제외되지 않도록 하려면 제외 필터에 -jobs.py를 포함해야 합니다.

  • Monitoring은 분당 2번 이상 실행되는 DAG 및 태스크의 개수 값을 표시할 수 없으며 실패한 작업의 측정항목을 표시하지 않습니다.

환경 측정항목

환경 측정항목을 사용하여 Cloud Composer 환경의 리소스 사용량 및 상태를 확인할 수 있습니다.

환경 상태

환경 상태를 확인하려면 상태 측정항목 composer.googleapis.com/environment/healthy를 사용하면 됩니다.

Cloud Composer는 일정에 따라 실행되고 환경 상태를 다음과 같이 보고하는 airflow_monitoring이라는 활성 DAG를 실행합니다.

  • 활성 DAG 실행이 성공적으로 완료되면 상태는 True입니다.
  • 활성 DAG 실행이 실패하면 상태는 False입니다.

활성 DAG는 dags/ 폴더에 저장되고 Airflow UI에 표시됩니다. 활성 DAG의 빈도와 콘텐츠는 변경할 수 없으며 수정하지 않아야 합니다. 활성 DAG 변경사항이 지속되지 않습니다.

환경 종속 항목 검사

Cloud Composer는 환경에서 작업에 필요한 서비스에 연결할 수 있는지, 서비스와 상호작용하는 데 충분한 권한이 있는지 주기적으로 확인합니다. 환경 작업에 필요한 서비스의 예시로는 Artifact Registry, Cloud Logging, Cloud Monitoring이 있습니다.

환경의 종속 항목 검사에 다음 측정항목을 사용할 수 있습니다.

종속 항목 측정항목 API 설명
종속 항목 검사 수 composer.googleapis.com/environment/health/dependency_check_count 이 측정항목은 환경 작업에 필요한 서비스에서 연결 가능성 검사가 수행된 횟수를 추적합니다.
종속 항목 권한 검사 수 composer.googleapis.com/environment/health/dependency_permissions_check_count 이 측정항목은 환경 작업에 필요한 서비스에서 권한 검사가 수행된 횟수를 추적합니다.

데이터베이스 상태

데이터베이스 상태를 확인하려면 상태 측정항목 composer.googleapis.com/environment/database_health를 사용하면 됩니다.

Airflow 모니터링 포드가 데이터베이스를 1분마다 핑하고 상태를 SQL 연결 설정이 가능하면 True로, 가능하지 않으면 False로 보고합니다.

데이터베이스 측정항목

다음 환경 측정항목은 Cloud Composer 환경에서 사용하는 Airflow 메타데이터 데이터베이스에 사용할 수 있습니다. 이 측정항목을 사용하여 사용자 환경의 데이터베이스 인스턴스의 성능 및 리소스 사용량을 모니터링할 수 있습니다.

예를 들어 환경이 리소스 한도에 도달하면 환경 크기를 증가시킬 수 있습니다. 또는 데이터베이스 정리를 수행하여 데이터베이스의 크기를 최적화할 수 있습니다.

데이터베이스 측정항목 API 설명
데이터베이스 CPU 사용량 composer.googleapis.com/environment/database/cpu/usage_time
데이터베이스 CPU 코어 composer.googleapis.com/environment/database/cpu/reserved_cores
데이터베이스 CPU 사용률 composer.googleapis.com/environment/database/cpu/utilization
데이터베이스 메모리 사용량 composer.googleapis.com/environment/database/memory/bytes_used
데이터베이스 메모리 할당량 composer.googleapis.com/environment/database/memory/quota
데이터베이스 메모리 사용률 composer.googleapis.com/environment/database/memory/utilization
데이터베이스 디스크 사용량 composer.googleapis.com/environment/database/disk/bytes_used
데이터베이스 디스크 할당량 composer.googleapis.com/environment/database/disk/quota
데이터베이스 디스크 사용률 composer.googleapis.com/environment/database/disk/utilization
데이터베이스 연결 한도 composer.googleapis.com/environment/database/network/max_connections
데이터베이스 연결 composer.googleapis.com/environment/database/network/connections
장애 조치에 사용 가능한 데이터베이스 composer.googleapis.com/environment/database/available_for_failover 환경의 Cloud SQL 인스턴스가 고가용성 모드이고 장애 조치 준비가 된 경우 True입니다.
데이터베이스 자동 장애 조치 요청 수 composer.googleapis.com/environment/database/auto_failover_request_count 환경의 Cloud SQL 인스턴스의 총 자동 장애 조치 요청 수

작업자 측정항목

Cloud Composer 2 환경에서 사용되는 Airflow 작업자에 사용할 수 있는 환경 측정항목은 다음과 같습니다.

이 측정항목은 환경에서 작업자 수를 자동으로 확장하는 데 사용됩니다. 수평형 포드 자동 확장 처리가 이 측정항목을 설정하면 Airflow 작업자 설정 컨트롤러 환경 구성요소가 이 측정항목을 사용하여 이 측정항목의 값에 따라 Airflow 작업자 수를 확장하거나 축소합니다.

작업자 측정항목 API
배율 인수 목표 composer.googleapis.com/environment/worker/scale_factor_target

스케줄러 측정항목

이름 API 설명
활성 스케줄러 composer.googleapis.com/environment/active_schedulers 활성 스케줄러 인스턴스 수

트리거 측정항목

다음 트리거 측정항목은 Cloud Composer에만 제공됩니다.

이름 API 설명
활성 트리거 composer.googleapis.com/environment/active_triggerers 활성 트리거 인스턴스 수

또한 Cloud Composer 측정항목을 통해 다음 Airflow 측정항목을 사용할 수 있습니다.

이름 API Airflow의 이름 설명
실행 중인 총 트리거 수 composer.googleapis.com/workload/triggerer/num_running_triggers triggers.running 트리거 인스턴스당 실행 중인 트리거 수입니다.
차단 트리거 composer.googleapis.com/environment/trigger/blocking_count triggers.blocked_main_thread 기본 스레드를 차단한 트리거 수입니다(완전 비동기가 아닌 경우).
실패 트리거 composer.googleapis.com/environment/trigger/failed_count triggers.failed 이벤트를 실행하기 전 오류와 함께 실패한 트리거 수입니다.
성공 트리거 composer.googleapis.com/environment/trigger/succeeded_count triggers.succeeded 하나 이상의 이벤트를 실행한 트리거의 수입니다.

웹 서버 측정항목

다음 환경 측정항목은 Cloud Composer 환경에서 사용하는 Airflow 웹 서버에 사용할 수 있습니다. 이러한 측정항목을 사용하여 해당 환경의 Airflow 웹 서버 인스턴스에 대한 성능 및 리소스 사용량을 확인할 수 있습니다.

예를 들어 지속적으로 리소스 한도에 도달하는 경우 웹 서버 확장 및 성능 매개변수를 증가시킬 수 있습니다.

이름 API 설명
웹 서버 CPU 사용량 composer.googleapis.com/environment/web_server/cpu/usage_time
웹 서버 CPU 할당량 composer.googleapis.com/environment/web_server/cpu/reserved_cores
웹 서버 메모리 사용량 composer.googleapis.com/environment/web_server/memory/bytes_used
웹 서버 메모리 할당량 composer.googleapis.com/environment/web_server/memory/quota
활성 웹 서버 composer.googleapis.com/environment/active_webservers 활성 웹 서버 인스턴스 수

DAG 측정항목

DAG 실행 효율성을 모니터링하고 높은 지연 시간을 유발하는 태스크를 식별할 수 있도록 다음과 같은 DAG 측정항목이 제공됩니다.

DAG 측정항목 API
DAG 실행 수 composer.googleapis.com/workflow/run_count
각 DAG 실행 지속 시간 composer.googleapis.com/workflow/run_duration
작업 실행 횟수 composer.googleapis.com/workflow/task/run_count
각 태스크 실행 지속 시간 composer.googleapis.com/workflow/task/run_duration

Cloud Monitoring은 완료된 워크플로와 태스크 실행의 측정항목(성공 또는 실패)만 표시합니다. 워크플로 활동이 없고 진행 중인 워크플로 및 작업 실행이 없으면 데이터가 표시되지 않습니다.

Celery Executor 측정항목

다음과 같은 Celery Executor 측정항목을 사용할 수 있습니다. 이러한 측정항목은 사용자 환경에 충분한 작업자 리소스가 있는지 확인하는 데 도움이 될 수 있습니다.

Celery Executor 측정항목 API
큐의 작업 수 composer.googleapis.com/environment/task_queue_length
온라인 Celery 작업자 수 composer.googleapis.com/environment/num_celery_workers

Airflow 측정항목

다음과 같은 Airflow 측정항목을 사용할 수 있습니다. 이러한 측정항목은 Airflow에서 제공되는 측정항목에 해당합니다.

이름 API Airflow의 이름 설명
Celery 태스크의 0이 아닌 종료 코드 composer.googleapis.com/environment/celery/execute_command_failure_count celery.execute_command.failure Celery 태스크의 0이 아닌 종료 코드 수입니다.
Celery 태스크 게시 시간 초과 composer.googleapis.com/environment/celery/task_timeout_error_count celery.task_timeout_error 태스크를 Celery 브로커에 게시할 때 발생한 AirflowTaskTimeout 오류 수입니다.
직렬화된 DAG 가져오기 기간 composer.googleapis.com/environment/collect_db_dag_duration collect_db_dags 데이터베이스에서 모든 직렬화된 DAG를 가져오는 데 걸린 시간입니다.
DAG 새로고침 오류 composer.googleapis.com/environment/dag_callback/exception_count dag.callback_exceptions DAG 콜백에서 발생한 예외 수입니다. 이 경우 DAG 콜백이 작동하지 않는다는 의미입니다.
DAG 새로고침 오류 composer.googleapis.com/environment/dag_file/refresh_error_count dag_file_refresh_error DAG 파일 로드 실패 횟수입니다.
DAG 파일 로드 시간 composer.googleapis.com/environment/dag_processing/last_duration dag_processing.last_duration.<dag_file> 특정 DAG 파일을 로드하는 데 걸린 시간입니다.
DAG 파일 처리 후 경과 시간 composer.googleapis.com/environment/dag_processing/last_run_elapsed_time dag_processing.last_run.seconds_ago.<dag_file> DAG 파일이 마지막으로 처리된 후 경과된 시간(초)입니다.
DagFileProcessorManager 중단 수 composer.googleapis.com/environment/dag_processing/manager_stall_count dag_processing.manager_stalls 중단된 DagFileProcessorManager 프로세스 수입니다.
DAG 파싱 오류 composer.googleapis.com/environment/dag_processing/parse_error_count dag_processing.import_errors DAG 파일을 파싱할 때 생성된 오류 수입니다.
실행 중인 DAG 파싱 프로세스 composer.googleapis.com/environment/dag_processing/processes dag_processing.processes 현재 실행 중인 DAG 파싱 프로세스 수입니다.
프로세서 시간 초과 composer.googleapis.com/environment/dag_processing/processor_timeout_count dag_processing.processor_timeouts 시간이 너무 오래 걸려 종료된 파일 프로세서의 수입니다.
모든 DAG 파일을 스캔하고 가져오는 데 걸린 시간 composer.googleapis.com/environment/dag_processing/total_parse_time dag_processing.total_parse_time 모든 DAG 파일을 한 번 스캔하고 가져오는 데 걸린 총 시간입니다.
현재 DAG 모음 크기 composer.googleapis.com/environment/dagbag_size dagbag_size 스케줄러가 구성에 따라 스캔을 실행할 때 발견된 DAG 수입니다.
실패한 SLA 누락 이메일 알림 composer.googleapis.com/environment/email/sla_notification_failure_count sla_email_notification_failure 실패한 SLA 누락 이메일 알림 시도 횟수입니다.
실행자의 열린 슬롯 composer.googleapis.com/environment/executor/open_slots executor.open_slots 실행자의 열린 슬롯 수입니다.
큐에 추가된 실행자의 태스크 composer.googleapis.com/environment/executor/queued_tasks executor.queued_tasks 큐에 추가된 실행자의 태스크 수입니다.
실행 중인 실행자의 태스크 composer.googleapis.com/environment/executor/running_tasks executor.running_tasks 실행 중인 실행자의 태스크 수입니다.
태스크 인스턴스 성공/실패 composer.googleapis.com/environment/finished_task_instance_count ti_failures, ti_successes 전체 태스크 인스턴스의 성공/실패 개수입니다.
시작/완료된 작업 composer.googleapis.com/environment/job/count <job_name>_start, <job_name>_end 시작/완료된 작업 수(예: SchedulerJob, LocalTaskJob)입니다.
작업 하트비트 실패 composer.googleapis.com/environment/job/heartbeat_failure_count <job_name>_heartbeat_failure 작업의 실패한 하트비트 수입니다.
연산자당 생성된 태스크 composer.googleapis.com/environment/operator/created_task_instance_count task_instance_created-<operator_name> 지정된 연산자에 대해 생성된 태스크 수입니다.
연산자 실행 composer.googleapis.com/environment/operator/finished_task_instance_count operator_failures_<operator_name>, operator_successes_<operator_name> 연산자당 완료된 태스크 인스턴스 수
풀의 열린 슬롯 composer.googleapis.com/environment/pool/open_slots pool.open_slots.<pool_name> 풀의 열린 슬롯 수입니다.
풀의 큐에 추가된 슬롯 composer.googleapis.com/environment/pool/queued_slots pool.queued_slots.<pool_name> 풀의 큐에 추가된 슬롯 수입니다.
풀의 실행 슬롯 composer.googleapis.com/environment/pool/running_slots pool.running_slots.<pool_name> 풀의 실행 슬롯 수입니다.
풀의 리소스 부족 태스크 composer.googleapis.com/environment/pool/starving_tasks pool.starving_tasks.<pool_name> 풀에서 리소스를 받지 못하는 태스크 수입니다.
스케줄러의 중요 섹션에서 소비한 시간 composer.googleapis.com/environment/scheduler/critical_section_duration scheduler.critical_section_duration 스케줄러 루프의 중요 섹션에서 소비한 시간입니다. 한 번에 하나의 스케줄러만 이 루프에 들어갈 수 있습니다.
중요 섹션 잠금 실패 composer.googleapis.com/environment/scheduler/critical_section_lock_failure_count scheduler.critical_section_busy 스케줄러 프로세스가 중요 섹션(실행자에게 태스크를 전송하는 데 필요)에서 잠금을 시도하고 다른 프로세스에 의해 잠긴 것으로 확인된 횟수입니다.
외부에서 종료된 태스크 composer.googleapis.com/environment/scheduler/task/externally_killed_count scheduler.tasks.killed_externally 외부에서 종료된 태스크 수입니다.
분리된 태스크 composer.googleapis.com/environment/scheduler/task/orphan_count scheduler.orphaned_tasks.cleared, scheduler.orphaned_tasks.adopted 스케줄러에서 삭제했거나 채택한 분리된 태스크 수입니다.
실행 중/리소스 부족/실행 가능한 태스크 composer.googleapis.com/environment/scheduler/tasks scheduler.tasks.running, scheduler.tasks.starving, scheduler.tasks.executable 실행 중/리소스 부족/실행 가능한 태스크 수입니다.
스케줄러 하트비트 composer.googleapis.com/environment/scheduler_heartbeat_count scheduler_heartbeat 스케줄러 하트비트입니다.
실패한 SLA 콜백 알림 composer.googleapis.com/environment/sla_callback_notification_failure_count sla_callback_notification_failure 실패한 SLA 누락 콜백 알림 시도 횟수입니다.
스마트 센서 포크 예외 실패 composer.googleapis.com/environment/smart_sensor/exception_failures smart_sensor_operator.exception_failures 이전 스마트 센서 포크 루프에서 예외로 인한 실패 수입니다.
스마트 센서 포크 인프라 장애 composer.googleapis.com/environment/smart_sensor/infra_failures smart_sensor_operator.infra_failures 이전 스마트 센서 포크 루프에서 인프라 장애 수입니다.
스마트 센서 포크 예외 composer.googleapis.com/environment/smart_sensor/poked_exception smart_sensor_operator.poked_exception 이전 스마트 센서 포크 루프에서 예외 수입니다.
스마트 센서가 성공적으로 포크한 태스크 composer.googleapis.com/environment/smart_sensor/poked_success smart_sensor_operator.poked_success 이전 포크 루프에서 스마트 센서가 포크한 새롭게 성공한 태스크 수입니다.
스마트 센서가 포크한 태스크 composer.googleapis.com/environment/smart_sensor/poked_tasks smart_sensor_operator.poked_tasks 이전 포크 루프에서 스마트 센서가 포크한 태스크 수입니다.
이전에 성공한 태스크 인스턴스 composer.googleapis.com/environment/task_instance/previously_succeeded_count previously_succeeded 이전에 성공한 태스크 인스턴스 수입니다.
종료된 좀비 태스크 composer.googleapis.com/environment/zombie_task_killed_count zombies_killed 종료된 좀비 태스크 수입니다.
DAG 실행 기간 composer.googleapis.com/workflow/dag/run_duration dagrun.duration.success.<dag_id>, dagrun.duration.failed.<dag_id> DagRun이 성공/실패 상태에 도달하는 데 걸린 시간입니다.
DAG 종속 항목 검사 기간 composer.googleapis.com/workflow/dependency_check_duration dagrun.dependency-check.<dag_id> DAG 종속 항목을 확인하는 데 걸리는 시간입니다. 이 측정항목은 환경 종속 항목과 권한 검사 측정항목과 다르며 DAG에 적용됩니다.
DAG 실행 일정 지연 composer.googleapis.com/workflow/schedule_delay dagrun.schedule_delay.<dag_id> 예약된 DagRun 시작일과 실제 DagRun 시작일 사이의 지연 시간입니다.
완료된 태스크 composer.googleapis.com/workflow/task_instance/finished_count ti.finish.<dag_id>.<task_id>.<state> 지정된 DAG에서 완료된 태스크 수입니다.
태스크 인스턴스 실행 기간 composer.googleapis.com/workflow/task_instance/run_duration dag.<dag_id>.<task_id>.duration 태스크를 완료하는 데 걸린 시간입니다.
시작된 태스크 composer.googleapis.com/workflow/task_instance/started_count ti.start.<dag_id>.<task_id> 지정된 DAG에서 시작된 태스크 수입니다.
태스크 인스턴스 대기열에 추가된 시간 composer.googleapis.com/workflow/task_instance/queued_duration dag.<dag_id>.<task_id>.queued_duration 태스크가 실행 상태로 전환되기 전에 대기열에 추가된 상태로 유지되는 시간입니다.
DAG에서 삭제된 태스크 composer.googleapis.com/workflow/task/removed_from_dag_count task_removed_from_dag.<dag_id> 지정되 DAG에서 삭제된 태스크 수입니다(즉, DAG에 더 이상 태스크가 없음).
DAG로 복원된 태스크 composer.googleapis.com/workflow/task/restored_to_dag_count task_restored_to_dag.<dag_id> 지정된 DAG에 대해 복원된 작업 수입니다. 즉, DB에서 '삭제됨' 상태였던 태스크 인스턴스가 DAG 파일에 추가됩니다.
태스크 일정 지연 composer.googleapis.com/workflow/task/schedule_delay dagrun.schedule_delay.<dag_id> 첫 번째 태스크 start_date와 dagrun 예상 시작 사이에 경과된 시간입니다.

Cloud Composer 환경에 Monitoring 사용

콘솔

측정항목 탐색기를 사용하여 환경 및 DAG와 관련된 측정항목을 표시할 수 있습니다.

  • Cloud Composer 환경 리소스에는 환경에 대한 측정항목이 포함됩니다.

    특정 환경의 측정항목을 표시하려면 environment_name 라벨로 측정항목을 필터링합니다. 환경의 위치 또는 이미지 버전과 같은 다른 라벨로 필터링할 수도 있습니다.

  • Cloud Composer 워크플로 리소스에는 DAG에 대한 측정항목이 포함됩니다.

    특정 DAG 또는 태스크의 측정항목을 표시하려면 workflow_nametask_name 라벨로 측정항목을 필터링합니다. 또한 태스크 상태 또는 Airflow 연산자 이름과 같은 다른 라벨로 필터링할 수도 있습니다.

API 및 gcloud

Cloud Monitoring API 및 gcloud monitoring dashboards 명령어를 통해 커스텀 대시보드와 위젯을 만들고 관리할 수 있습니다. 자세한 내용은 API로 대시보드 관리를 참조하세요.

리소스, 측정항목, 필터에 대한 자세한 내용은 Cloud Monitoring API 참조를 확인하세요.

Cloud Monitoring 알림 사용

알림 정책을 만들어 측정항목 값을 모니터링하고 측정항목이 조건을 위반하면 이에 대한 알림을 수신할 수 있습니다.

  1. Google Cloud 콘솔에서  알림 페이지로 이동합니다.

    알림으로 이동

    검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Monitoring인 결과를 선택합니다.

  2. 알림 채널을 만들지 않고 알림을 받으려면 알림 채널 수정을 클릭하고 알림 채널을 추가합니다. 채널을 추가한 후 알림 페이지로 돌아갑니다.
  3. 알림 페이지에서 정책 만들기를 클릭합니다.
  4. 측정항목을 선택하려면 측정항목 선택 메뉴를 확장한 후 다음을 수행합니다.
    1. 메뉴를 관련 항목으로 제한하려면 필터 표시줄에 Cloud Composer을 입력합니다. 메뉴를 필터링한 후 결과가 없으면 활성 리소스 및 측정항목만 표시 전환을 중지합니다.
    2. 리소스 유형에서 Cloud Composer 환경 또는 Cloud Composer 워크플로를 선택합니다.
    3. 측정항목 카테고리측정항목을 선택한 후 적용을 선택합니다.
  5. 다음을 클릭합니다.
  6. 알림 트리거 구성 페이지의 설정에 따라 알림이 트리거되는 시점이 결정됩니다. 조건 유형을 선택하고 필요한 경우 기준점을 지정합니다. 자세한 내용은 측정항목 기준점 알림 정책 만들기를 참조하세요.
  7. 다음을 클릭합니다.
  8. 선택사항: 알림 정책에 알림을 추가하려면 알림 채널을 클릭합니다. 대화상자의 메뉴에서 하나 이상의 알림 채널을 선택한 다음 확인을 클릭합니다.
  9. 선택사항: 이슈 자동 종료 기간을 업데이트합니다. 이 필드는 측정항목 데이터가 없어 Monitoring에서 이슈를 닫을 시간을 결정합니다.
  10. 선택사항: 문서를 클릭한 후 알림 메시지에 포함할 정보를 추가합니다.
  11. 알림 이름을 클릭하고 알림 정책 이름을 입력합니다.
  12. 정책 만들기를 클릭합니다.
자세한 내용은 알림 정책을 참조하세요.

다음 단계