

# canary 생성
<a name="CloudWatch_Synthetics_Canaries_Create"></a>

**중요**  
소유권 또는 권한이 있는 엔드포인트 및 API만 모니터링하려면 Synthetics canary를 사용해야 합니다. canary 빈도 설정에 따라 이러한 엔드포인트에서 트래픽이 증가할 수 있습니다.

CloudWatch 콘솔을 사용하여 canary를 생성할 때 CloudWatch에서 제공하는 블루프린트를 사용하여 canary를 생성하거나 자체 스크립트를 작성할 수 있습니다. 자세한 내용은 [canary 블루프린트 사용](CloudWatch_Synthetics_Canaries_Blueprints.md) 단원을 참조하세요.

canary에 자체 스크립트를 사용하는 경우 CloudFormation을 사용하여 canary를 생성할 수도 있습니다. 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [AWS::Synthetics::Canary](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html) 섹션을 참조하세요.

자체 스크립트를 작성하는 경우 CloudWatch Synthetics가 라이브러리에 기본 제공하는 여러 함수를 사용할 수 있습니다. 자세한 내용은 [Synthetics 런타임 버전](CloudWatch_Synthetics_Canaries_Library.md) 섹션을 참조하세요.

**참고**  
canary를 생성할 때 생성되는 계층 중 하나는 앞에 ` Synthetics`가 추가된 Synthetics 계층입니다. 이 계층은 Synthetics 서비스 계정이 소유하며 런타임 코드를 포함합니다.

**canary를 생성하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **Application Signals**, **Synthetics canary**를 선택합니다.

   

1. **Create Canary(canary 생성)**를 선택합니다.

1. 다음 중 하나를 선택합니다.
   + 블루프린트 스크립트를 기반으로 canary를 생성하려면 **블루프린트 사용**을 선택한 다음 생성할 canary 유형을 선택합니다. 각 유형의 블루프린트 작업에 대한 자세한 내용은 [canary 블루프린트 사용](CloudWatch_Synthetics_Canaries_Blueprints.md) 단원을 참조하세요.
   + 사용자 고유의 Node.js 스크립트를 업로드하여 사용자 지정 canary를 생성하려면 **Upload a script(스크립트 업로드)**를 선택합니다.

     그런 다음 스크립트를 **스크립트** 영역으로 드래그하거나 **파일 찾아보기**를 선택하여 파일 시스템의 스크립트로 이동할 수 있습니다.
   + S3 버킷에서 스크립트를 가져오려면 [**S3에서 가져오기(Import from S3)**]를 선택합니다. 그런 다음 **소스 위치**에 canary에 대한 전체 경로를 입력하거나 **S3 찾아보기**를 선택합니다.

     사용하는 S3 버킷에 대한 `s3:GetObject` 및 `s3:GetObjectVersion` 권한이 있어야 합니다. 버킷은 canary를 생성할 리전과 동일한 AWS 리전에 있어야 합니다.

1. **이름**에 canary의 이름을 입력합니다. 이 이름은 여러 페이지에서 사용되므로 다른 canary와 구별되는 설명이 포함된 이름을 지정하는 것이 좋습니다.

1. **애플리케이션 또는 엔드포인트 URL(Application or endpoint URL)**에서 canary로 테스트할 URL을 입력합니다. 이 URL에는 프로토콜(예: https://)이 포함되어야 합니다.

   canary가 VPC에 있는 엔드포인트를 테스트하도록 하려면 이 절차의 뒷부분에서 VPC에 대한 정보도 입력해야 합니다.

1. canary에 대해 사용자 고유의 스크립트를 사용하는 경우 **Lambda 핸들러**에 canary를 시작할 진입점을 입력합니다. Lambda 핸들러 형식에 대한 자세한 내용은 [Synthetics 런타임 버전](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html) 섹션을 참조하세요.

1. **스크립트 편집기**, **런타임 버전**에서 카나리를 실행할 Synthetics 런타임 버전을 선택하세요. Synthetics 런타임 버전에 대한 자세한 내용은 [Synthetics 런타임 버전](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html)을 참조하세요.

   **브라우저 구성**에서 카나리를 테스트하도록 브라우저를 활성화할 수 있습니다. 하나 이상의 브라우저를 선택해야 합니다.

1. 스크립트에서 환경 변수를 사용할 경우 [**환경 변수(Environment variables)**]를 선택한 다음, 스크립트에 정의된 각 환경 변수에 대해 값을 지정합니다. 자세한 내용은 [환경 변수](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md#CloudWatch_Synthetics_Environment_Variables) 단원을 참조하세요.

1. [**일정(Schedule)**]에서 이 canary를 한 번만 실행할지, rate 표현식을 사용하여 지속적으로 실행할지 또는 cron 표현식을 사용하여 일정을 지정할지 선택합니다.
   + CloudWatch 콘솔을 사용하여 지속적으로 실행되는 canary를 생성할 경우 1분에 한 번에서 1시간에 한 번 사이의 실행 비율을 선택할 수 있습니다.
   + canary 일정 지정을 위한 cron 표현식 작성에 대한 자세한 내용은 [cron을 사용하여 canary 실행 예약](CloudWatch_Synthetics_Canaries_cron.md) 단원을 참조하세요.

1. (선택 사항) canary에 대한 시간 초과 값을 설정하려면 **Additional configuration**(추가 구성)을 선택한 다음 시간 초과 값을 지정합니다. Lambda 콜드 스타트와 canary 계측 부팅에 걸리는 시간을 15초 이상 허용합니다.

1. **데이터 보존(Data retention)**에서 실패한 canary 실행과 성공한 canary 실행에 대한 정보를 보존할 기간을 지정합니다. 범위는 1\$1455일입니다.

   이 설정은 [GetCanaryRuns](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_GetCanaryRuns.html) 작업에서 반환하는 정보의 범위와 Synthetics 콘솔에 표시되는 정보의 범위에 영향을 줍니다.

   Amazon S3 버킷에 저장된 데이터나 canary에서 게시하는 로그 또는 지표에는 영향을 주지 않습니다.

   카나리의 데이터 보존 기간에 관계없이 콘솔에 표시되는 정보의 범위에는 특정 제한이 있습니다. Synthetics 콘솔 홈 보기에서 상대 및 절대 시간 범위는 7일로 제한됩니다. 특정 카나리에 대한 Synthetics 콘솔 보기에서 상대 시간 범위는 7일로 제한되고 절대 시간 범위는 30일로 제한됩니다.

1. **데이터 스토리지**에서 카나리 테스트 실행의 데이터를 저장하는 데 사용할 Amazon S3 버킷을 선택합니다. 버킷 이름은 마침표(.)를 포함할 수 없습니다. 이 값을 비워 두면 기본 Amazon S3 버킷이 사용 또는 생성됩니다.

1. (선택 사항) 기본적으로 canary는 Amazon S3에 아티팩트를 저장하고, 해당 아티팩트는 AWS 관리형 AWS KMS 키를 사용하여 저장 시 암호화됩니다. **데이터 스토리지(Data Storage)** 섹션의 **추가 구성(Additional configuration)**을 선택하여 다른 암호화 옵션을 사용할 수 있습니다. 그런 다음, 암호화에 사용할 키 유형을 선택할 수 있습니다. 자세한 내용은 [canary 아티팩트 암호화](CloudWatch_Synthetics_artifact_encryption.md) 섹션을 참조하세요.

1. [**액세스 권한(Access permissions)**]에서 canary를 실행할 IAM 역할을 생성할지 아니면 기존 역할을 사용할지 여부를 선택합니다.

   CloudWatch Synthetics에서 역할을 생성하도록 하면 필요한 모든 권한이 자동으로 포함됩니다. 역할을 직접 생성하는 경우 필요한 권한에 대한 내용은 [canary에 필요한 역할 및 권한](CloudWatch_Synthetics_Canaries_CanaryPermissions.md) 섹션을 참조하세요.

   canary를 생성할 때 CloudWatch 콘솔을 사용하여 canary에 대한 역할을 생성하는 경우 다른 canary에 대한 역할을 재사용할 수 없습니다. 이러한 역할은 하나의 canary에만 적용되기 때문입니다. 여러 canary에 사용할 수 있는 역할을 수동으로 생성한 경우에만 기존 역할을 사용할 수 있습니다.

   기존 역할을 사용하려면 해당 역할을 Synthetics 및 Lambda에 전달할 `iam:PassRole` 권한이 있어야 합니다. 또한 `iam:GetRole` 권한도 있어야 합니다.

1. (선택 사항) [**경보(Alarms)**]에서 이 canary에 대해 기본 CloudWatch 경보를 생성할지 여부를 선택합니다. 경보를 생성하기로 선택한 경우 경보는 `Synthetics-Alarm-canaryName -index `와 같은 이름 규칙으로 생성됩니다.

   `index`는 이 canary에 대해 생성된 각기 다른 경보를 나타내는 숫자입니다. 예를 들면 첫 번째 경보의 인덱스는 1이고 두 번째 경보의 인덱스는 2입니다.

1. (선택 사항) 이 canary가 VPC에 있는 엔드포인트를 테스트하도록 하려면 **VPC 설정**을 선택하고 다음을 수행합니다.

   1. 엔드포인트를 호스팅하는 VPC를 선택합니다.

   1. VPC에서 하나 이상의 서브넷을 선택합니다. 실행 중에 Lambda 인스턴스에 IP 주소를 할당할 수 없는 경우 퍼블릭 서브넷에서 Lambda 인스턴스를 실행하도록 구성할 수 없으므로 프라이빗 서브넷을 선택해야 합니다. 자세한 내용은 [VPC의 리소스에 액세스하도록 Lambda 함수 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html) 단원을 참조하세요.

   1. VPC에서 보안 그룹을 하나 이상 선택합니다.

   1. 이 카나리에 대해 아웃바운드 IPv6 트래픽을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택하세요. 그러면 카나리에서 IPv6 전용 및 IPv6에서 듀얼 스택 지원 엔드포인트를 모니터링할 수 있습니다.

      카나리 인터넷 액세스 권한을 부여하고 VPC 서브넷을 적절하게 구성하여 VPC 외부의 엔드포인트를 모니터링할 수 있습니다. 자세한 내용은 [VPC에서 canary 실행](CloudWatch_Synthetics_Canaries_VPC.md) 섹션을 참조하세요.

   엔드포인트가 VPC에 있는 경우 CloudWatch 및 Amazon S3에 정보를 보내도록 canary를 사용 설정해야 합니다. 자세한 내용은 [VPC에서 canary 실행](CloudWatch_Synthetics_Canaries_VPC.md) 단원을 참조하세요.

1. (선택 사항) **태그**에서 이 canary에 대한 태그로 하나 이상의 키-값 페어를 추가합니다. 태그를 사용하면 AWS 리소스를 식별 및 구성하고 AWS 비용을 추적할 수 있습니다. 자세한 내용은 [Amazon CloudWatch 리소스 태그 지정](CloudWatch-Tagging.md) 섹션을 참조하세요.

   카나리에 적용하는 태그를 카나리가 사용하는 Lambda 함수에도 적용하려면 **태그 복제**에서 **Lambda 함수**를 선택합니다. 이 옵션을 선택하면 CloudWatch Synthetics는 카나리와 Lambda 함수의 태그를 동기화된 상태로 유지합니다.
   + Synthetics는 여기에서 지정한 것과 동일한 태그를 카나리와 Lambda 함수 모두에 적용합니다.
   + 나중에 카나리의 태그를 업데이트하고 이 옵션을 선택된 상태로 유지하면 Synthetics는 Lambda 함수의 태그를 수정하여 카나리와 동기화된 상태를 유지합니다.

1. (선택 사항) [**활성 추적(Active tracing)**]에서 이 canary에 대해 활성 X-Ray 추적을 사용할지 여부를 선택합니다. 활성 추적은 Puppeteer 및 Java 런타임에만 사용할 수 있습니다. 자세한 내용은 [canary 및 X-Ray 추적](CloudWatch_Synthetics_Canaries_tracing.md) 섹션을 참조하세요.

## canary에 대해 생성되는 리소스
<a name="CloudWatch_Synthetics_Canaries_Resources_Created"></a>

canary를 생성할 때 다음 리소스가 생성됩니다.
+ 이름이 `CloudWatchSyntheticsRole-canary-name -uuid`인 IAM 역할(CloudWatch 콘솔을 사용하여 canary를 생성하고 canary에 대해 새 역할을 생성하도록 지정하는 경우)
+ 이름이 `CloudWatchSyntheticsPolicy- canary-name-uuid`인 IAM 정책
+ 이름이 `cw-syn-results-accountID -region`인 S3 버킷
+ 이름이 `Synthetics-Alarm-MyCanaryName`인 경보(canary에 대해 경보를 생성하려는 경우)
+ Lambda 함수 및 계층(블루프린트를 사용하여 canary를 생성하는 경우) 이러한 리소스에는 접두사 `cwsyn-MyCanaryName`이 있습니다.
+ 이름이 `/aws/lambda/cwsyn-MyCanaryName -randomId`인 CloudWatch Logs 로그 그룹

# canary 블루프린트 사용
<a name="CloudWatch_Synthetics_Canaries_Blueprints"></a>

이 섹션에서는 각 canary 블루프린트 및 각 블루프린트가 가장 적합한 작업에 대해 자세히 설명합니다. 다음과 같은 canary 유형에 대해 블루프린트가 제공됩니다.

**Topics**
+ [하트비트 모니터링](#CloudWatch_Synthetics_Canaries_Blueprints_Heartbeat)
+ [API canary](#CloudWatch_Synthetics_Canaries_Blueprints_API)
+ [잘못된 링크 검사기](#CloudWatch_Synthetics_Canaries_Blueprints_Broken_Links)
+ [시각적 모니터링 블루프린트](#CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting)
+ [canary 레코더](#CloudWatch_Synthetics_Canaries_Blueprints_Recorder)
+ [GUI 워크플로 빌더](#CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow)
+ [다중 검사 블루프린트](#CloudWatch_Synthetics_Canaries_Blueprints_Multichecks_Blueprint)
+ [다중 검사 블루프린트 카나리 생성](CloudWatch_Synthetics_Canaries_MultiCheck_Blueprint.md)

블루프린트를 사용하여 canary를 생성할 때 CloudWatch 콘솔에서 필드를 작성하면 페이지의 [**스크립트 편집기(Script editor)**] 영역에 생성 중인 canary가 Node.js 스크립트로 표시됩니다. 이 영역에서 canary를 편집하여 추가로 사용자 지정할 수도 있습니다.

## 하트비트 모니터링
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Heartbeat"></a>

하트비트 스크립트는 지정된 URL을 로드하고 페이지의 스크린샷과 HTTP 아카이브 파일(HAR 파일)을 저장합니다. 또한 액세스한 URL의 로그도 저장합니다.

HAR 파일을 사용하여 웹페이지에 대한 자세한 성능 데이터를 볼 수 있습니다. 웹 요청 목록을 분석하고 항목에 대한 로드 시간과 같은 성능 문제를 파악할 수 있습니다.

canary에서 `syn-nodejs-puppeteer-3.1` 이상의 런타임 버전을 사용하는 경우 하트비트 모니터링 블루프린트를 사용하여 여러 URL을 모니터링하고 canary 실행 보고서의 단계 요약에서 각 URL의 상태, 지속 시간, 관련 스크린샷, 실패 원인을 확인할 수 있습니다.

## API canary
<a name="CloudWatch_Synthetics_Canaries_Blueprints_API"></a>

API canary는 REST API의 기본 읽기 및 쓰기 기능을 테스트할 수 있습니다. REST는 *representational state transfer*의 약어로 개발자가 API를 생성할 때 따르는 일련의 규칙입니다. 이러한 규칙 중 하나에는 특정 URL에 대한 링크가 데이터 조각을 반환해야 한다고 명시되어 있습니다.

canary는 어느 API와도 함께 작동하며 모든 유형의 기능을 테스트할 수 있습니다. 각 canary는 여러 API를 호출할 수 있습니다.

런타임 버전 `syn-nodejs-2.2` 이상을 사용하는 canary에서 API canary 블루프린트는 API를 HTTP 단계로 모니터링하는 다단계 canary를 지원합니다. 단일 canary에서 여러 API를 테스트할 수 있습니다. 각 단계는 서로 다른 URL에 액세스하고 서로 다른 헤더를 사용하며 헤더 및 응답 본문을 캡처할지 여부에 대해 서로 다른 규칙을 사용할 수 있는 별도의 요청입니다. 헤더 및 응답 본문을 캡처하지 않음으로써 민감한 데이터가 기록되지 않도록 방지할 수 있습니다.

API canary의 각 요청은 다음 정보로 구성됩니다.
+ *엔드포인트*: 사용자가 요청하는 URL입니다.
+ *메서드*: 서버로 전송되는 요청의 유형입니다. REST API는 GET(읽기), POST(쓰기), PUT(업데이트), PATCH(업데이트) 및 DELETE(삭제) 작업을 지원합니다.
+ *헤더*: 클라이언트와 서버 모두에 정보를 제공합니다. 이는 인증 및 본문 내용에 대한 정보를 제공하는 데 사용됩니다. 유효한 헤더 목록은 [HTTP 헤더](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)를 참조하세요.
+ *데이터*(또는 *본문*): 서버에 전송할 정보가 포함되어 있습니다. 이는 POST, PUT, PATCH 또는 DELETE 요청에만 사용됩니다.

**참고**  
API 카나리 블루프린트는 Playwright 런타임에서 지원되지 않습니다.

API canary 블루프린트는 GET 및 POST 메서드를 지원합니다. 이 블루프린트를 사용할 때는 헤더를 지정해야 합니다. 예를 들어 **Authorization**을 **키**로 지정하고 필요한 인증 데이터를 해당 키의 **값**으로 지정할 수 있습니다.

POST 요청을 테스트하는 경우 **데이터** 필드에 게시할 콘텐츠도 지정합니다.

 **API Gateway와의 통합** 

API 블루프린트는 Amazon API Gateway와 통합됩니다. 이를 통해 API Gateway API를 선택하고 canary와 동일한 AWS 계정 및 리전에서 스테이징하거나 교차 계정 및 교차 리전 API 모니터링을 위해 API Gateway에서 Swagger 템플릿을 업로드할 수 있습니다. 그런 다음, Scratch에서 나머지 세부 정보를 입력하는 대신 콘솔에서 선택하여 canary를 생성할 수 있습니다. API Gateway에 대한 자세한 내용은 [Amazon API Gateway란?](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 단원을 참조하세요.

 **프라이빗 API 사용** 

Amazon API Gateway에서 프라이빗 API를 사용하는 canary를 생성할 수 있습니다. 자세한 내용은 [Amazon API Gateway에서 프라이빗 API 생성](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html)을 참조하세요.

## 잘못된 링크 검사기
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Broken_Links"></a>

잘못된 링크 검사기는 `document.getElementsByTagName('a')`을 사용하여 테스트 중인 URL 내부의 모든 링크를 수집합니다. 지정한 링크 수까지만 테스트하며, URL 자체가 첫 번째 링크로 계산됩니다. 예를 들어 5개의 링크가 포함된 페이지의 모든 링크를 검사하려면 canary가 6개의 링크를 따르도록 지정해야 합니다.

`syn-nodejs-2.0-beta` 런타임 이상을 사용하여 생성된 잘못된 링크 검사기 canary는 다음과 같은 추가 기능을 지원합니다.
+ 확인된 링크, 상태 코드, 실패 원인(있는 경우), 소스 및 대상 페이지 스크린샷이 포함된 보고서를 제공합니다.
+ canary 결과를 살펴볼 때 잘못된 링크만 표시하도록 필터링한 다음, 실패 원인을 기반으로 링크를 수정할 수 있습니다.
+ 이 버전은 각 링크에 대해 주석이 달린 소스 페이지 스크린샷을 캡처하고 링크가 발견된 앵커를 강조 표시합니다. 숨겨진 구성 요소에는 주석이 달려 있지 않습니다.
+ 소스 페이지와 대상 페이지 모두, 소스 페이지만 또는 대상 페이지만 스크린샷을 캡처하도록 이 버전을 구성할 수 있습니다.
+ 이 버전은 첫 페이지에서 더 많은 링크를 스크레이프한 경우에도 첫 번째 잘못된 링크 이후에 canary 스크립트가 중지되는 이전 버전의 문제를 수정합니다.

**참고**  
끊어진 링크 검사기 블루프린트는 Playwright 런타임에서 지원되지 않습니다.

`syn-1.0`을 사용하는 기존 카나리를 업데이트하여 새 런타임을 사용하려면 카나리를 삭제하고 다시 생성해야 합니다. 기존 canary를 새 런타임으로 업데이트해도 이러한 기능을 사용할 수는 없습니다.

잘못된 링크 검사기 canary는 다음과 같은 유형의 링크 오류를 감지합니다.
+ 404 페이지를 찾을 수 없음
+ 잘못된 호스트 이름
+ 잘못된 URL. 예를 들어 URL에 대괄호가 없거나 여분의 슬래시가 있거나 잘못된 프로토콜을 사용합니다.
+ 잘못된 HTTP 응답 코드
+ 호스트 서버가 콘텐츠가 없고 응답 코드가 없는 빈 응답을 반환합니다.
+ HTTP 요청은 canary 실행 중에 지속적으로 시간 초과됩니다.
+ 호스트가 잘못 구성되었거나 사용 중이므로 계속 연결이 끊어집니다.

## 시각적 모니터링 블루프린트
<a name="CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting"></a>

시각적 모니터링 블루프린트에는 canary 실행 중에 생성한 스크린샷과 기준 canary 실행 중에 생성한 스크린샷을 비교하는 코드가 포함되어 있습니다. 두 스크린샷 간의 불일치가 임계 백분율을 초과하면 canary가 실패합니다. 시각적 모니터링은 **syn-puppeteer-node-3.2** 이상을 실행하는 canary에서 지원됩니다. 현재 Python 및 Selenium을 실행하거나, Playwright 런타임을 사용하는 카나리에서는 지원되지 않습니다.

시각적 모니터링 블루프린트에는 시각적 모니터링을 사용 설정하는 기본 블루프린트 canary 스크립트에 다음 코드 줄이 포함되어 있습니다.

```
syntheticsConfiguration.withVisualCompareWithBaseRun(true);
```

이 줄을 스크립트에 추가한 후 canary가 처음 성공적으로 실행되면 해당 실행 중에 생성한 스크린샷을 비교를 위한 기준으로 사용합니다. 성공한 첫 번째 canary 실행 후 CloudWatch 콘솔을 사용하여 다음 중 하나를 수행하도록 canary를 편집할 수 있습니다.
+ canary의 다음 실행을 새 기준으로 설정합니다.
+ 현재 기준 스크린샷에 경계선을 그려서 시각적 비교 중에 무시할 스크린샷 영역을 지정합니다.
+ 스크린샷을 제거하여 시각적 모니터링에 사용되지 않도록 합니다.

CloudWatch 콘솔을 사용하여 canary를 편집하는 방법에 대한 자세한 내용은 [canary 편집 또는 삭제](synthetics_canaries_deletion.md) 단원을 참조하세요.

또한 ` nextrun` 또는 `lastrun` 파라미터를 사용하거나 [UpdateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html) API에서 canary 실행 ID를 지정하여 기준으로 사용되는 canary 실행을 변경할 수도 있습니다.

시각적 모니터링 청사진을 사용할 때 스크린샷을 생성할 URL을 입력하고 차이 임곗값을 백분율로 지정합니다. 기준 실행 후 해당 임곗값보다 큰 시각적 차이를 감지하는 canary의 향후 실행은 canary 실패를 트리거합니다. 기준 실행 후 canary를 편집하여 시각적 모니터링 중에 무시하려는 경계선을 기준 스크린샷에 ‘그릴’ 수도 있습니다.

시각적 모니터링 기능은 ImageMagick 오픈 소스 소프트웨어 도구 키트를 통해 제공됩니다. 자세한 내용은 [ImageMagick](https://imagemagick.org/index.php)을 참조하세요.

## canary 레코더
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Recorder"></a>

canary 레코더 블루프린트를 통해 CloudWatch Synthetics Recorder를 사용하여 웹 사이트에서의 클릭 및 입력 작업을 기록하고 동일한 단계를 따르는 canary를 생성하는 데 사용할 수 있는 Node.js 스크립트를 자동으로 생성할 수 있습니다. CloudWatch Synthetics Recorder는 Amazon에서 제공하는 Google Chrome 확장 프로그램입니다. 카나리 Recorder는 Playwright 런타임을 사용하는 카나리에서는 지원되지 않습니다.

**크레딧**: CloudWatch Synthetics Recorder는 [헤드리스 레코더](https://github.com/checkly/headless-recorder)를 기반으로 합니다.

자세한 내용은 [Google Chrome용 CloudWatch Synthetics Recorder 사용](CloudWatch_Synthetics_Canaries_Recorder.md) 단원을 참조하세요.

## GUI 워크플로 빌더
<a name="CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow"></a>

GUI 워크플로 빌더 블루프린트는 웹 페이지에서 작업을 수행할 수 있는지 확인합니다. 예를 들어 웹 페이지에 로그인 양식이 있는 경우 canary는 사용자 및 암호 필드를 채우고 양식을 제출하여 웹 페이지가 올바르게 작동하는지 확인할 수 있습니다.

블루프린트를 사용하여 이 유형의 canary를 생성할 때 웹 페이지에서 canary가 수행할 작업을 지정합니다. 사용할 수 있는 작업은 다음과 같습니다.
+ **클릭** - 지정된 요소를 선택하고, 요소를 클릭하거나 선택하는 사용자를 시뮬레이션합니다.

  Node.js 스크립트에서 요소를 지정하려면 `[id=]` 또는 ` a[class=]`를 사용합니다.

  Python 스크립트에서 요소를 지정하려면 `xpath //*[@id=]` 또는 ` //*[@class=]`를 사용합니다.
+ **선택기 확인** - 지정된 요소가 웹 페이지에 있는지 확인합니다. 이 테스트는 이전 작업으로 인해 올바른 요소가 페이지를 채우는지 확인하는 데 유용합니다.

  Node.js 스크립트에서 확인할 요소를 지정하려면 `[id=]` 또는 ` a[class=]`를 사용합니다.

  Python 스크립트에서 확인할 요소를 지정하려면 `xpath //*[@id=]` 또는 `//*[class=]`를 사용합니다.
+ **텍스트 확인** - 지정된 문자열이 대상 요소 내에 포함되어 있는지 확인합니다. 이 테스트는 이전 작업으로 인해 올바른 텍스트가 표시되는지 확인하는 데 유용합니다.

  Node.js 스크립트에서 요소를 지정하려면 ` div[@id=]//h1`과 같은 형식을 사용합니다. 이 작업은 Puppeteer의 `waitForXPath` 함수를 사용하기 때문입니다.

  Python 스크립트에서 요소를 지정하려면 ` //*[@id=] ` 또는 //\$1[@class=] 같은 xpath 형식을 사용합니다. 이 작업은 Selenium의 `implicitly_wait` 함수를 사용하기 때문입니다.
+ **텍스트 입력** - 대상 요소에 지정된 텍스트를 작성합니다.

  Node.js 스크립트에서 확인할 요소를 지정하려면 `[id=]` 또는 ` a[class=]`를 사용합니다.

  Python 스크립트에서 확인할 요소를 지정하려면 `xpath //*[@id=]` 또는 `//*[@class=]`를 사용합니다.
+ **탐색과 함께 클릭** - 지정된 요소를 선택한 후 전체 페이지가 로드될 때까지 기다립니다. 이는 페이지를 다시 로드해야 할 때 가장 유용합니다.

  Node.js 스크립트에서 요소를 지정하려면 `[id=]` 또는 ` a[class=]`를 사용합니다.

  Python 스크립트에서 요소를 지정하려면 `xpath //*[@id=]` 또는 ` //*[@class=]`를 사용합니다.

예를 들어 다음 블루프린트는 Node.js를 사용합니다. 지정된 URL의 **firstButton**을 클릭하고, 예상 텍스트가 있는 예상 선택기가 나타나는지 확인하고, **이름(Name)** 필드에 `Test_Customer`라고 이름을 입력합니다. **로그인(Login)** 버튼을 클릭한 후 다음 페이지에서 **시작(Welcome)** 텍스트가 표시되는지 확인하여 로그인이 성공했는지 확인합니다.

![\[GUI 워크플로우 블루프린트에 대한 필드가 채워져 있는 콘솔의 canary 생성 페이지.\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/images/canary_create_gui_workflow.PNG)


다음 런타임을 사용하는 GUI 워크플로 canary는 각 canary 실행에 대해 실행된 단계의 요약도 제공합니다. 각 단계와 관련된 스크린샷 및 오류 메시지를 사용하여 실패의 근본 원인을 찾을 수 있습니다.
+ `syn-nodejs-2.0` 이상
+ `syn-python-selenium-1.0` 이상

## 다중 검사 블루프린트
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Multichecks_Blueprint"></a>

다중 검사 블루프린트는 카나리 생성을 간소화합니다. HTTP, DNS, SSL, TCP 검사 수행에 즉시 사용 가능한 기능을 제공하는 간단한 JSON 구성을 사용하여 비용을 절감합니다. 최대 10가지 검사를 구성할 수 있습니다. 각 검사를 순차적으로 실행되는 숫자 단계로 구성하여 카나리 흐름을 명확하게 이해할 수 있도록 합니다.

다중 검사 블루프린트는 다음을 지원합니다.
+ 기본 HTTP 요청, TCP 요청, DNS 레코드 검증, SSL 인증서 모니터링
+ Secrets Manager와 통합된 Basic, API 키, OAuth, Sigv4 같은 HTTP 인증 방법
+ 각 검사에 대한 어설션

자세한 내용은 [canary 생성](CloudWatch_Synthetics_Canaries_Create.md) 섹션을 참조하세요.

# 다중 검사 블루프린트 카나리 생성
<a name="CloudWatch_Synthetics_Canaries_MultiCheck_Blueprint"></a>

Amazon CloudWatch Synthetics 다중 검사 블루프린트는 간단한 JSON 구성을 제공하여 Synthetics 카나리를 생성하는 데 도움이 됩니다. 최대 10가지 유형의 HTTP/DNS/SSL/TCP 검사를 단계에 기반한 순차적인 방식으로 번들링하여 비용을 절감할 수 있습니다. 각 검사에는 검사 결과에 대한 기본적인 확인을 제공하는 어설션이 포함됩니다.

다중 검사 카나리는 헤드리스 브라우저 없이 기본 검사만 실행하면 되는 간단한 사용 사례를 위해 고안된 것입니다. 더 복잡한 사용 사례의 경우 Amazon CloudWatch Synthetics에서 제공하는 다른 카나리 유형을 검토하세요.

**Topics**
+ [사전 조건](#CloudWatch_Synthetics_MultiCheck_Prerequisites)
+ [제한 사항](#CloudWatch_Synthetics_MultiCheck_Limitations)
+ [패키징 구조, JSON 스키마, 구성 설정](#CloudWatch_Synthetics_MultiCheck_Packaging)
+ [AWS Management Console에서 다중 검사 카나리 생성](#CloudWatch_Synthetics_MultiCheck_Console)
+ [AWS Synthetics API를 사용하여 다중 검사 카나리 생성](#CloudWatch_Synthetics_MultiCheck_API)
+ [CloudFormation에서 다중 검사 카나리 생성](#CloudWatch_Synthetics_MultiCheck_CloudFormation)
+ [인증 구성](#CloudWatch_Synthetics_MultiCheck_Authentication)
+ [문제 해결](#CloudWatch_Synthetics_MultiCheck_Troubleshooting)

## 사전 조건
<a name="CloudWatch_Synthetics_MultiCheck_Prerequisites"></a>
+ 다중 검사 카나리를 생성하려면 syn-nodejs-3.0\$1를 사용해야 합니다.
+ 인증 및 Secrets Manager 구성을 사용할 경우 카나리 [ExecutionRoleArn](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html)이 이러한 보안 암호에 액세스할 수 있는 권한을 허용하는지 확인해야 합니다.
+ Sigv4용 인증을 사용할 경우 카나리 [ExecutionRoleArn](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html)이 관련 역할에 액세스할 수 있는 권한을 허용하는지 확인해야 합니다.

## 제한 사항
<a name="CloudWatch_Synthetics_MultiCheck_Limitations"></a>
+ HTTP 응답 크기는 1MB를 초과할 수 없습니다.
+ 정의된 변수는 최대 10개입니다.
+ JSON RFC를 사용할 경우 Checks JSON에 중복 필드가 제공될 수도 있지만, 마지막 순차 필드만 사용됩니다.
+ AWS Management Console에서 다중 검사 카나리는 기본적으로 다중 검사 단계 지표를 표시하여 각 검사의 가용성을 쉽게 식별합니다. 검사가 제거된 경우에도 이 그래프는 지표가 최소 3시간 동안 활성 상태가 중지되지 않는 한 가용성 그래프에 검사가 계속 표시될 수 있습니다.

## 패키징 구조, JSON 스키마, 구성 설정
<a name="CloudWatch_Synthetics_MultiCheck_Packaging"></a>

카나리에 사용할 JSON 검사 구성의 이름은 ` blueprint-config.json`이어야 합니다. 구성은 [스키마](https://github.com/aws-samples/synthetics-canary-local-debugging-sample/tree/main)를 따르고 [Node.js 다중 검사 블루프린트에 대한 JSON 구성 작성](CloudWatch_Synthetics_WritingCanary_Multichecks.md)의 지침을 따라야 합니다.

`blueprint-config.json`을 ZIP 파일로 압축한 후 아래의 생성 워크플로 중 하나에 제공합니다. `synthetics.json` 구성이 있는 경우, 이 구성도 동일한 ZIP 파일에 압축됩니다. 다음은 `multi-checks.zip`이라는 zip 파일의 예제입니다.

```
multi-checks.zip
├── blueprint-config.json
└── synthetics.json
```

## AWS Management Console에서 다중 검사 카나리 생성
<a name="CloudWatch_Synthetics_MultiCheck_Console"></a>

1. Amazon CloudWatch Synthetics 콘솔을 엽니다.

1. **Create Canary(canary 생성)**를 선택합니다.

1. **블루프린트 사용**에서 **다중 검사**를 선택합니다.

   **구성 검사** 아래에 **검사** 및 **카나리 구성**이라는 탭 2개가 표시됩니다.

1. 런타임 버전 **syn-nodejs-3.0** 이상을 선택합니다.

1. [Node.js 다중 검사 블루프린트에 대한 JSON 구성 작성](CloudWatch_Synthetics_WritingCanary_Multichecks.md)에 의거한 절차에 따라 수행하려는 검사를 설명합니다. 또는 콘솔에서 사용자가 빌드할 수 있는 기본 JSON 구성을 제공하기도 합니다.

1. **Create Canary(canary 생성)**를 선택합니다.

## AWS Synthetics API를 사용하여 다중 검사 카나리 생성
<a name="CloudWatch_Synthetics_MultiCheck_API"></a>

`CreateCanary` API를 사용하고, `Code` 파라미터 내에서 ` Handler` 대신 필드/값 `BlueprintTypes="multi-checks"`를 입력합니다. `BlueprintTypes` 및 `Handler`를 모두 지정하면 `ValidationException`이 표시됩니다. 제공된 런타임 버전은 `syn-nodejs-3.0` 이상이어야 합니다.

```
aws synthetics create-canary \
    --name my-multi-check-canary \
    --code ZipFile="ZIP_BLOB",BlueprintTypes="multi-checks" \
    --runtime-version syn-nodejs-3.0 \
    ...

// Or if you wanted to use S3 to provide your code.

aws synthetics create-canary \
    --name my-multi-check-canary \
    --code S3Bucket="my-code-bucket",S3Key="my-zip-code-key",BlueprintTypes="multi-checks" \
    ...
```

## CloudFormation에서 다중 검사 카나리 생성
<a name="CloudWatch_Synthetics_MultiCheck_CloudFormation"></a>

다중 검사 카나리용 CloudFormation 템플릿의 `Code` 파라미터 내에서 ` Handler` 대신 필드/값 `BlueprintTypes="multi-checks"`를 제공합니다. `BlueprintTypes` 및 `Handler`를 모두 지정하면 `ValidationException`이 표시됩니다. 제공된 런타임 버전은 `syn-nodejs-3.0 or later`이어야 합니다.

템플릿 예제:

```
SyntheticsCanary:
    Type: 'AWS::Synthetics::Canary'
    Properties:
      Name: MyCanary
      RuntimeVersion: syn-nodejs-3.0
      Schedule: {Expression: 'rate(5 minutes)', DurationInSeconds: 3600}
      ...
      Code:
        S3Bucket: "my-code-bucket"
        S3Key: "my-zip-code-key"
        BlueprintTypes: ["multi-checks"]
      ...
```

## 인증 구성
<a name="CloudWatch_Synthetics_MultiCheck_Authentication"></a>

카나리가 인증된 엔드포인트에 HTTP 요청을 할 경우 기본, API 키, OAuth 클라이언트 자격 증명, SigV4라는 4가지 인증 유형 중 하나를 사용하도록 블루프린트 카나리의 단계를 구성할 수 있습니다. 요청 헤더를 직접 설정하는 대신 블루프린트 정의에서 인증 유형을 지정할 수 있으며, Synthetics는 지정된 인증 유형에 따라 HTTP 요청의 구성 요소를 제공된 인증 정보로 채웁니다.

인증 섹션을 사용하여 블루프린트 단계에서 인증 유형을 지정합니다. 사용할 인증 체계, 선택한 인증 체계에 필요한 속성을 지정하면 Synthetics에서는 제공된 정보를 사용하여 HTTP 요청에 대한 인증 헤더를 구성합니다.

보안 암호(예: 암호 또는 API 키)를 일반 텍스트로 저장하는 것은 보안 문제이므로, Synthetics에서는 AWS Secrets Manager와의 통합을 지원합니다. Synthetics 블루프린트 카나리에서 HTTP 요청을 인증하려는 경우 인증 정보를 저장하는 보안 암호를 참조할 수 있으며, Synthetics에서는 보안 암호를 검색한 후 이를 카나리에서 캐시 처리합니다. 이러한 접근 방식을 활용하면 보안 암호를 블루프린트 구성에 일반 텍스트로 지정하지 않고 안전하게 저장하면서, Synthetics에 보안 암호를 제공할 수 있습니다.

AWS Secrets Manager에 대한 자세한 내용은 [AWS Secrets Manager란 무엇입니까?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)를 참조하세요.

### 기본 인증
<a name="CloudWatch_Synthetics_MultiCheck_BasicAuth"></a>

Synthetics에서는 RFC 7617에 정의된 기본 HTTP 인증 체계를 구현합니다. 이 프로세스는 다음과 같이 작동합니다.
+ 사용자 이름과 암호 페어가 블루프린트 구성에서 제공됩니다.
+ 사용자 패스는 사용자 이름, 단일 콜론(":") 문자, 암호를 연결하여 생성됩니다.
+ 사용자 패스는 UTF-8로 인코딩된 다음, base64로 인코딩된 문자열로 변환됩니다.
+ base64로 인코딩된 이 사용자 패스는 'Authorization' 헤더에서 Authorization: Basic \$1base64-encoded-user-pass\$1 형식으로 제공됩니다.

예를 들어 사용자 에이전트가 사용자 ID 'Aladdin', 암호 'open sesame'를 전송하려는 경우, Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 헤더 필드가 사용됩니다.

구성 예제:

```
"Authentication": {
    "type": "BASIC",
    "username": MY_USERNAME, // Required
    "password": MY_PASSWORD // Required
}
```

### API 키 인증
<a name="CloudWatch_Synthetics_MultiCheck_APIKeyAuth"></a>

HTTP 요청을 인증하기 위한 API 키를 제공할 수 있습니다. API 키 인증을 사용하면 제공된 API 키가 'X-API-Key' HTTP 헤더에 입력됩니다. 이 헤더 이외의 헤더에서 API 키 헤더를 찾는 사용자 지정 리소스가 있을 경우, 사용자는 다른 헤더 이름을 지정하여 Synthetics가 API 키를 입력하도록 선택할 수 있습니다.

구성 예제:

```
"Authentication": {
    "type": "API_KEY",
    "apiKey": S0A1M2P3L4E5, // Required
    "header": X-Specific-Header // Optional, defaults to "X-API-Key"
}
```

### SigV4 인증
<a name="CloudWatch_Synthetics_MultiCheck_SigV4Auth"></a>

AWS SigV4(Signature Version 4)는 AWS API 요청에 인증 정보를 추가하기 위한 AWS 서명 프로토콜입니다. SigV4 인증 요청을 하려면 요청할 리전 및 서비스를 지정하고, 이 SigV4 요청을 할 때 카나리가 수임할 IAM 역할을 식별하는 ARN(AWS 리소스 이름)을 지정해야 합니다. Synthetics에서는 roleArn에 제공된 IAM 역할을 수임하며, 이를 사용하여 AWS API 요청을 인증합니다.

구성 예제:

```
"Authentication": {
    "type": "SIGV4",
    "region": us-west-2, // Required
    "service": s3, // Required
    "roleArn": arn:AWS:iam:12345678912:role/SampleRole // Required
}
```

#### SigV4 고려 사항
<a name="CloudWatch_Synthetics_MultiCheck_SigV4Considerations"></a>

Synthetics가 SigV4 인증 섹션에서 제공한 역할을 수임하려면, 제공된 roleArn을 카나리가 수임할 수 있도록 해당 역할에 연결된 신뢰 정책을 구성해야 합니다. 신뢰해야 하는 AWS 보안 주체는 카나리가 AWS STS를 통해 수임한 역할입니다. ` aws:sts::{account_running_the_canary}:assumed-role/<canary_name>/<assumed_role_name>` arn: 형식을 사용합니다.

예를 들어 계정 0123456789012에서 실행 중인 카나리가 test-카나리라는 이름이고 카나리-assume-role이라는 역할을 수임한 경우, 신뢰 정책에 이 문을 포함해야 해당 카나리가 SigV4 인증을 위한 roleArn을 올바르게 수임할 수 있습니다.

```
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:AWS:sts::123456789012:assumed-role/test-canary/"
    },
    "Action": "sts:AssumeRole"
}
```

### OAuth 클라이언트 자격 증명
<a name="CloudWatch_Synthetics_MultiCheck_OAuthAuth"></a>

Synthetics에서는 RFC 6479 섹션 4.4에 정의된 OAuth 클라이언트 자격 증명 권한 부여 유형을 구현합니다. OAuth 토큰 엔드포인트에서 발급한 소유자 토큰으로 인증된 엔드포인트에 HTTP 요청을 하려는 경우, Synthetics에서는 소유자 토큰을 자동으로 요청하고 관리할 수 있습니다. OAuth 체계를 사용하는 경우 Synthetics에서는 다음 단계를 수행합니다.
+ clientId 및 clientSecret과 함께 기본 인증 체계를 사용하여 소유자 토큰을 발급하는 엔드포인트인 tokenUrl에 대한 요청을 인증합니다.
+ 사용자가 선택적 범위, 대상, 리소스 파라미터를 제공할 경우 이는 토큰 요청에 포함됩니다.
+ tokenUrl에서 반환한 액세스 토큰을 사용하여 HTTP 요청을 인증합니다.
+ 향후 토큰 요청을 위해 tokenUrl에서 반환된 새로 고침 토큰을 안전하게 저장합니다.

구성 예제:

```
"Authentication": {
    "type": "OAUTH_CLIENT_CREDENTIALS",
    "tokenUrl": ..., // Required
    "clientId": ..., // Required
    "clientSecret": ..., // Required
    "scope": ..., // Optional
    "audience": ..., // Optional
    "resource": ..., // Optional
}
```

#### OAuth 고려 사항
<a name="CloudWatch_Synthetics_MultiCheck_OAuthConsiderations"></a>

401 또는 407 응답이 반환되면 Synthetics에서는 OAuth 토큰을 새로 고칩니다.

### AWS Secrets Manager 통합
<a name="CloudWatch_Synthetics_MultiCheck_SecretsManager"></a>

보안 암호 값(예: 암호 또는 API 키)을 일반 텍스트로 저장하는 것을 방지하기 위해 Synthetics에서는 AWS Secrets Manager와 통합할 수 있는 기능을 제공합니다. 블루프린트 구성의 전체 보안 암호 값을 ` ${aws_SECRET:<secret_name>}` 형식으로 참조하거나, 특정 키 ` ${aws_SECRET:<secret_name>:<secret_key>}`를 참조할 수 있습니다.

예를 들어 login/basic-auth-credentials라는 보안 암호가 있는 경우, 다음과 같은 JSON 구조의 사용자 이름과 암호가 저장됩니다.

```
{
    "username": "Aladdin",
    "password": "open sesame"
}
```

블루프린트 구성의 사용자 이름과 암호를 다음과 같이 참조할 수 있으며, Synthetics에서는 보안 암호 값 검색 및 키 사용을 처리하여 요청을 인증합니다.

```
"Authentication": {
    "type": "BASIC",
    "username": ${AWS_SECRET:login/basic-auth-credentials:username},
    "password": ${AWS_SECRET:login/basic-auth-credentials:password}
}
```

Synthetics가 지정된 보안 암호를 검색하도록 허용하려면 카나리가 수임한 역할 ARN에 secretsManager:GetSecretValue 권한이 있어야 합니다. AWS 관리형 키 AWS/secretsmanager 대신 고객 관리형 키를 사용하여 보안 암호를 암호화할 경우, 해당 키에 대한 kms:Decrypt 권한도 필요합니다.

권한 예제:

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:AWS:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
        },
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:AWS:kms:us-east-1:123456789012:key/key-id"
        }
    ]
}
```

## 문제 해결
<a name="CloudWatch_Synthetics_MultiCheck_Troubleshooting"></a>

### 일반적인 문제 해결 실패
<a name="CloudWatch_Synthetics_MultiCheck_Common_Failures"></a>

다중 검사 블루프린트의 기본 코드는 Typescript로 작성됩니다. 일반적인 실패에 대한 내용은 카나리 문제 해결 페이지 [실패한 카나리 문제 해결](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Troubleshoot.html)을 참조하세요.

### JSON 검사 구성 구문 오류
<a name="CloudWatch_Synthetics_MultiCheck_JSON_Errors"></a>

카나리의 JSON 검사 구성과 관련된 구문 오류가 있는 경우, 카나리 생성을 시도하면 AWS Management Console에서 실패 이유가 표시됩니다. API 또는 CloudFormation을 사용하여 카나리를 생성할 경우에는 카나리를 처음 실행하면 실패한 것으로 표시됩니다. 다중 검사 카나리에는 안전한 카나리 업데이트 워크플로를 사용하는 것이 좋습니다. 자세한 내용은 [안전한 카나리 업데이트 수행](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/performing-safe-canary-upgrades.html)을 참조하세요.

### 네트워킹 또는 제한 시간 실패
<a name="CloudWatch_Synthetics_MultiCheck_Network_Failures"></a>

제한 시간, 네트워크 연결 실패(예: ENOTFOUND, ECONNRESET)와 관련하여 간헐적이거나 일관된 실패가 발생할 경우, ` DEBUG` 로그를 켜서 다음 실행 시 검사가 실패하는 이유에 대한 추가 세부 정보를 확인하는 것이 좋습니다. 이렇게 하려면 환경 변수 CW\$1SYNTHETICS\$1LOG\$1LEVEL: "DEBUG"를 제공합니다.

디버그할 수 없는 실패가 지속될 경우 AWS Support에 문의하거나, CloudWatch Synthetics에서 제공하는 다른 카나리 유형 중에서 해당 사용 사례에 더 알맞은 유형이 있는지 확인하는 것이 좋습니다.

# Google Chrome용 CloudWatch Synthetics Recorder 사용
<a name="CloudWatch_Synthetics_Canaries_Recorder"></a>

Amazon은 canary를 더욱 쉽게 ​​생성할 수 있도록 지원하기 위해 CloudWatch Synthetics Recorder를 제공합니다. 레코더는 Google Chrome 확장 프로그램입니다.

레코더는 웹 사이트에서의 클릭 및 입력 작업을 기록하고 동일한 단계를 따르는 canary를 생성하는 데 사용할 수 있는 Node.js 스크립트를 자동으로 생성합니다.

기록을 시작하면 CloudWatch Synthetics Recorder가 브라우저에서의 작업을 감지하고 이를 스크립트로 변환합니다. 필요에 따라 기록을 일시 중지하고 다시 시작할 수 있습니다. 기록을 중지하면 레코더가 작업에 대해 Node.js 스크립트를 생성합니다. [**클립보드에 복사(Copy to Clipboard)**] 버튼을 사용하면 이 스크립트를 쉽게 복사할 수 있습니다. 그런 다음, 이 스크립트를 사용하여 CloudWatch Synthetics에서 canary를 생성할 수 있습니다.

**크레딧**: CloudWatch Synthetics Recorder는 [헤드리스 레코더](https://github.com/checkly/headless-recorder)를 기반으로 합니다.

## Google Chrome용 CloudWatch Synthetics Recorder 확장 프로그램 설치
<a name="CloudWatch_Synthetics_Canaries_Recorder-install"></a>

CloudWatch Synthetics Recorder를 사용하려면 canary 생성을 시작하고 **canary 레코더(Canary Recorder)** 블루프린트를 선택하면 됩니다. 레코더를 아직 다운로드하지 않았을 때 이 작업을 수행하면 CloudWatch Synthetics 콘솔에서 레코더 다운로드 링크를 제공합니다.

또는 다음 단계에 따라 레코더를 직접 다운로드하여 설치할 수 있습니다.

**CloudWatch Synthetics Recorder를 설치하려면**

1. Google Chrome을 사용하여 다음 웹 사이트로 이동합니다. [https://chrome.google.com/webstore/detail/cloudwatch-synthetics-rec/bhdnlmmgiplmbcdmkkdfplenecpegfno ](https://chrome.google.com/webstore/detail/cloudwatch-synthetics-rec/bhdnlmmgiplmbcdmkkdfplenecpegfno)

1. [**Chrome에 추가(Add to Chrome)**]를 선택한 다음, [**확장 프로그램 추가(Add extension)**]를 선택합니다.

## Google Chrome용 CloudWatch Synthetics Recorder 사용
<a name="CloudWatch_Synthetics_Canaries_Recorder-using"></a>

CloudWatch Synthetics Recorder를 사용하여 canary를 생성하려면 CloudWatch 콘솔에서 **canary 생성(Create canary)**을 선택한 다음, **블루프린트 사용(Use a blueprint)**에서 **canary 레코더(Canary Recorder)**를 선택하면 됩니다. 자세한 내용은 [canary 생성](CloudWatch_Synthetics_Canaries_Create.md) 단원을 참조하세요.

또는 레코더를 사용하여 canary를 생성하는 데 단계를 즉시 사용하지 않고 기록만 할 수도 있습니다.

**CloudWatch Synthetics Recorder를 사용하여 웹 사이트 작업 기록**

1. 모니터링하려는 페이지로 이동합니다.

1. Chrome 확장 프로그램 아이콘을 선택한 다음, [**CloudWatch Synthetics Recorder**]를 선택합니다.

1. [**기록 시작(Start Recording)**]을 선택합니다.

1. 기록하려는 단계를 수행합니다. 기록을 일시 중지하려면 **일시 중지**를 선택합니다.

1. 워크플로 기록을 마쳤으면 [**기록 중지(Stop recording)**]를 선택합니다.

1. [**클립보드에 복사(Copy to clipboard)**]를 선택하여 생성된 스크립트를 클립보드에 복사합니다. 또는 다시 시작하려면 [**새 기록(New recording)**]을 선택합니다.

1. 복사한 스크립트를 사용하여 canary를 생성하려면 복사한 스크립트를 레코더 블루프린트 인라인 편집기에 붙여넣거나 Amazon S3 버킷에 저장하고 거기에서 가져오면 됩니다.

1. canary를 즉시 생성하지 않을 경우 기록된 스크립트를 파일에 저장할 수 있습니다.

## CloudWatch Synthetics Recorder의 알려진 제한 사항
<a name="CloudWatch_Synthetics_Canaries_Recorder-limitations"></a>

Google Chrome용 CloudWatch Synthetics Recorder에는 현재 다음과 같은 제한 사항이 있습니다.
+ ID가 없는 HTML 요소는 CSS 선택기를 사용합니다. 이러면 나중에 웹 페이지 구조가 변경되는 경우 canary가 손상될 수 있습니다. 향후 레코더 버전에서 이와 관련된 몇 가지 구성 옵션(예: data-id 사용)을 제공할 계획입니다.
+ 레코더는 두 번 클릭 또는 복사/붙여넣기와 같은 작업을 지원하지 않으며 CMD\$10과 같은 키 조합을 지원하지 않습니다.
+ 페이지에 요소 또는 텍스트가 있는지 확인하려면 스크립트가 생성된 후 사용자가 어설션을 추가해야 합니다. 레코더는 요소 확인을 지원하지 않으며 해당 요소에 대한 어떠한 작업도 수행하지 않습니다. 이는 canary 워크플로 빌더의 ‘텍스트 확인’ 또는 ‘요소 확인’ 옵션과 유사합니다. 향후 레코더 버전에서 일부 어설션 지원을 추가할 계획입니다.
+ 레코더는 기록이 시작된 탭의 모든 작업을 기록합니다. 팝업(예: 위치 추적 허용) 또는 팝업에서 다른 페이지로의 이동을 기록하지 않습니다.

# Synthetics 런타임 버전
<a name="CloudWatch_Synthetics_Canaries_Library"></a>

canary를 생성하거나 업데이트하는 경우 canary에 대한 Synthetics 런타임 버전을 선택합니다. Synthetics 런타임은 스크립트 핸들러를 호출하는 Synthetics 코드와 Lambda 번들 종속성 계층의 조합입니다.

CloudWatch Synthetics는 현재 Node.js, Python 또는 Java 언어를 사용하는 런타임을 지원합니다. 지원되는 프레임워크는 Puppeteer, Playwright 및 Selenium입니다.

최신 기능과 Synthetics 라이브러리 업데이트를 사용하도록 canary에 항상 최신 런타임 버전을 사용하는 것이 좋습니다.

**주의 사항**: 새 버전의 Synthetics 런타임을 사용하도록 카나리를 실행할 때마다 카나리에서 사용하는 모든 Synthetics 라이브러리 함수도 Synthetics 런타임이 지원하는 것과 동일한 버전의 NodeJS로 자동 이전됩니다.

**Topics**
+ [Java를 사용하는 런타임 버전](CloudWatch_Synthetics_Library_Java.md)
+ [Node.js 및 Playwright을 사용하는 런타임 버전](CloudWatch_Synthetics_Library_nodejs_playwright.md)
+ [Node.js 및 Puppeteer를 사용하는 런타임 버전](CloudWatch_Synthetics_Library_nodejs_puppeteer.md)
+ [Python 및 Selenium Webdriver를 사용하는 런타임 버전](CloudWatch_Synthetics_Library_python_selenium.md)
+ [Node.js를 사용하는 런타임 버전](CloudWatch_Synthetics_Library_Nodejs.md)
+ [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md)
+ [런타임 버전 업데이트](CloudWatch_Synthetics_Runtime_Version_Update.md)

# Java를 사용하는 런타임 버전
<a name="CloudWatch_Synthetics_Library_Java"></a>

다음 섹션에는 Java용 CloudWatch Synthetics 런타임 버전에 관한 정보가 포함되어 있습니다. 이 런타임에는 브라우저 또는 프레임워크가 포함되어 있지 않습니다.

이러한 런타임 버전의 명명 규칙은 `syn-language -majorversion.minorversion`입니다.

## syn-java-1.0
<a name="Synthetics_runtimeversion-syn-java-1.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Java 21

 **Features** 
+ *CloudWatch Logs 통합* - CloudWatch Synthetics 콘솔을 통해 로그를 쿼리하고 필터링할 수 있습니다. 각 로그 메시지에는 고유한 ` canaryRunId`가 포함되어 있으므로, 특정한 카나리 실행에 대한 로그를 쉽게 검색할 수 있습니다.
+ *지표* - CloudWatch 지표를 통해 카나리 실행 성공률 및 기간을 모니터링할 수 있습니다. 카나리에서 문제를 감지할 때 알림을 보내도록 경보를 구성할 수도 있습니다.
+ *카나리 아티팩트* - 각 카나리 실행은 Amazon S3를 통해 액세스할 수 있는 실행 및 실행 내 단계에 해당하는 세부 보고서를 업로드합니다.
+ *트레이스 지원* - X-Ray를 통해 카나리에서 수행한 모든 요청에 대해 트레이스를 내보낼 수 있습니다. 각 카나리 실행은 트레이스 ID 1개와 연결됩니다.

# Node.js 및 Playwright을 사용하는 런타임 버전
<a name="CloudWatch_Synthetics_Library_nodejs_playwright"></a>

다음 섹션에는 Node.js 및 Playwright용 CloudWatch Synthetics 런타임 버전에 관한 정보가 포함되어 있습니다. Playwright은 브라우저 테스트를 위한 오픈 소스 자동화 라이브러리입니다. Playwright에 대한 자세한 내용은 [https://playwright.dev/](https://playwright.dev)를 참조하세요.

이러한 런타임 버전의 명명 규칙은 `syn-language -framework-majorversion. minorversion`입니다.

## syn-nodejs-playwright-6.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-6.0"></a>

**중요**  
Synthetics `syn-nodejs-playwright-5.1` 이상부터 Synthetics 런타임은 새 네임스페이스를 사용합니다. 새 네임스페이스를 사용하려면 카나리 스크립트를 마이그레이션하세요. 레거시 네임스페이스는 향후 릴리스에서 더 이상 사용되지 않습니다.  
@amzn/synthetics-playwright → @aws/synthetics-playwright

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 22.x
+ Playwright 버전 1.58.2
+ Playwright/테스트 버전 1.58.2
+ Chromium 버전 145.0.7632.77
+ Firefox 버전 146.0.1

 **syn-nodejs-playwright-6.0의 변경 사항** 
+ 보안 패치를 적용하고 Playwright 및 브라우저 버전을 업데이트했습니다.

자세한 내용은 다음을 참조하세요.
+  [Playwright 변경 로그 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 참조](https://playwright.dev/docs/api/class-playwright) 

## Node.js 및 Playwright의 이전 런타임 버전
<a name="Previousversions-nodejs-playwright"></a>

Node.js 및 Playwright의 다음과 같은 이전 런타임 버전은 여전히 지원됩니다.

### syn-nodejs-playwright-5.1
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-5.1"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 22.x
+ Playwright 버전 1.57.0
+ Playwright/테스트 버전 1.57.0
+ Chromium 버전 143.0.7499.169
+ Firefox 버전 142.0.1

 **syn-nodejs-playwright-5.1의 변경 사항** 
+ Synthetics 런타임 네임스페이스 마이그레이션.
+ 유형 정의는 [npm 레지스트리](https://www.npmjs.com/package/@aws/synthetics-playwright)에서 사용할 수 있습니다. 유형 정의 패키지 버전이 카나리의 런타임 버전과 일치하는지 확인하세요.

자세한 내용은 다음을 참조하세요.
+  [Playwright 변경 로그 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 참조](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-5.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-5.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 22.x
+ Playwright 버전 1.57.0
+ Playwright/테스트 버전 1.57.0
+ Chromium 버전 143.0.7499.4
+ Firefox 버전 142.0.1

 **syn-nodejs-playwright-5.0의 변경 사항** 
+ 보안 패치를 적용하고 Playwright 및 브라우저 버전을 업데이트했습니다.

자세한 내용은 다음을 참조하세요.
+  [Playwright 변경 로그 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 참조](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-4.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-4.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 22.x
+ Playwright 버전 1.55.0
+ Playwright/테스트 버전 1.55.0
+ Chromium 버전 140.0.7339.16
+ Firefox 버전 141.0

 **syn-nodejs-playwright-4.0의 변경 사항** 
+ 보안 패치를 적용하고 Playwright 및 브라우저 버전을 업데이트했습니다.

자세한 내용은 다음을 참조하세요.
+  [Playwright 변경 로그 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 참조](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-3.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-3.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 20.x
+ Playwright 버전 1.53.0
+ Playwright/테스트 버전 1.53.0
+ Chromium 버전 138.0.7204.168

 **syn-nodejs-playwright-3.0의 변경 사항** 
+ 다중 브라우저 지원 - 이제 Firefox 또는 Chrome에서 nodejs puppeteer 카나리를 실행할 수 있습니다.
+ 시각적 모니터링에 대한 지원

자세한 내용은 다음을 참조하세요.
+  [Playwright 변경 로그 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 참조](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-2.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-2.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 20.x
+ Playwright 버전1.49.1
+ Playwright/테스트 버전 1.49.1
+ Chromium 버전 131.0.6778.264

 **syn-nodejs-playwright-2.0의 변경 사항** 
+ HAR 파일의 주어진 요청에 대한 총 기간과 타이밍 합계 간 불일치가 수정되었습니다.
+ 카나리에 대한 모의 실행을 지원하여 임시 실행을 허용하거나 안전한 카나리 업데이트를 수행할 수 있습니다.

자세한 내용은 다음을 참조하세요.
+  [Playwright 변경 로그 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 참조](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-1.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-1.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 20.x
+ Playwright 버전 1.44.1
+ Playwright/테스트 버전 1.44.1
+ Chromium 버전 126.0.6478.126

**기능:**
+ **PlayWright 지원** - Playwright 자동화 프레임워크를 사용하여 카나리 스크립트를 작성할 수 있습니다. 기존 Playwright 스크립트를 카나리로 실행하도록 가져오고, AWS 모니터링 기능을 통해 개선할 수 있습니다.
+ **CloudWatch Logs 통합** - CloudWatch Synthetics 콘솔을 통해 로그를 쿼리하고 필터링할 수 있습니다. 각 로그 메시지에는 고유한 `canaryRunId`가 포함되어 있으므로, 특정한 카나리 실행에 대한 로그를 쉽게 검색할 수 있습니다.
+ **지표 및 카나리 아티팩트** - CloudWatch 지표를 통해 카나리 실행 통과율을 모니터링하고, 카나리가 문제를 감지할 때 알림을 보내도록 경보를 구성할 수 있습니다.
+ **스크린샷 및 단계 연결** - 네이티브 Playwright 기능을 사용해 스크린샷을 캡처하여 각 실행에서 카나리 스크립트의 단계를 시각화할 수 있습니다. 스크린샷은 카나리 단계와 자동으로 연결되며, Amazon S3 버킷에 업로드됩니다.
+ **다중 탭** - 여러 브라우저 탭을 여는 카나리를 생성하고, 각 탭에서 스크린샷에 액세스할 수 있습니다. Synthetics에서 다중 탭 및 다단계 사용자 워크플로를 생성할 수 있습니다.

# Node.js 및 Puppeteer를 사용하는 런타임 버전
<a name="CloudWatch_Synthetics_Library_nodejs_puppeteer"></a>

Node.js 및 Puppeteer의 첫 번째 런타임 버전 이름은 `syn-1.0`이었습니다. 이후의 런타임 버전에는 `syn-language -majorversion.minorversion`이라는 명명 규칙이 있습니다. `syn-nodejs-puppeteer-3.0`부터 명명 규칙은 `syn- language-framework-majorversion .minorversion`입니다.

추가 `-beta` 접미사는 런타임 버전이 현재 베타 평가판 릴리스임을 보여 줍니다.

메이저 버전 번호가 동일한 런타임 버전은 이전 버전과 호환됩니다.

canary의 Lambda 코드는 최대 1GB의 메모리를 갖도록 구성됩니다. 구성된 시간 초과 값 후에 각 canary 실행 시간이 초과됩니다. 카나리에 대한 시간 제한 값이 지정되지 않은 경우 CloudWatch는 카나리의 빈도에 따라 시간 제한 값을 선택합니다. 시간 초과 값을 구성하는 경우, Lambda 콜드 스타트와 canary 계측 부팅에 걸리는 시간을 15초 이상 허용하세요.

## syn-nodejs-puppeteer-15.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-15.0"></a>

`syn-nodejs-puppeteer-15.0`은 Node.js 및 Puppeteer에 대한 최신 Synthetics 런타임입니다.

**중요**  
Synthetics `syn-nodejs-puppeteer-13.1` 이상부터 Synthetics 런타임은 새 네임스페이스를 사용합니다. 새 네임스페이스를 사용하려면 카나리 스크립트를 마이그레이션하세요. 레거시 네임스페이스는 향후 릴리스에서 더 이상 사용되지 않습니다.  
Synthetics → @aws/synthetics-puppeteer
SyntheticsLink → @aws/synthetics-link
SyntheticsLogger → @aws/synthetics-logger
SyntheticsLogHelper → @aws/synthetics-log-helper
BrokenLinkCheckerReport → @aws/synthetics-broken-link-checker-report

**중요**  
Synthetics 런타임 `syn-nodejs-puppeteer-11.0` 이상 버전은 다음 단계 수준 구성 재정의만 지원합니다.  
 `screenshotOnStepStart` 
 `screenshotOnStepSuccess` 
 `screenshotOnStepFailure` 
 `stepSuccessMetric` 
 `stepDurationMetric` 
 `continueOnStepFailure/continueOnHttpStepFailure` 
 `stepsReport` 

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG#24375-2026-02-19) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.37.5/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 22.x
+ Puppeteer-core 버전 24.37.5
+ Chromium 버전 145.0.7632.77
+ Firefox 버전 147.0.4

 **syn-nodejs-puppeteer-15.0의 변경 사항** 
+ 보안 패치를 적용하고 Puppeteer 및 브라우저 버전을 업데이트했습니다.
+ continueOnHttpStepFailure가 적용되지 않아 HTTP 단계 실패가 발생하더라도 카나리 실행이 성공한 것으로 잘못 표시되는 버그를 수정했습니다.

## Node.js 및 Puppeteer의 이전 런타임 버전
<a name="Previousversions-nodejs-puppeteer"></a>

Node.js 및 Puppeteer의 다음과 같은 이전 런타임 버전은 여전히 지원됩니다.

### syn-nodejs-puppeteer-14.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-14.0"></a>

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG#24340-2025-12-19) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.34.0/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 22.x
+ Puppeteer-core 버전 24.34.0
+ Chromium 버전 143.0.7499.169
+ Firefox 버전 146.x

 **syn-nodejs-puppeteer-14.0의 변경 사항** 
+ 보안 패치를 적용하고 Puppeteer 및 브라우저 버전을 업데이트했습니다.

### syn-nodejs-puppeteer-13.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-13.1"></a>

`syn-nodejs-puppeteer-13.1`은 Node.js 및 Puppeteer에 대한 최신 Synthetics 런타임입니다.

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG#24250-2025-10-15) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 22.x
+ Puppeteer-core 버전 24.25.0
+ Chromium 버전 142.0.7444.175
+ Firefox 버전 145.x

 **syn-nodejs-puppeteer-13.1의 변경 사항** 
+ Synthetics 런타임 네임스페이스 마이그레이션.
+ 유형 정의는 npm 레지스트리에서 사용할 수 있습니다. 유형 정의 패키지 버전이 카나리의 런타임 버전과 일치하는지 확인하세요.
  +  [ @aws/synthetics-puppeteer](https://www.npmjs.com/package/@aws/synthetics-puppeteer) 
  +  [ @aws/synthetics-link](https://www.npmjs.com/package/@aws/synthetics-link) 
  +  [ @aws/synthetics-broken-link-checker-report](https://www.npmjs.com/package/@aws/synthetics-broken-link-checker-report) 
  +  [ @aws/synthetics-log-helper](https://www.npmjs.com/package/@aws/synthetics-log-helper) 
  +  [ @aws/synthetics-logger](https://www.npmjs.com/package/@aws/synthetics-logger) 

### syn-nodejs-puppeteer-13.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-13.0"></a>

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG#24250-2025-10-15) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 22.x
+ Puppeteer-core 버전 24.25.0
+ Chromium 버전 142.0.7444.175
+ Firefox 버전 145.x

 **syn-nodejs-puppeteer-13.0의 변경 사항** 
+ 보안 패치를 적용하고 Puppeteer 및 브라우저 버전을 업데이트했습니다.
+ 버그 수정 - 동시 맵 액세스로 인한 간헐적인 런타임 확장 충돌 문제를 수정했습니다.

### syn-nodejs-puppeteer-12.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-12.0"></a>

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG#24221-2025-09-23) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.22.1/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 22.x
+ Puppeteer-core 버전 24.22.1
+ Chromium 버전 140.0.7339.185
+ Firefox 버전 143.0.1

 **syn-nodejs-puppeteer-12.0의 변경 사항** 
+ 보안 패치를 적용하고 Puppeteer 및 브라우저 버전을 업데이트했습니다.
+ 제한된 헤더 수정에 대한 버그 수정 - 일부 상황에서 제한된 헤더가 executeHttpStep()에서 수정되지 않는 문제를 수정했습니다. 이제 동작이 Puppeteer 10.0과 일치합니다.
+ includeResponseBody 구성에 대한 버그 수정 - 특정 상황에서 HAR 파일 생성 시 includeResponseBody 구성 설정이 잘못 적용될 수 있는 문제를 수정했습니다. 이제 HAR에서는 설정 구성 시 응답 본문을 제외합니다.
+ 요청 캡처 수명 주기 수정 - 일부 상황에서 HTTP 요청 캡처 도구가 요청을 지속적으로 집계하게 될 수 있는 문제를 수정했습니다. 이제 각 단계 실행 후 레코딩이 올바르게 종료됩니다.

### syn-nodejs-puppeteer-11.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-11.0"></a>

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 20.x
+ Puppeteer-core 버전 24.15.0
+ Chromium 버전 138.0.7204.168

 **syn-nodejs-puppeteer-11.0의 변경 사항** 
+ 다중 브라우저 지원 - 이제 Firefox 또는 Chrome에서 Node.js Puppeteer 카나리를 실행할 수 있습니다.
+ 간소화된 패키징 - Node.js/node\$1modules 디렉터리 구조를 사용하지 않고 루트 바로 아래에 스크립트를 패키징합니다.
+ 스크린샷 통합 - 기본 Puppeteer 함수로 스크린샷을 캡처하여 카나리 스크립트 단계를 시각화합니다. Synthetics는 스크린샷을 카나리 단계와 자동으로 연결하고 Amazon S3에 업로드합니다.
+ 향상된 로그 쿼리 - CloudWatch Insights 콘솔을 통해 로그를 쿼리하고 필터링합니다. 각 로그 메시지에는 더 쉽게 검색할 수 있도록 고유한 `canaryRunId`가 포함되어 있습니다.
+ 구성 파일 지원 - synthetics.json 파일을 사용하여 Synthetics 설정을 정의하고 업데이트합니다. 스크립트 로직과 구성을 분리하면 유지 관리 및 재사용성이 향상됩니다.
+ 다중 탭 지원 - 여러 브라우저 탭을 여는 카나리를 생성하고 각 탭에서 스크린샷에 액세스합니다. Synthetics에서 다중 탭 및 다단계 사용자 워크플로 빌드
+ 보안 수정
+ 시각적 모니터링 버그 수정
+ 구성 가능한 로그 수준의 구조화된 JSON 로깅에 대한 지원 추가 - 이제 CloudWatch에서 보다 쉽게 구문 분석하고 쿼리하도록 로그를 JSON 형식으로 내보냅니다. 사용자가 필요에 따라 상세 수준을 제어할 수 있도록 환경 변수를 통해 로그 수준(예: 디버그, 정보, 추적)을 구성할 수 있습니다.
+ ES 구문에 대한 지원

### syn-nodejs-puppeteer-10.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-10.0"></a>

자세한 내용은 다음을 참조하세요.
+  [Puppeteer 변경 로그](https://pptr.dev/CHANGELOG) 
+  [Puppeteer API 참조](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**주요 종속 항목**:
+ Lambda 런타임 Node.js 20.x
+ Puppeteer-core 버전 24.2.0
+ Chromium 버전 131.0.6778.264

 **syn-nodejs-puppeteer-10.0의 변경 사항** 
+ 지나치게 오래 걸렸던 브라우저 닫기와 관련된 버그가 수정되었습니다.
+ 카나리에 대한 모의 실행을 지원하여 임시 실행을 허용하거나 안전한 카나리 업데이트를 수행할 수 있습니다.

### syn-nodejs-puppeteer-9.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.1"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 20.x
+ Puppeteer-core 버전 22.12.1
+ Chromium 버전 126.0.6478.126

**syn-nodejs-puppeteer-9.1의 변경 사항** - HAR 파일의 날짜 범위 및 보류 상태의 요청과 관련된 버그 수정이 수정되었습니다.

### syn-nodejs-puppeteer-9.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.0"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 20.x
+ Puppeteer-core 버전 22.12.1
+ Chromium 버전 126.0.6478.126

**syn-nodejs-puppeteer-9.0의 변경 사항** - 시각적 모니터링 기능을 활성화하는 버그 수정이 수정되었습니다.

### syn-nodejs-puppeteer-8.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-8.0"></a>

**주의**  
버그로 인해 `syn-nodejs-puppeteer-8.0` 런타임에서 canary의 시각적 모니터링이 지원되지 않습니다. 시각적 모니터링의 버그 수정을 위해 [syn-nodejs-puppeteer-9.0](#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.0)으로 업그레이드합니다.

**중요**  
Lambda Node.js 18 및 이후의 런타임은 AWS SDK for JavaScript V3를 사용합니다. 이전 런타임에서 카나리를 마이그레이션해야 하는 경우 GitHub에서 [aws-sdk-js-v3 마이그레이션 워크숍](https://github.com/aws-samples/aws-sdk-js-v3-workshop)을 따르세요. AWS SDK for JavaScript 버전 3에 대한 자세한 내용은 [이 블로그 게시물](https://aws.amazon.com/blogs/developer/modular-aws-sdk-for-javascript-is-now-generally-available/)을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 20.x
+ Puppeteer-core 버전 22.10.0
+ Chromium 버전 125.0.6422.112

**syn-nodejs-puppeteer-8.0의 업데이트 사항**:
+  **2단계 인증 지원** 
+ Node.js SDK V3 응답의 데이터가 손실되는 일부 서비스 클라이언트의 **버그 수정**이 수정되었습니다.

## Node.js 및 Puppeteer의 사용 중단된 런타임 버전
<a name="CloudWatch_Synthetics_nodejs-puppeteer-Deprecated"></a>

Node.js 및 Puppeteer에 대한 다음 런타임은 더 이상 사용되지 않습니다. 런타임 사용 중단 날짜에 대한 내용은 [CloudWatch Synthetics 런타임 사용 중단 날짜](CloudWatch_Synthetics_Runtime_Support_Policy.md#runtime_deprecation_dates) 단원을 참조하세요.

### syn-nodejs-puppeteer-7.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-7.0"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 18.x
+ Puppeteer-core 버전 21.9.0
+ Chromium 버전 121.0.6167.139

**코드 크기**:

이 런타임에 패키징할 수 있는 코드 및 종속성 크기는 80MB입니다.

**syn-nodejs-puppeteer-7.0의 업데이트 사항**:
+ **Puppeteer 및 Chromium의 번들링된 라이브러리의 버전 업데이트** - Puppeteer 및 Chromium 종속성이 새 버전으로 업데이트되었습니다.
**중요**  
Puppeteer 19.7.0에서 Puppeteer 21.9.0으로 전환하면서 테스트 및 필터와 관련하여 주요 변경 사항이 도입되었습니다. 자세한 내용은 [puppeteer: v20.0.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-v20.0.0) 및 [puppeteer-core: v21.0.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-core-v21.0.0)의 **주요 변경 사항** 섹션을 참조하십시오.

 **AWS SDK v3으로의 업그레이드 권장** 

Lambda nodejs18.x 런타임은 AWS SDK v2를 지원하지 않습니다. AWS SDK v3로 마이그레이션하는 것이 강력하게 권장됩니다.

### syn-nodejs-puppeteer-6.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.2"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 18.x
+ Puppeteer-core 버전 19.7.0
+ Chromium 버전 111.0.5563.146

**syn-nodejs-puppeteer-6.2의 변경 사항**:
+  **Chromium의 번들 라이브러리 업데이트 버전** 
+ **임시 스토리지 모니터링** — 이 런타임은 고객 계정에 임시 스토리지 모니터링을 추가합니다.
+  **버그 수정** 

### syn-nodejs-puppeteer-6.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.1"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 18.x
+ Puppeteer-core 버전 19.7.0
+ Chromium 버전 111.0.5563.146

**syn-nodejs-puppeteer-6.1의 업데이트 사항**:
+ **안정성 개선** - 간헐적인 Puppeteer 실행 오류를 처리하기 위한 자동 재시도 로직이 추가되었습니다.
+ **종속성 업그레이드** - 일부 타사 종속성 패키지에 대한 업그레이드입니다.
+ **Amazon S3 권한이 없는 canary** - Amazon S3 권한이 없는 canary를 계속 실행할 수 있도록 버그가 수정되었습니다. Amazon S3 권한이 없는 이러한 canary는 Amazon S3에 스크린샷 또는 기타 아티팩트를 업로드할 수 없습니다. canary 권한에 대한 자세한 내용은 [canary에 필요한 역할 및 권한](CloudWatch_Synthetics_Canaries_CanaryPermissions.md) 섹션을 참조하세요.

**중요**  
중요: 포함된 AWS SDK for JavaScript v2 종속성은 향후 런타임 릴리스에서 AWS SDK for JavaScript v3을 사용하도록 제거되고 업데이트될 예정입니다. 이 경우 canary 코드 참조를 업데이트할 수 있습니다. 또는 소스 코드 zip 파일에 종속성으로 추가하여 포함된 AWS SDK for JavaScript v2 종속성을 계속 참조하고 사용할 수 있습니다.

### syn-nodejs-puppeteer-6.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.0"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 18.x
+ Puppeteer-core 버전 19.7.0
+ Chromium 버전 111.0.5563.146

**syn-nodejs-puppeteer-6.0의 업데이트 사항**:
+ **종속성 업그레이드** - Node.js 종속성이 18.x로 업그레이드되었습니다.
+ **인터셉트 모드 지원** - Puppeteer 협동 인터셉트 모드 지원이 Synthetics canary 런타임 라이브러리에 추가되었습니다.
+ **추적 동작 변경** - 리소스 요청은 추적하지 않고 fetch 및 xhr 요청만 추적하도록 기본 추적 동작이 변경되었습니다. `traceResourceRequests` 옵션을 구성하여 리소스 요청 추적을 활성화할 수 있습니다.
+ **기간 지표 개선** - 이제 canary가 아티팩트를 업로드하고, 스크린샷을 찍고, CloudWatch 지표를 생성하는 데 사용하는 작업 시간이 ` Duration` 지표에서 제외됩니다. `Duration` 지표 값은 CloudWatch에 보고되며 Synthetics 콘솔에서도 확인할 수 있습니다.
+ **버그 수정**— canary 실행 중 Chromium이 충돌할 때 생성되는 코어 덤프를 정리합니다.

**중요**  
중요: 포함된 AWS SDK for JavaScript v2 종속성은 향후 런타임 릴리스에서 AWS SDK for JavaScript v3을 사용하도록 제거되고 업데이트될 예정입니다. 이 경우 canary 코드 참조를 업데이트할 수 있습니다. 또는 소스 코드 zip 파일에 종속성으로 추가하여 포함된 AWS SDK for JavaScript v2 종속성을 계속 참조하고 사용할 수 있습니다.

### syn-nodejs-puppeteer-5.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.2"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 16.x
+ Puppeteer-core 버전 19.7.0
+ Chromium 버전 111.0.5563.146

**syn-nodejs-puppeteer-5.2의 업데이트 사항**:
+  **Chromium의 번들 라이브러리 업데이트 버전** 
+  **버그 수정** 

### syn-nodejs-puppeteer-5.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 16.x
+ Puppeteer-core 버전 19.7.0
+ Chromium 버전 111.0.5563.146

**syn-nodejs-puppeteer-5.1의 버그 수정**:
+ **버그 수정** - 이 런타임은 ` syn-nodejs-puppeteer-5.0`에서 canary가 생성한 HAR 파일에 요청 헤더가 누락되는 버그를 수정합니다.

### syn-nodejs-puppeteer-5.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 16.x
+ Puppeteer-core 버전 19.7.0
+ Chromium 버전 111.0.5563.146

**syn-nodejs-puppeteer-5.0의 업데이트 사항**:
+ **종속성 업그레이드** - Puppeteer-core 버전이 19.7.0으로 업데이트되었습니다. Chromium 버전이 111.0.5563.146으로 업그레이드되었습니다.

**중요**  
새 Puppeteer-core 버전은 이전 버전의 Puppeteer와 완전히 호환되지는 않습니다. 이 버전의 일부 변경 사항으로 인해 더 이상 사용되지 않는 Puppeteer 함수를 사용하는 기존 canary가 작동하지 않을 수 있습니다. 자세한 내용은 [Puppeteer 변경 로그](https://github.com/puppeteer/puppeteer/releases?q=breaking&expanded=true)에서 Puppeteer-core 버전 19.7.0부터 6.0까지에 대한 변경 로그의 주요 변경 사항을 참조하세요.

### syn-nodejs-puppeteer-4.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0"></a>

**주요 종속 항목**:
+ Lambda 런타임 Node.js 16.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 92.0.4512

**syn-nodejs-puppeteer-4.0의 업데이트 사항**:
+ **종속성 업그레이드** - Node.js 종속성이 16.x로 업데이트되었습니다.

### syn-nodejs-puppeteer-3.9
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9"></a>

**중요**  
이 런타임 버전은 2024년 1월 8일부터 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 14.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 92.0.4512

**syn-nodejs-puppeteer-3.9의 업데이트 사항**:
+ **종속성 업그레이드** - 일부 타사 종속성 패키지를 업그레이드합니다.

### syn-nodejs-puppeteer-3.8
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8"></a>

**중요**  
이 런타임 버전은 2024년 1월 8일부터 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 14.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 92.0.4512

**syn-nodejs-puppeteer-3.8의 업데이트 사항**:
+ **프로파일 클린업** - 이제 각 canary 실행 후 Chromium 프로파일이 클린업됩니다.

**syn-nodejs-puppeteer-3.8의 버그 수정**:
+ **버그 수정** - 이전에는 스크린샷 없이 실행한 후 시각적 모니터링 canary가 제대로 작동하지 않는 경우가 있었습니다. 이 버그는 이제 수정되었습니다.

### syn-nodejs-puppeteer-3.7
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7"></a>

**중요**  
이 런타임 버전은 2024년 1월 8일부터 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 14.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 92.0.4512

**syn-nodejs-puppeteer-3.7의 업데이트 사항**:
+ **로깅 향상** - canary는 시간 초과 또는 충돌이 발생하더라도 Amazon S3에 로그를 업로드합니다.
+ **Lambda 계층 크기 감소** - canary에 사용되는 Lambda 계층의 크기가 34% 감소했습니다.

**syn-nodejs-puppeteer-3.7의 버그 수정**:
+ **버그 수정** - 일본어, 중국어 간체 및 중국어 번체 글꼴이 제대로 렌더링됩니다.

### syn-nodejs-puppeteer-3.6
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6"></a>

**중요**  
이 런타임 버전은 2024년 1월 8일부터 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 14.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 92.0.4512

**syn-nodejs-puppeteer-3.6의 업데이트 사항**:
+ **보다 정확한 타임스탬프** - canary 실행의 시작 시간과 중지 시간이 이제 밀리초의 정밀도로 기록됩니다.

### syn-nodejs-puppeteer-3.5
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5"></a>

**중요**  
이 런타임 버전은 2024년 1월 8일부터 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 14.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 92.0.4512

**syn-nodejs-puppeteer-3.5의 업데이트 사항**:
+ **종속 항목 업데이트**— 이 런타임의 유일한 새로운 기능은 업데이트된 종속 항목입니다.

### syn-nodejs-puppeteer-3.4
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4"></a>

**중요**  
이 런타임 버전은 2022년 11월 13일부터 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 12.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 88.0.4298.0

**syn-nodejs-puppeteer-3.4의 업데이트 사항**:
+ **사용자 지정 핸들러 함수** - 이제 canary 스크립트에 사용자 지정 핸들러 함수를 사용할 수 있습니다. 이전 런타임의 경우 `.handler`를 포함할 스크립트 엔트리 포인트가 필요합니다.

  canary 스크립트를 임의의 폴더에 넣고 폴더 이름을 핸들러의 일부로 전달할 수도 있습니다. 예를 들어, `MyFolder/MyScriptFile.functionname`을 진입점으로 사용할 수 있습니다.
+ **확장된 HAR 파일 정보** - 이제 canary에서 생성한 HAR 파일에서 불량, 보류 중, 불완전한 요청을 볼 수 있습니다.

### syn-nodejs-puppeteer-3.3
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3"></a>

**중요**  
이 런타임 버전은 2022년 11월 13일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 12.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 88.0.4298.0

**syn-nodejs-puppeteer-3.3의 업데이트 사항**:
+ **아티팩트 암호화에 대한 추가 옵션**: 이 런타임 이상을 사용하는 canary의 경우 canary가 Amazon S3에 저장하는 아티팩트를 암호화하는 AWS 관리형 키를 사용하는 대신 AWS KMS 고객 관리형 키 또는 Amazon S3 관리형 키 사용을 선택할 수 있습니다. 자세한 내용은 [canary 아티팩트 암호화](CloudWatch_Synthetics_artifact_encryption.md) 섹션을 참조하세요.

### syn-nodejs-puppeteer-3.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2"></a>

**중요**  
이 런타임 버전은 2022년 11월 13일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 12.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 88.0.4298.0

**syn-nodejs-puppeteer-3.2의 업데이트 사항**:
+ **스크린샷을 사용한 시각적 모니터링** - 이 런타임 이상 버전을 사용하는 canary는 실행 중에 생성한 스크린샷을 동일한 스크린샷의 기준 버전과 비교할 수 있습니다. 스크린샷이 지정된 백분율 임곗값과 많이 다르면 canary가 실패합니다. 자세한 내용은 [시각적 모니터링](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting) 또는 [시각적 모니터링 블루프린트](CloudWatch_Synthetics_Canaries_Blueprints.md#CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting) 섹션을 참조하세요.
+ **민감한 데이터에 관한 새로운 기능** - 민감한 데이터가 canary 로그 및 보고서에 표시되지 않도록 방지할 수 있습니다. 자세한 내용은 [SyntheticsLogHelper 클래스](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogHelper) 단원을 참조하세요.
+ **사용 중지된 함수** - ` RequestResponseLogHelper` 클래스는 새로운 다른 구성 옵션을 위해 더 이상 사용되지 않습니다. 자세한 내용은 [RequestResponseLogHelper 클래스](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_RequestResponseLogHelper) 단원을 참조하세요.

### syn-nodejs-puppeteer-3.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1"></a>

**중요**  
이 런타임 버전은 2022년 11월 13일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 12.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 88.0.4298.0

**syn-nodejs-puppeteer-3.1의 업데이트 사항**:
+ **CloudWatch 지표 구성 기능** - 이 런타임을 사용하면 필요하지 않은 지표를 사용 중지할 수 있습니다. 그렇지 않으면 canary는 각 canary 실행에 대한 다양한 CloudWatch 지표를 게시합니다.
+ **스크린샷 연결** - 단계가 완료된 후 스크린샷을 canary 단계에 연결할 수 있습니다. 이렇게 하려면 [**takeScreenshot**] 메서드를 사용하여 스크린샷을 생성합니다. 이때 스크린샷을 연결하려는 단계의 이름을 사용합니다. 예를 들어 단계를 수행하고 대기 시간을 추가한 다음, 스크린샷을 생성할 수 있습니다.
+ **하트비트 모니터 블루프린트가 여러 URL을 모니터링할 수 있음** -​​CloudWatch 콘솔에서 하트비트 모니터링 블루프린트를 사용하여 여러 URL을 모니터링하고 canary 실행 보고서의 단계 요약에서 각 URL의 상태, 지속 시간, 관련 스크린샷, 실패 원인을 확인할 수 있습니다.

### syn-nodejs-puppeteer-3.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0"></a>

**중요**  
이 런타임 버전은 2022년 11월 13일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 12.x
+ Puppeteer-core 버전 5.5.0
+ Chromium 버전 88.0.4298.0

**syn-nodejs-puppeteer-3.0의 업데이트 사항**:
+ **종속 항목 업그레이드** - 이 버전은 Puppeteer 버전 5.5.0, Node.js 12.x, Chromium 88.0.4298.0을 사용합니다.
+ **교차 리전 버킷 액세스** - 이제 canary가 해당 로그 파일, 스크린샷, HAR 파일을 저장하는 버킷으로 다른 리전의 S3 버킷을 지정할 수 있습니다.
+ **새 함수 사용 가능** - 이 버전에서는 canary 이름 및 Synthetics 런타임 버전을 검색하는 라이브러리 함수를 추가합니다.

  자세한 내용은 [Synthetics 클래스](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_Synthetics_Class_all) 단원을 참조하세요.

### syn-nodejs-2.2
<a name="CloudWatch_Synthetics_runtimeversion-2.2"></a>

이 단원에는 `syn-nodejs-2.2` 런타임 버전에 관한 정보가 포함되어 있습니다.

**중요**  
이 런타임 버전은 2021년 5월 28일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 10.x
+ Puppeteer-core 버전 3.3.0
+ Chromium 버전 83.0.4103.0

**syn-nodejs-2.2의 변경 사항**:
+ **HTTP 단계로 canary 모니터링** - 이제 단일 canary에서 여러 API를 테스트할 수 있습니다. 각 API는 별도의 HTTP 단계로 테스트되며, CloudWatch Synthetics는 단계 지표 및 CloudWatch Synthetics 단계 보고서를 사용하여 각 단계의 상태를 모니터링합니다. CloudWatch Synthetics는 각 HTTP 단계에 대해 ` SuccessPercent` 및 `Duration` 지표를 생성합니다.

  이 기능은 **executeHttpStep(stepName, requestOptions, callback, stepConfig)** 함수에 의해 구현됩니다. 자세한 내용은 [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_executeHttpStep) 단원을 참조하세요.

  API canary 블루프린트는 새로운 이 기능을 사용하도록 업데이트되었습니다.
+ **HTTP 요청 보고** - 이제 요청 또는 응답 헤더, 응답 본문, 상태 코드, 오류 및 성능 타이밍, TCP 연결 시간, TLS 핸드셰이크 시간, 첫 번째 바이트 시간, 콘텐츠 전송 시간과 같은 세부 정보를 캡처하는 자세한 HTTP 요청 보고서를 볼 수 있습니다. 내부적으로 HTTP/HTTPS 모듈을 사용하는 모든 HTTP 요청이 여기에 캡처됩니다. 헤더 및 응답 본문은 기본적으로 캡처되지 않지만 구성 옵션을 설정하여 사용 설정할 수 있습니다.
+ **글로벌 및 단계 수준 구성** - canary의 모든 단계에 적용되는 글로벌 수준에서 CloudWatch Synthetics 구성을 설정할 수 있습니다. 또한 구성 키-값 페어를 전달하여 특정 옵션을 사용하거나 사용 중지함으로써 단계 수준에서 이러한 구성을 재정의할 수도 있습니다.

  자세한 내용은 [SyntheticsConfiguration 클래스](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration) 단원을 참조하세요.
+ **단계 실패 시 계속 구성** - 단계 실패 시 canary 실행을 계속하도록 선택할 수 있습니다. ` executeHttpStep` 함수에서 이 옵션이 기본적으로 활성화되어 있습니다. 이 옵션은 글로벌 수준에서 한 번 설정하거나 단계마다 다르게 설정할 수 있습니다.

### syn-nodejs-2.1
<a name="CloudWatch_Synthetics_runtimeversion-2.1"></a>

**중요**  
이 런타임 버전은 2021년 5월 28일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 10.x
+ Puppeteer-core 버전 3.3.0
+ Chromium 버전 83.0.4103.0

**syn-nodejs-2.1의 업데이트 사항**:
+ **구성 가능한 스크린샷 동작** - UI canary에 의한 스크린샷 캡처를 비활성화하는 기능을 제공합니다. 이전 버전의 런타임을 사용하는 canary에서 UI canary는 항상 각 단계 전후에 스크린샷을 캡처합니다. `syn-nodejs-2.1`에서는 이 옵션을 구성할 수 있습니다. 스크린샷을 비활성화하면 Amazon S3 스토리지 비용을 줄이고 HIPAA 규정을 준수하는 데 도움이 될 수 있습니다. 자세한 내용은 [SyntheticsConfiguration 클래스](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration) 단원을 참조하세요.
+ **Google Chrome 시작 파라미터 사용자 지정** - 이제 canary가 Google Chrome 브라우저 창을 시작할 때 사용되는 인수를 구성할 수 있습니다. 자세한 내용은 [launch(options)](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_LaunchOptions) 단원을 참조하세요.

이전 버전의 canary 런타임과 비교했을 때 syn-nodejs-2.0 이상을 사용할 경우 canary 지속 시간이 약간 증가할 수 있습니다.

### syn-nodejs-2.0
<a name="CloudWatch_Synthetics_runtimeversion-2.0"></a>

**중요**  
이 런타임 버전은 2021년 5월 28일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 10.x
+ Puppeteer-core 버전 3.3.0
+ Chromium 버전 83.0.4103.0

**syn-nodejs-2.0의 업데이트 사항**:
+ **종속 항목 업그레이드** - 이 런타임 버전은 Puppeteer-core 버전 3.3.0 및 Chromium 버전 83.0.4103.0을 사용합니다.
+ **X-Ray 활성추적 지원** - canary에서 추적이 사용 설정된 경우 브라우저, AWS SDK, HTTP 또는 HTTPS 모듈을 사용하는 canary가 수행한 모든 호출에 대해 X-Ray 추적이 전송됩니다. 추적이 활성화된 canary는 X-Ray 트레이스 맵에 나타나며, 이는 추적이 활성화된 다른 서비스 또는 애플리케이션에 요청을 보내지 않는 경우에도 그렇습니다. 자세한 내용은 [canary 및 X-Ray 추적](CloudWatch_Synthetics_Canaries_tracing.md) 섹션을 참조하세요.
+ **Synthetics 보고** - CloudWatch Synthetics는 각 canary 실행에 대해 시작 시간, 종료 시간, 상태, 실패와 같은 데이터를 기록하는 ` SyntheticsReport-PASSED.json` 또는 ` SyntheticsReport-FAILED.json`이라는 보고서를 생성합니다. 또한 canary 스크립트의 각 단계에 대한 PASSED/FAILED 상태, 각 단계에 대해 캡처된 스크린샷 및 실패를 기록합니다.
+ **잘못된 링크 검사기 보고서** - 이 런타임에 포함된 잘못된 링크 검사기의 새 버전은 확인된 링크, 상태 코드, 실패 원인(있는 경우), 소스 및 대상 페이지 스크린샷을 포함하는 보고서를 생성합니다.
+ **새로운 CloudWatch 지표** - Synthetics는 `CloudWatchSynthetics` 네임스페이스에 `2xx`, `4xx`, `5xx` 및 `RequestFailed`라는 지표를 게시합니다. 이러한 지표는 canary 실행의 200s, 400s, 500s 및 요청 실패 수를 보여 줍니다. 이 런타임 버전에서는 이러한 지표가 UI canary에 대해서만 보고되며 API canary에 대해서는 보고되지 않습니다. 런타임 버전 ` syn-nodejs-puppeteeer-2.2`부터는 API canary에 대해서도 보고됩니다.
+ **정렬 가능한 HAR 파일** – 이제 상태 코드, 요청 크기, 지속 시간을 기준으로 HAR 파일을 정렬할 수 있습니다.
+ **지표 타임스탬프** - 이제 CloudWatch 지표가 canary 실행 종료 시간 대신 Lambda 호출 시간을 기반으로 보고됩니다.

**syn-nodejs-2.0의 버그 수정**:
+ canary 아티팩트 업로드 오류가 보고되지 않는 문제를 수정했습니다. 이러한 오류는 이제 실행 오류로 표시됩니다.
+ 리디렉션된 요청(3xx)이 오류로 잘못 로그되는 문제를 수정했습니다.
+ 스크린샷 번호가 0부터 시작되는 문제를 수정했습니다. 이제 스크린샷 번호가 1부터 시작됩니다.
+ 중국어 및 일본어 글꼴의 스크린샷이 깨져 보이는 문제를 수정했습니다.

이전 버전의 canary 런타임과 비교했을 때 syn-nodejs-2.0 이상을 사용할 경우 canary 지속 시간이 약간 증가할 수 있습니다.

### syn-nodejs-2.0-beta
<a name="CloudWatch_Synthetics_runtimeversion-2.0-beta"></a>

**중요**  
이 런타임 버전은 2021년 2월 8일에 사용 중지되었습니다. 자세한 내용은 [런타임 버전 지원 정책](CloudWatch_Synthetics_Runtime_Support_Policy.md) 섹션을 참조하세요.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 10.x
+ Puppeteer-core 버전 3.3.0
+ Chromium 버전 83.0.4103.0

**syn-nodejs-2.0-beta의 변경 사항**:
+ **종속 항목 업그레이드** - 이 런타임 버전은 Puppeteer-core 버전 3.3.0 및 Chromium 버전 83.0.4103.0을 사용합니다.
+ **Synthetics 보고** - CloudWatch Synthetics는 각 canary 실행에 대해 시작 시간, 종료 시간, 상태, 실패와 같은 데이터를 기록하는 ` SyntheticsReport-PASSED.json` 또는 ` SyntheticsReport-FAILED.json`이라는 보고서를 생성합니다. 또한 canary 스크립트의 각 단계에 대한 PASSED/FAILED 상태, 각 단계에 대해 캡처된 스크린샷 및 실패를 기록합니다.
+ **잘못된 링크 검사기 보고서** - 이 런타임에 포함된 잘못된 링크 검사기의 새 버전은 확인된 링크, 상태 코드, 실패 원인(있는 경우), 소스 및 대상 페이지 스크린샷을 포함하는 보고서를 생성합니다.
+ **새로운 CloudWatch 지표** - Synthetics는 `CloudWatchSynthetics` 네임스페이스에 `2xx`, `4xx`, `5xx` 및 `RequestFailed`라는 지표를 게시합니다. 이러한 지표는 canary 실행의 200s, 400s, 500s 및 요청 실패 수를 보여 줍니다. 이러한 지표가 UI canary에 대해서만 보고되며 API canary에 대해서는 보고되지 않습니다.
+ **정렬 가능한 HAR 파일** – 이제 상태 코드, 요청 크기, 지속 시간을 기준으로 HAR 파일을 정렬할 수 있습니다.
+ **지표 타임스탬프** - 이제 CloudWatch 지표가 canary 실행 종료 시간 대신 Lambda 호출 시간을 기반으로 보고됩니다.

**syn-nodejs-2.0-beta의 버그 수정**:
+ canary 아티팩트 업로드 오류가 보고되지 않는 문제를 수정했습니다. 이러한 오류는 이제 실행 오류로 표시됩니다.
+ 리디렉션된 요청(3xx)이 오류로 잘못 로그되는 문제를 수정했습니다.
+ 스크린샷 번호가 0부터 시작되는 문제를 수정했습니다. 이제 스크린샷 번호가 1부터 시작됩니다.
+ 중국어 및 일본어 글꼴의 스크린샷이 깨져 보이는 문제를 수정했습니다.

### syn-1.0
<a name="CloudWatch_Synthetics_runtimeversion-1.0"></a>

첫 번째 Synthetics 런타임 버전은 `syn-1.0`입니다.

**주요 종속 항목**:
+ Lambda 런타임 Node.js 10.x
+ Puppeteer-core 버전 1.14.0
+ Puppeteer-core 1.14.0과 일치하는 Chromium 버전

# Python 및 Selenium Webdriver를 사용하는 런타임 버전
<a name="CloudWatch_Synthetics_Library_python_selenium"></a>

다음 단원에는 Python 및 Selenium Webdriver용 CloudWatch Synthetics 런타임 버전에 관한 정보가 포함되어 있습니다. Selenium은 오픈 소스 브라우저 자동화 도구입니다. Selenium에 대한 자세한 내용은 [www.selenium.dev/](https://www.selenium.dev)를 참조하세요.

Selenium 프레임워크에서 Synthetics 런타임이 지원하는 기능 및 방법은 [UI 카나리에만 적용되는 Python 및 Selenium 라이브러리 클래스 및 함수](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_UIcanaries)와 [Selenium API 참조](https://www.selenium.dev/selenium/docs/api/py/api.html)를 참조하세요.

이러한 런타임 버전의 명명 규칙은 `syn-language -framework-majorversion. minorversion`입니다.

## syn-python-selenium-10.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-10.0"></a>

버전 10.0은 Python과 Selenium에 대한 최신 CloudWatch Synthetics 런타임입니다.

**주요 종속 항목**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium 버전 145.0.7632.77

**syn-python-selenium-10.0의 변경 사항 ** 
+ 보안 패치를 적용하고 브라우저 버전을 업데이트했습니다.

자세한 내용은 다음을 참조하세요.
+  [Selenium 변경 로그](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 설명서](https://www.selenium.dev/selenium/docs/api/py/api.html) 

## Python 및 Selenium의 이전 런타임 버전
<a name="Previousversions-python-selenium"></a>

Python 및 Selenium의 다음과 같은 이전 런타임 버전은 여전히 지원됩니다.

### syn-python-selenium-9.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-9.0"></a>

**주요 종속 항목**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium 버전 143.0.7499.169

**syn-python-selenium-9.0의 변경 사항 ** 
+ 보안 패치를 적용하고 브라우저 버전을 업데이트했습니다.

자세한 내용은 다음을 참조하세요.
+  [Selenium 변경 로그](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 설명서](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-8.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-8.0"></a>

버전 8.0은 Python과 Selenium에 대한 최신 CloudWatch Synthetics 런타임입니다.

**주요 종속 항목**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium 버전 142.0.7444.175

**syn-python-selenium-8.0의 변경 사항 ** 
+ 보안 패치를 적용하고 Selenium 및 브라우저 버전을 업데이트했습니다.
+ 실패한 HAR 네트워크 요청 로그 수준을 ERROR에서 INFO로 수정했습니다.

자세한 내용은 다음을 참조하세요.
+  [Selenium 변경 로그](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 설명서](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-7.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-7.0"></a>

**주요 종속 항목**:
+ Python 3.11
+ Selenium 4.32.0
+ Chromium 버전 138.0.7204.168

 **syn-python-selenium-7.0의 변경 사항 ** 
+ 보안 패치를 적용하고 Selenium 및 브라우저 버전을 업데이트했습니다.

자세한 내용은 다음을 참조하세요.
+  [Selenium 변경 로그](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 설명서](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-6.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-6.0"></a>

**주요 종속 항목**:
+ Python 3.11
+ Selenium 4.21.0
+ Chromium 버전 131.0.6778.264

 **syn-python-selenium-6.0의 변경 사항** 
+ Python 3.9에서 Python 3.11로 업그레이드합니다.

자세한 내용은 다음을 참조하세요.
+  [Selenium 변경 로그](https://www.selenium.dev/blog/2024/selenium-4-21-released/) 
+  [Selenium 설명서](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-5.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-5.1"></a>

**주요 종속 항목**:
+ Python 3.9
+ Selenium 4.21.0
+ Chromium 버전 131.0.6778.264

 **syn-python-selenium-5.1의 변경 사항** 
+ 지표 방출에 대한 사소한 업데이트.
+ 카나리에 대한 모의 실행을 지원하여 임시 실행을 허용하거나 안전한 카나리 업데이트를 수행할 수 있습니다.

### syn-python-selenium-5.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-5.0"></a>

**주요 종속 항목**:
+ Python 3.9
+ Selenium 4.21.0
+ Chromium 버전 131.0.6778.264

**syn-python-selenium-5.0의 변경 사항**:
+ 브라우저를 시작하지 못하면 자동으로 다시 시도합니다.

### syn-python-selenium-4.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-4.1"></a>

**주요 종속 항목**:
+ Python 3.9
+ Selenium 4.15.1
+ Chromium 버전 126.0.6478.126

**syn-python-selenium-4.1의 변경 사항**:
+ **보안 취약성 해결** - 이 런타임에는 [CVE-2024-39689](https://nvd.nist.gov/vuln/detail/CVE-2024-39689) 취약성을 해결하기 위한 업데이트가 있습니다.

### syn-python-selenium-4.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-4.0"></a>

**주요 종속 항목**:
+ Python 3.9
+ Selenium 4.15.1
+ Chromium 버전 126.0.6478.126

**syn-python-selenium-4.0의 변경 사항**:
+ HAR 파서 로깅의 오류에 대한 ****버그 수정입니다.

## Python 및 Selenium의 사용 중단된 런타임 버전
<a name="Deprecated-python-selenium"></a>

Python 및 Selenium의 다음과 같은 이전 런타임 버전은 사용 중단되었습니다. 런타임 사용 중단 날짜에 대한 내용은 [CloudWatch Synthetics 런타임 사용 중단 날짜](CloudWatch_Synthetics_Runtime_Support_Policy.md#runtime_deprecation_dates) 단원을 참조하세요.

### syn-python-selenium-3.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-3.0"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 4.15.1
+ Chromium 버전 121.0.6167.139

**syn-python-selenium-3.0의 변경 사항**:
+ **Chromium의 번들링된 라이브러리의 버전 업데이트** - Chromium 종속성이 새 버전으로 업데이트되었습니다.

### syn-python-selenium-2.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-2.1"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 4.15.1
+ Chromium 버전 111.0.5563.146

**syn-python-selenium-2.1의 변경 사항**:
+ **Chromium의 번들링된 라이브러리의 버전 업데이트** - Chromium 및 Selenium 종속성이 새 버전으로 업데이트되었습니다.

### syn-python-selenium-2.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-2.0"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 4.10.0
+ Chromium 버전 111.0.5563.146

**syn-python-selenium-2.0의 변경 사항**:
+ **종속성 업데이트** - Chromium 및 Selenium 종속성이 새 버전으로 업데이트되었습니다.

**syn-python-selenium-2.0의 버그 수정**:
+ **타임스탬프 추가** - canary 로그에 타임스탬프가 추가되었습니다.
+ **세션 재사용** - 이제 canary가 이전 canary 실행의 세션을 재사용할 수 없도록 버그가 수정되었습니다.

### syn-python-selenium-1.3
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 버전 92.0.4512.0

**syn-python-selenium-1.3의 변경 사항**:
+ **보다 정확한 타임스탬프** - canary 실행의 시작 시간과 중지 시간이 이제 밀리초의 정밀도로 기록됩니다.

### syn-python-selenium-1.2
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 버전 92.0.4512.0
+ **종속 항목 업데이트**— 이 런타임의 유일한 새로운 기능은 업데이트된 종속 항목입니다.

### syn-python-selenium-1.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 버전 83.0.4103.0

**기능:**
+ **사용자 지정 핸들러 함수** - 이제 canary 스크립트에 사용자 지정 핸들러 함수를 사용할 수 있습니다. 이전 런타임의 경우 `.handler`를 포함할 스크립트 엔트리 포인트가 필요합니다.

  canary 스크립트를 임의의 폴더에 넣고 폴더 이름을 핸들러의 일부로 전달할 수도 있습니다. 예를 들어, `MyFolder/MyScriptFile.functionname`을 진입점으로 사용할 수 있습니다.
+ **지표 및 단계 실패 구성을 추가하기 위한 구성 옵션** - 이러한 옵션은 Node.js canary의 런타임에서 이미 사용할 수 있었습니다. 자세한 정보는 [SyntheticsConfiguration 클래스](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python)을 참조하세요.
+ **Chrome의 사용자 지정 인수** - 이제 시크릿 모드로 브라우저를 열거나 프록시 서버 구성을 전달할 수 있습니다. 자세한 내용은 [Chrome()](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_Python_Chrome) 섹션을 참조하세요.
+ **교차 리전 아티팩트 버킷** - canary는 다른 리전의 Amazon S3 버킷에 아티팩트를 저장할 수 있습니다.
+ **`index.py` 문제 수정을 포함한 버그 수정** - 이전 런타임에서는 ` index.py`로 이름이 지정된 canary 파일이 라이브러리 파일의 이름과 충돌하기 때문에 예외가 발생했습니다. 이제 이 문제가 해결됐습니다.

### syn-python-selenium-1.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0"></a>

**주요 종속 항목**:
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 버전 83.0.4103.0

**기능:**
+ **Selenium 지원** - Selenium 테스트 프레임워크를 사용하여 canary 스크립트를 작성할 수 있습니다. 다른 곳에서 CloudWatch Synthetics로 Selenium 스크립트를 가져올 수 있으며 최소한의 변경으로도 스크립트가 AWS 서비스에서 작동합니다.

# Node.js를 사용하는 런타임 버전
<a name="CloudWatch_Synthetics_Library_Nodejs"></a>

다음 섹션에는 Node.js용 CloudWatch Synthetics 런타임 버전에 관한 정보가 포함되어 있습니다. 이 런타임에는 브라우저 또는 프레임워크가 포함되어 있지 않습니다.

이러한 런타임 버전의 명명 규칙은 `syn-language -majorversion.minorversion`입니다.

## syn-nodejs-4.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-4.1"></a>

**중요**  
Synthetics `syn-nodejs-3.1` 이상부터 Synthetics 런타임은 새 네임스페이스를 사용합니다. 새 네임스페이스를 사용하려면 카나리 스크립트를 마이그레이션하세요. 레거시 네임스페이스는 향후 릴리스에서 더 이상 사용되지 않습니다.  
@amzn/synthetics-core → @aws/synthetics-core

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 22.x

 **syn-nodejs-4.1의 변경 사항** 
+ `fast-xml-parser`를 5.5.7로 업그레이드하고 다음 CVE 해결:
  + CVE-2026-25128
  + CVE-2026-25896
  + CVE-2026-26278
  + CVE-2026-27942
  + CVE-2026-33036

## Node.js의 이전 런타임 버전
<a name="Previousversions-nodejs"></a>

Node.js의 다음과 같은 이전 런타임 버전은 여전히 지원됩니다.

### syn-nodejs-4.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-4.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 22.x

 **syn-nodejs-4.0의 변경 사항** 
+ 보안 패치를 적용했습니다.

### syn-nodejs-3.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-3.1"></a>

**중요**  
Synthetics `syn-nodejs-3.1` 이상부터 Synthetics 런타임은 새 네임스페이스를 사용합니다. 새 네임스페이스를 사용하려면 카나리 스크립트를 마이그레이션하세요. 레거시 네임스페이스는 향후 릴리스에서 더 이상 사용되지 않습니다.  
@amzn/synthetics-core → @aws/synthetics-core

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 20.x

 **syn-nodejs-3.1의 변경 사항** 
+ Synthetics 런타임 네임스페이스 마이그레이션.
+ 유형 정의는 [npm 레지스트리](https://www.npmjs.com/package/@aws/synthetics-core)에서 사용할 수 있습니다. 유형 정의 패키지 버전이 카나리의 런타임 버전과 일치하는지 확인하세요.

### syn-nodejs-3.0
<a name="Synthetics_runtimeversion-syn-nodejs-3.0"></a>

**주요 종속 항목**:
+ AWS Lambda 런타임 Node.js 20.x

 **syn-nodejs-3.0의 변경 사항** 
+ 다중 검사 블루프린트에 대한 지원.

# 런타임 버전 지원 정책
<a name="CloudWatch_Synthetics_Runtime_Support_Policy"></a>

Synthetics 런타임 버전에는 유지 관리 및 보안 업데이트가 적용됩니다. 런타임 버전의 구성 요소가 더 이상 지원되지 않는 경우 해당 Synthetics 런타임 버전은 더 이상 사용되지 않습니다.

사용 중단된 런타임 버전을 사용하여 canary를 생성할 수 없습니다. 사용 중단된 런타임을 사용하는 canary는 계속 실행됩니다. 이러한 canary를 중지, 시작 및 삭제할 수 있습니다. 지원되는 런타임 버전을 사용하도록 canary를 업데이트함으로써 사용 중지된 런타임 버전을 사용하는 기존 canary를 업데이트할 수 있습니다.

CloudWatch Synthetics는 향후 60일 이내에 사용 중지될 예정인 런타임을 사용하는 canary가 있는 경우 이를 이메일로 알려줍니다. 최신 릴리스에 포함된 새로운 기능, 보안, 성능 향상의 이점을 활용하려면 canary를 지원되는 런타임 버전으로 마이그레이션하는 것이 좋습니다.

## CloudWatch Synthetics 런타임 사용 중단 날짜
<a name="runtime_deprecation_dates"></a>

다음 테이블에는 사용 중단된 각 CloudWatch Synthetics 런타임의 사용 중단 날짜가 나열되어 있습니다.


| 런타임 버전 | 사용 중단 날짜 | 
| --- | --- | 
|   `syn-python-selenium-5.1`   |  2026년 2월 3일  | 
|   `syn-python-selenium-5.0`   |  2026년 2월 3일  | 
|   `syn-python-selenium-4.1`   |  2026년 2월 3일  | 
|   `syn-python-selenium-4.0`   |  2026년 2월 3일  | 
|   `syn-nodejs-puppeteer-7.0`   |  2026년 1월 22일  | 
|   `syn-nodejs-puppeteer-6.2`   |  2026년 1월 22일  | 
|   `syn-nodejs-puppeteer-5.2`   |  2026년 1월 22일  | 
|   `syn-python-selenium-3.0`   |  2026년 1월 22일  | 
|   `syn-python-selenium-2.1`   |  2026년 1월 22일  | 
|   `syn-nodejs-puppeteer-6.1`   |  2024년 3월 8일  | 
|   `syn-nodejs-puppeteer-6.0`   |  2024년 3월 8일  | 
|   `syn-nodejs-puppeteer-5.1`   |  2024년 3월 8일  | 
|   `syn-nodejs-puppeteer-5.0`   |  2024년 3월 8일  | 
|   `syn-nodejs-puppeteer-4.0`   |  2024년 3월 8일  | 
|   `syn-nodejs-puppeteer-3.9`   |  2024년 1월 8일  | 
|   `syn-nodejs-puppeteer-3.8`   |  2024년 1월 8일  | 
|   `syn-python-selenium-2.0`   |  2024년 3월 8일  | 
|   `syn-python-selenium-1.3`   |  2024년 3월 8일  | 
|   `syn-python-selenium-1.2`   |  2024년 3월 8일  | 
|   `syn-python-selenium-1.1`   |  2024년 3월 8일  | 
|   `syn-python-selenium-1.0`   |  2024년 3월 8일  | 
|   `syn-nodejs-puppeteer-3.7`   |  2024년 1월 8일  | 
|   `syn-nodejs-puppeteer-3.6`   |  2024년 1월 8일  | 
|   `syn-nodejs-puppeteer-3.5`   |  2024년 1월 8일  | 
|   `syn-nodejs-puppeteer-3.4`   |  2022년 11월 13일  | 
|   `syn-nodejs-puppeteer-3.3`   |  2022년 11월 13일  | 
|   `syn-nodejs-puppeteer-3.2`   |  2022년 11월 13일  | 
|   `syn-nodejs-puppeteer-3.1`   |  2022년 11월 13일  | 
|   `syn-nodejs-puppeteer-3.0`   |  2022년 11월 13일  | 
|   `syn-nodejs-2.2`   |  2021년 5월 28일  | 
|   `syn-nodejs-2.1`   |  2021년 5월 28일  | 
|   `syn-nodejs-2.0`   |  2021년 5월 28일  | 
|   `syn-nodejs-2.0-beta`   |  2021년 2월 8일  | 
|   `syn-1.0`   |  2021년 5월 28일  | 

# 런타임 버전 업데이트
<a name="CloudWatch_Synthetics_Runtime_Version_Update"></a>

CloudWatch 콘솔, AWS CloudFormation, AWS CLI 또는 AWS SDK를 사용하여 canary의 런타임 버전을 업데이트할 수 있습니다. CloudWatch 콘솔을 사용할 경우 한 번에 최대 5개의 카나리를 업데이트할 수 있는데, 카나리 목록 페이지에서 카나리를 선택한 다음, **작업**, **런타임 업데이트**를 선택하면 됩니다.

런타임 업데이트를 커밋하기 전에 먼저 업데이트를 테스트하여 업데이트를 확인할 수 있습니다. 런타임 버전을 업데이트할 때 CloudWatch 콘솔에서 **모의 실행 시작** 또는 **나중에 검증 및 저장** 옵션을 선택하여 구성 변경 사항과 함께 원래 카나리의 모의 실행을 생성합니다. 모의 실행은 카나리를 업데이트하고 실행하여 런타임 업데이트가 카나리에 안전한지 확인합니다. 새 런타임 버전의 카나리를 확인한 후에는 카나리의 런타임 버전을 업데이트합니다. 자세한 내용은 [안전한 카나리 업데이트 수행](performing-safe-canary-upgrades.md) 섹션을 참조하세요.

또는 CloudWatch 콘솔을 사용하여 카나리를 복제하고 해당 런타임 버전을 업데이트하여 업데이트를 확인할 수 있습니다. 이렇게 하면 원래 canary의 복제인 또 다른 canary가 생성됩니다. 새 런타임 버전의 canary를 확인한 후에는 원래 canary의 런타임 버전을 업데이트하고 복제 canary를 삭제할 수 있습니다.

 또한 업그레이드 스크립트를 사용하여 여러 canary를 업데이트할 수도 있습니다. 자세한 내용은 [canary 런타임 업그레이드 스크립트](#CloudWatch_Synthetics_Canaries_upgrade_script) 단원을 참조하세요.

canary를 업그레이드했는데 canary가 실패한 경우 [실패한 canary 문제 해결](CloudWatch_Synthetics_Canaries_Troubleshoot.md) 단원을 참조하세요.

## canary 런타임 업그레이드 스크립트
<a name="CloudWatch_Synthetics_Canaries_upgrade_script"></a>

canary 스크립트를 지원되는 런타임 버전으로 업그레이드하려면 다음 스크립트를 사용합니다.

```
const AWS = require('aws-sdk');

// You need to configure your AWS credentials and Region.
//   https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
//   https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html

const synthetics = new AWS.Synthetics();

const DEFAULT_OPTIONS = {
  /**
   * The number of canaries to upgrade during a single run of this script.
   */
  count: 10,
  /**
   * No canaries are upgraded unless force is specified.
   */
  force: false
};

/**
 * The number of milliseconds to sleep between GetCanary calls when
 * verifying that an update succeeded.
 */
const SLEEP_TIME = 5000;

(async () => {
  try {
    const options = getOptions();

    const versions = await getRuntimeVersions();
    const canaries = await getAllCanaries();
    const upgrades = canaries
      .filter(canary => !versions.isLatestVersion(canary.RuntimeVersion))
      .map(canary => {
        return {
          Name: canary.Name,
          FromVersion: canary.RuntimeVersion,
          ToVersion: versions.getLatestVersion(canary.RuntimeVersion)
        };
      });

    if (options.force) {
      const promises = [];

      for (const upgrade of upgrades.slice(0, options.count)) {
        const promise = upgradeCanary(upgrade);
        promises.push(promise);
        // Sleep for 100 milliseconds to avoid throttling.
        await usleep(100);
      }

      const succeeded = [];
      const failed = [];
      for (let i = 0; i < upgrades.slice(0, options.count).length; i++) {
        const upgrade = upgrades[i];
        const promise = promises[i];
        try {
          await promise;
          console.log(`The update of ${upgrade.Name} succeeded.`);
          succeeded.push(upgrade.Name);
        } catch (e) {
          console.log(`The update of ${upgrade.Name} failed with error: ${e}`);
          failed.push({
            Name: upgrade.Name,
            Reason: e
          });
        }
      }

      if (succeeded.length) {
        console.group('The following canaries were upgraded successfully.');
        for (const name of succeeded) {
          console.log(name);
        }
        console.groupEnd()
      } else {
        console.log('No canaries were upgraded successfully.');
      }

      if (failed.length) {
        console.group('The following canaries were not upgraded successfully.');
        for (const failure of failed) {
          console.log('\x1b[31m', `${failure.Name}: ${failure.Reason}`, '\x1b[0m');
        }
        console.groupEnd();
      }
    } else {
      console.log('Run with --force [--count <count>] to perform the first <count> upgrades shown. The default value of <count> is 10.')
      console.table(upgrades);
    }
  } catch (e) {
    console.error(e);
  }
})();

function getOptions() {
  const force = getFlag('--force', DEFAULT_OPTIONS.force);
  const count = getOption('--count', DEFAULT_OPTIONS.count);
  return { force, count };

  function getFlag(key, defaultValue) {
    return process.argv.includes(key) || defaultValue;
  }
  function getOption(key, defaultValue) {
    const index = process.argv.indexOf(key);
    if (index < 0) {
      return defaultValue;
    }
    const value = process.argv[index + 1];
    if (typeof value === 'undefined' || value.startsWith('-')) {
      throw `The ${key} option requires a value.`;
    }
    return value;
  }
}

function getAllCanaries() {
  return new Promise((resolve, reject) => {
    const canaries = [];

    synthetics.describeCanaries().eachPage((err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data === null) {
          resolve(canaries);
        } else {
          canaries.push(...data.Canaries);
        }
      }
    });
  });
}

function getRuntimeVersions() {
  return new Promise((resolve, reject) => {
    const jsVersions = [];
    const pythonVersions = [];
    synthetics.describeRuntimeVersions().eachPage((err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data === null) {
          jsVersions.sort((a, b) => a.ReleaseDate - b.ReleaseDate);
          pythonVersions.sort((a, b) => a.ReleaseDate - b.ReleaseDate);
          resolve({
            isLatestVersion(version) {
              const latest = this.getLatestVersion(version);
              return latest === version;
            },
            getLatestVersion(version) {
              if (jsVersions.some(v => v.VersionName === version)) {
                return jsVersions[jsVersions.length - 1].VersionName;
              } else if (pythonVersions.some(v => v.VersionName === version)) {
                return pythonVersions[pythonVersions.length - 1].VersionName;
              } else {
                throw Error(`Unknown version ${version}`);
              }
            }
          });
        } else {
          for (const version of data.RuntimeVersions) {
            if (version.VersionName === 'syn-1.0') {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-nodejs-2.')) {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-nodejs-puppeteer-')) {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-python-selenium-')) {
              pythonVersions.push(version);
            } else {
              throw Error(`Unknown version ${version.VersionName}`);
            }
          }
        }
      }
    });
  });
}

async function upgradeCanary(upgrade) {
  console.log(`Upgrading canary ${upgrade.Name} from ${upgrade.FromVersion} to ${upgrade.ToVersion}`);
  await synthetics.updateCanary({ Name: upgrade.Name, RuntimeVersion: upgrade.ToVersion }).promise();
  while (true) {
    await usleep(SLEEP_TIME);
    console.log(`Getting the state of canary ${upgrade.Name}`);
    const response = await synthetics.getCanary({ Name: upgrade.Name }).promise();
    const state = response.Canary.Status.State;
    console.log(`The state of canary ${upgrade.Name} is ${state}`);
    if (state === 'ERROR' || response.Canary.Status.StateReason) {
      throw response.Canary.Status.StateReason;
    }
    if (state !== 'UPDATING') {
      return;
    }
  }
}

function usleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
```

# canary 스크립트 작성
<a name="CloudWatch_Synthetics_Canaries_WritingCanary"></a>

다음 섹션에서는 canary 스크립트를 작성하는 방법과 canary를 다른 AWS 서비스 그리고 외부 종속성 및 라이브러리와 통합하는 방법에 대해 설명합니다.

**Topics**
+ [Java 런타임을 사용하여 카나리 스크립트 작성](Synthetics_WritingCanary_Java.md)
+ [Playwright 런타임을 사용하여 Node.js 카나리 스크립트 작성](Synthetics_WritingCanary_Nodejs_Playwright.md)
+ [Puppeteer 런타임을 사용하여 Node.js 카나리 스크립트 작성](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md)
+ [Python canary 스크립트 작성](CloudWatch_Synthetics_Canaries_WritingCanary_Python.md)
+ [Node.js 다중 검사 블루프린트에 대한 JSON 구성 작성](CloudWatch_Synthetics_WritingCanary_Multichecks.md)

# Java 런타임을 사용하여 카나리 스크립트 작성
<a name="Synthetics_WritingCanary_Java"></a>

**Topics**
+ [카나리에 대한 Java 프로젝트 구조](#Synthetics_canary_Java_package)
+ [카나리 프로젝트 패키징](#Synthetics_canary_Java_package_canary)
+ [핸들러 이름](#Synthetics_canary_Java_handler)
+ [CloudWatch Synthetics 구성](#Synthetics_canary_Java_config)
+ [CloudWatch Synthetics 환경 변수](#Synthetics_canary_Java_variables)

## 카나리에 대한 Java 프로젝트 구조
<a name="Synthetics_canary_Java_package"></a>

Java에서 카나리를 생성하려면 코드를 작성하고, 컴파일하고, 컴파일된 아티팩트를 Synthetics에 배포해야 합니다. 다양한 방법으로 Java Lambda 프로젝트를 초기화할 수 있습니다. 예를 들어 선호하는 IDE(예: IntelliJ IDEA 또는 Visual Studio Code)의 표준 Java 프로젝트 설정을 사용할 수 있습니다. 또는 필요한 파일 구조를 수동으로 생성할 수 있습니다.

Synthetics Java 프로젝트에는 다음과 같은 일반 구조가 포함되어 있습니다.

```
/project-root
    └ src
        └ main
            └ java
                └ canarypackage // name of package
                |    └ ExampleCanary.java // Canary code file
                |    └ other_supporting_classes
                - resources
                     └ synthetics.json // Synthetics configuration file    
     └ build.gradle OR pom.xml
```

Maven 또는 Gradle을 사용하여 프로젝트를 빌드하고 종속성을 관리할 수 있습니다.

위 구조에서 `ExampleCanary` 클래스는 카나리의 진입점 또는 핸들러입니다.

 **Java canary 클래스 예제** 

이 예제에서 카나리가 *TESTING\$1URL* Lambda 환경 변수에 저장된 URL에 대한 get 요청을 실시합니다. 카나리는 Synthetics 런타임에서 제공하는 메서드를 사용하지 않습니다.

```
package canarypackage;

import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canary.ExampleCanary::canaryCode
public class ExampleCanary { 
  public void canaryCode() throws Exception{ 
      URL url = new URL(System.getenv("TESTING_URL"));
      HttpURLConnection con=(HttpURLConnection)url.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status=con.getResponseCode();
      if(status!=200){
        throw new Exception("Failed to load " + url + ", status code: " + status);
      }
  }
}
```

Synthetics 제공 라이브러리 함수 `executeStep`을 사용하여 카나리를 모듈화하는 것이 좋습니다. 카나리는 URL1 및 URL2 환경 변수에서 조달된 2개의 다른 URL에 `get`을 호출합니다.

**참고**  
`executeStep` 기능을 사용하려면 카나리의 핸들러 메서드가 아래와 같이 Synthetics 유형의 파라미터를 가져와야 합니다.

```
package canarypackage;

import com.amazonaws.synthetics.Synthetics;
import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canary.ExampleCanary::canaryCode
public class ExampleCanary {
  public void canaryCode(Synthetics synthetics) throws Exception {
    createStep("Step1", synthetics, System.getenv("URL1"));
    createStep("Step2", synthetics, System.getenv("URL2"));
    return;
  }
  
  private void createStep(String stepName, Synthetics synthetics, String url) throws Exception{
    synthetics.executeStep(stepName,()->{
      URL obj=new URL(url);
      HttpURLConnection con=(HttpURLConnection)obj.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status=con.getResponseCode();
      if(status!=200){
        throw new Exception("Failed to load" + url + "status code:" + status);
      }
      return null;
    }).get();
  }
}
```

## 카나리 프로젝트 패키징
<a name="Synthetics_canary_Java_package_canary"></a>

Synthetics는 *zip* 형식의 Java 카나리 코드를 수락합니다. zip은 카나리 코드의 클래스 파일, 타사 종속성의 jar 및 Synthetics 구성 파일로 구성됩니다.

Synthetics Java zip에는 다음과 같은 일반 구조가 포함되어 있습니다.

```
example-canary
    └ lib
    |  └ //third party dependency jars
       └ java-canary.jar
    └ synthetics.json
```

위의 프로젝트 구조에서 이 zip을 구축하려면 gradle(build.gradle) 또는 maven(pom.xml)을 사용할 수 있습니다. 다음 예를 참고하세요

Synthetics 라이브러리의 컴파일 시간 종속성 또는 인터페이스에 대한 자세한 내용은 [aws-cloudwatch-synthetics-sdk-java](https://github.com/aws/aws-cloudwatch-synthetics-sdk-java/tree/main)의 README를 참조하세요.

```
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    // Third party dependencies 
    // example: implementation 'software.amazon.awssdk:s3:2.31.9'
    
    // Declares dependency on Synthetics interfaces for compiling only
    // Refer https://github.com/aws/aws-cloudwatch-synthetics-sdk-java for building from source.
    compileOnly 'software.amazon.synthetics:aws-cloudwatch-synthetics-sdk-java:1.0.0'}

test {
    useJUnitPlatform()
}

// Build the zip to be used as Canary code.
task buildZip(type: Zip) {

    archiveFileName.set("example-canary.zip")
    destinationDirectory.set(file("$buildDir"))
    
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
        from(tasks.named("jar"))
    }
    from "src/main/java/resources/synthetics.json"
    
    doLast {
        println "Artifact written to: ${archiveFile.get().asFile.absolutePath}"
    }
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

tasks.named("build") {
    dependsOn "buildZip"
}
```

## 핸들러 이름
<a name="Synthetics_canary_Java_handler"></a>

핸들러 이름은 카나리의 진입점입니다. Java 런타임의 경우 핸들러의 형식은 다음과 같습니다.

```
<<full qualified name for canary class>>::<<name of the method to start the execution from>>
// for above code: canarypackage.ExampleCanary::canaryCode
```

## CloudWatch Synthetics 구성
<a name="Synthetics_canary_Java_config"></a>

`synthetics.json`이라는 선택적 JSON 구성 파일을 제공하여 Synthetics Java 런타임의 동작을 구성할 수 있습니다. 이 파일은 패키지 zip 파일의 루트 디렉터리에 패키징되어야 합니다. 구성 파일은 선택 사항이지만, 구성 파일을 제공하지 않거나 구성 키가 누락된 경우 CloudWatch는 기본값을 사용합니다.

지원되는 구성 값과 기본값은 다음과 같습니다.

```
{
    "step": {
        "stepSuccessMetric": true,
        "stepDurationMetric": true,
        "continueOnStepFailure": false,
        "stepsReport": true
    },
    "logging": {
        "logRequest": false,
        "logResponse": false
    },
    "httpMetrics": {
        "metric_2xx": true,
        "metric_4xx": true,
        "metric_5xx": true,
        "aggregated2xxMetric": true,
        "aggregated4xxMetric": true,
        "aggregated5xxMetric": true
    },
    "canaryMetrics": {
        "failedCanaryMetric": true,
        "aggregatedFailedCanaryMetric": true
    }
}
```

 **단계 구성** 
+ *continueOnStepFailure* – 단계가 실패한 후에도 스크립트를 계속할지 결정합니다. 기본값은 false입니다.
+ *stepSuccessMetric* – 단계의 ` SuccessPercent` 지표를 내보낼지 결정합니다. 단계가 성공할 경우 카나리 실행에 대한 단계의 `SuccessPercent` 지표는 *100*이고, 단계가 실패할 경우에는 *0*입니다. 기본값은 *true*입니다.
+ *stepDurationMetric* – 단계의 *Duration* 지표를 내보낼지 결정합니다. *Duration* 지표는 단계 실행의 지속 기간으로, 밀리초 단위로 내보냅니다. 기본값은 *true*입니다.

 **로깅 구성** 

CloudWatch Synthetics에서 생성한 로그에 적용됩니다. 요청 및 응답 로그의 상세 수준을 제어합니다.
+ *logRequest* - 카나리 로그에 모든 요청을 로그할지 여부를 지정합니다. 기본값은 false입니다.
+ *logResponse* - 카나리 로그에 모든 응답을 로그할지 여부를 지정합니다. 기본값은 false입니다.

 **HTTP 지표 구성** 

이 카나리에 대해 CloudWatch Synthetics에서 내보내는 HTTP 상태 코드가 서로 다른 네트워크 요청 수와 관련된 지표의 구성입니다.
+ *metric\$12xx* -이 카나리에 대한 *2xx* 지표(CanaryName 차원 포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.
+ *metric\$14xx* -이 카나리에 대한 *4xx* 지표(CanaryName 차원 포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.
+ *metric\$15xx* -이 카나리에 대한 *5xx* 지표(CanaryName 차원 포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.
+ *aggregated2xxMetric* -이 카나리에 대한 *2xx* 지표(CanaryName 차원 미포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.
+ *aggregated4xxMetric* -이 카나리에 대한 *4xx* 지표(CanaryName 차원 미포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.
+ *aggregated5xxMetric* -이 카나리에 대한 *5xx* 지표(CanaryName 차원 미포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.

 **카나리 지표 구성** 

CloudWatch Synthetics에서 내보낸 다른 지표에 대한 구성입니다.
+ *failedCanaryMetric* - Network Access Analyzer가 카나리에 대한 *Failed* 지표(CanaryName 차원 포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.
+ *aggregatedFailedCanaryMetric* -이 카나리에 대한 *Failed* 지표(CanaryName 차원 미포함)를 내보낼지 여부를 지정합니다. 기본값은 *true*입니다.

## CloudWatch Synthetics 환경 변수
<a name="Synthetics_canary_Java_variables"></a>

환경 변수를 사용하여 로깅 수준 및 형식을 구성할 수 있습니다.

 **로그 형식** 

CloudWatch Synthetics Java 런타임은 모든 카나리 실행에 대해 CloudWatch 로그를 생성합니다. 로그는 편리한 쿼리를 위해 JSON 형식으로 작성됩니다. 로그 형식을 *TEXT*로 변경할 수 있습니다.
+ *환경 변수 이름* – CW\$1SYNTHETICS\$1LOG\$1FORMAT
+ *지원되는 값* - JSON, TEXT
+ *기본값* – JSON

 **로그 수준** 
+ *환경 변수 이름* - CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ *지원되는 값* - TRACE, DEBUG, INFO, WARN, ERROR, FATAL
+ *기본값* – INFO

위의 환경 변수 외에도 Java 런타임에 대한 기본 환경 변수인 `AWS_LAMBDA-EXEC_WRAPPER` 환경 변수가 함수에 추가되고, 값은 `/opt/synthetics-otel-instrument`로 설정됩니다. 이 환경 변수는 원격 측정에 대한 함수의 시작 동작을 수정합니다. 이 환경 변수가 이미 있는 경우 필수 값으로 설정되어야 합니다.

# Playwright 런타임을 사용하여 Node.js 카나리 스크립트 작성
<a name="Synthetics_WritingCanary_Nodejs_Playwright"></a>

**Topics**
+ [Playwright 런타임을 위한 Node.js 카나리 파일 패키징](#Synthetics_canary_Nodejs_Playwright_package)
+ [기존 Playwright 스크립트를 변경하여 CloudWatch Synthetics 카나리로 사용](#CloudWatch_Synthetics_canary_edit_Playwright_script)
+ [CloudWatch Synthetics 구성](#Synthetics_canary_configure_Playwright_script)

## Playwright 런타임을 위한 Node.js 카나리 파일 패키징
<a name="Synthetics_canary_Nodejs_Playwright_package"></a>

 카나리 스크립트는 Synthetics 핸들러 코드가 포함된 `.js`(CommonJS 구문) 또는 `.mjs`(ES 구문) 파일, 그리고 코드가 의존하는 추가 패키지 및 모듈로 구성됩니다. ES(ECMAScript) 형식으로 생성된 스크립트는 확장명으로 .mjs를 사용하거나, "type": "module" 필드 세트가 있는 package.json 파일을 포함해야 합니다. Node.js Puppeteer 같은 여타 런타임과 달리, 스크립트를 특정 폴더 구조에 저장하지 않아도 됩니다. 스크립트를 직접 패키징할 수 있습니다. 선호하는 `zip` 유틸리티를 사용하여 루트에 핸들러 파일이 있는 `.zip` 파일을 생성합니다. 카나리 스크립트가 Synthetics 런타임에 포함되지 않은 추가 패키지 또는 모듈에 의존하는 경우, `.zip` 파일에 이러한 종속성을 추가할 수 있습니다. 이렇게 하려면 `npm install` 명령을 실행하여 함수의 필수 라이브러리를 `node_modules` 디렉터리에 설치할 수 있습니다. 다음 예제 CLI 명령은 `index.js` 또는 `index.mjs` 파일(Synthetics 핸들러)이 포함된 `my_deployment_package.zip`이라는 이름의 `.zip` 파일을 생성합니다. 이 예제에서는 `npm` 패키지 관리자를 사용하여 종속 항목을 설치합니다.

```
~/my_function
├── index.mjs
├── synthetics.json
├── myhelper-util.mjs    
└── node_modules
    ├── mydependency
```

루트에 프로젝트 폴더의 콘텐츠가 포함된 `.zip` 파일을 만듭니다. 다음 예제와 같이 `r`(재귀) 옵션을 사용하여 `zip`이 하위 폴더를 압축하도록 합니다.

```
zip -r my_deployment_package.zip .
```

Synthetics 구성 파일을 추가하여 CloudWatch Synthetics의 동작을 구성합니다. `synthetics.json` 파일을 생성하고, 진입점 또는 핸들러 파일과 동일한 경로에 이 파일을 저장할 수 있습니다.

선택에 따라, 원하는 폴더 구조에 진입점 파일을 저장할 수도 있습니다. 그러나 폴더 경로가 핸들러 이름에 지정되어 있어야 합니다.

 **핸들러 이름** 

스크립트 진입점의 파일 이름과 일치하도록 canary의 스크립트 진입점(핸들러)을 ` myCanaryFilename.functionName`으로 설정해야 합니다. 카나리를 ` myFolder/my_canary_filename.mjs` 같은 별도의 폴더에 저장할 수도 있습니다. 별도의 폴더에 저장하는 경우 스크립트 진입점에 해당 경로를 지정합니다(예: ` myFolder/my_canary_filename.functionName`).

## 기존 Playwright 스크립트를 변경하여 CloudWatch Synthetics 카나리로 사용
<a name="CloudWatch_Synthetics_canary_edit_Playwright_script"></a>

카나리로 사용할 Node.js 및 Playwright의 기존 스크립트를 편집할 수 있습니다. Playwright에 대한 자세한 내용은 [Playwright library](https://playwright.dev/docs/api/class-playwright) 설명서를 참조하세요.

` exampleCanary.mjs` 파일에 저장된 다음과 같은 Playwright 스크립트를 사용할 수 있습니다.

```
import { chromium } from 'playwright';
import { expect } from '@playwright/test';

const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com', {timeout: 30000});
await page.screenshot({path: 'example-home.png'});

const title = await page.title();
expect(title).toEqual("Example Domain");
 
await browser.close();
```

아래의 단계를 수행하여 스크립트를 변환합니다.

1. `handler` 함수를 생성하고 내보냅니다. 핸들러는 스크립트의 진입점 함수입니다. 핸들러 함수의 이름을 선택할 수 있지만, 스크립트에 사용되는 함수는 카나리 핸들러에 사용되는 것과 동일해야 합니다. 스크립트 이름이 `exampleCanary.mjs`이고 핸들러 함수 이름이 `myhandler`인 경우, 카나리 핸들러의 이름은 `exampleCanary.myhandler`입니다. 다음 예제에서 핸들러 함수 이름은 `handler`입니다.

   ```
   exports.handler = async () => {
     // Your script here
     };
   ```

1. 를 종속 항목`Synthetics Playwright module`으로 가져옵니다.

   ```
   import { synthetics } from '@aws/synthetics-playwright';
   ```

1. Synthetics `Launch` 함수를 사용하여 브라우저를 시작합니다.

   ```
   const browser = await synthetics.launch();
   ```

1. Synthetics `newPage` 함수를 사용하여 새 Playwright 페이지를 생성합니다.

   ```
   const page = await synthetics.newPage();
   ```

이제 스크립트를 Synthetics 카나리로 실행할 준비가 되었습니다. 다음은 업데이트된 스크립트입니다.

 **ES6 형식의 업데이트된 스크립트** 

`.mjs` 확장명으로 저장된 스크립트 파일입니다.

```
import { synthetics } from '@aws/synthetics-playwright';
import { expect } from '@playwright/test';

export const handler = async (event, context) => {
  try {
        // Launch a browser
        const browser = await synthetics.launch();
        
        // Create a new page
        const page = await synthetics.newPage(browser);
        
        // Navigate to a website
        await page.goto('https://www.example.com', {timeout: 30000});
        
        // Take screenshot
        await page.screenshot({ path: '/tmp/example.png' });
        
        // Verify the page title
        const title = await page.title();
        expect(title).toEqual("Example Domain");
    } finally {
        // Ensure browser is closed
        await synthetics.close();
    }
};
```

 **CommonJS 형식으로 업데이트된 스크립트** 

`.js` 확장명으로 저장된 스크립트 파일입니다.

```
const { synthetics } = require('@aws/synthetics-playwright');
const { expect } = require('@playwright/test');

exports.handler = async (event) => {
  try {
    const browser = await synthetics.launch();
    const page = await synthetics.newPage(browser);
    await page.goto('https://www.example.com', {timeout: 30000});
    await page.screenshot({ path: '/tmp/example.png' });
    const title = await page.title();
    expect(title).toEqual("Example Domain");
  } finally {
    await synthetics.close();
  }
};
```

## CloudWatch Synthetics 구성
<a name="Synthetics_canary_configure_Playwright_script"></a>

`synthetics.json`이라는 이름의 선택적 JSON 구성 파일을 제공하여 Synthetics Playwright 런타임의 동작을 구성할 수 있습니다. 이 파일은 핸들러 파일과 동일한 위치에 패키징해야 합니다. 구성 파일은 선택 사항이지만, 구성 파일을 제공하지 않거나 구성 키가 누락된 경우 CloudWatch는 기본값을 가져옵니다.

 **구성 파일 패키징** 

지원되는 구성 값과 기본값은 다음과 같습니다.

```
{
    "step": {
        "screenshotOnStepStart": false,
        "screenshotOnStepSuccess": false,
        "screenshotOnStepFailure": false,
        "stepSuccessMetric": true,
        "stepDurationMetric": true,
        "continueOnStepFailure": true,
        "stepsReport": true
    },
    "report": {
        "includeRequestHeaders": true,
        "includeResponseHeaders": true,
        "includeUrlPassword": false,
        "includeRequestBody": true,
        "includeResponseBody": true,
        "restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports
        "restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these url parameters are redacted from logs and reports
    },
    "logging": {
        "logRequest": false,
        "logResponse": false,
        "logResponseBody": false,
        "logRequestBody": false,
        "logRequestHeaders": false,
        "logResponseHeaders": false
    },
    "httpMetrics": {
        "metric_2xx": true,
        "metric_4xx": true,
        "metric_5xx": true,
        "failedRequestsMetric": true,
        "aggregatedFailedRequestsMetric": true,
        "aggregated2xxMetric": true,
        "aggregated4xxMetric": true,
        "aggregated5xxMetric": true
    },
    "canaryMetrics": {
        "failedCanaryMetric": true,
        "aggregatedFailedCanaryMetric": true
    },
    "userAgent": "",
    "har": true
}
```

 **단계 구성** 
+ `screenshotOnStepStart` – 단계를 시작하기 전에 Synthetics가 스크린샷을 캡처해야 하는지 결정합니다. 기본값은 `true`입니다.
+ `screenshotOnStepSuccess` - 단계가 성공한 후 Synthetics가 스크린샷을 캡처해야 하는지 결정합니다. 기본값은 `true`입니다.
+ `screenshotOnStepFailure` - 단계가 실패한 후 Synthetics가 스크린샷을 캡처해야 하는지 결정합니다. 기본값은 `true`입니다.
+ `continueOnStepFailure` - 단계가 실패한 후에도 스크립트를 계속할지 결정합니다. 기본값은 `false`입니다.
+ `stepSuccessMetric` - 단계의 ` SuccessPercent` 지표를 내보낼지 결정합니다. 단계가 성공할 경우 카나리 실행에 대한 단계의 `SuccessPercent` 지표는 `100`이고, 단계가 실패할 경우에는 `0`입니다. 기본값은 `true`입니다.
+ `stepDurationMetric` - 단계의 `Duration` 지표를 내보낼지 결정합니다. `Duration` 지표는 단계 실행의 지속 기간으로, 밀리초 단위로 내보냅니다. 기본값은 `true`입니다.

 **보고서 구성** 

CloudWatch Synthetics에서 생성한 모든 보고서(예: HAR 파일 및 Synthetics 단계 보고서)를 포함합니다. 민감한 데이터 수정 필드 `restrictedHeaders` 및 `restrictedUrlParameters`는 Synthetics에서 생성한 로그에도 적용됩니다.
+ `includeRequestHeaders` - 보고서에 요청 헤더를 포함할지 여부입니다. 기본값은 `false`입니다.
+ `includeResponseHeaders` - 보고서에 응답 헤더를 포함할지 여부입니다. 기본값은 `false`입니다.
+ `includeUrlPassword` - URL에 표시되는 암호를 포함할지 여부입니다. 기본적으로 URL에 표시되는 암호를 로그 및 보고서에서 삭제하여 민감한 데이터가 공개되는 것을 방지합니다. 기본값은 `false`입니다.
+ `includeRequestBody` - 보고서에 요청 본문을 포함할지 여부입니다. 기본값은 `false`입니다.
+ `includeResponseBody` - 보고서에 응답 본문을 포함할지 여부입니다. 기본값은 `false`입니다.
+ `restrictedHeaders` - 헤더가 포함된 경우 무시할 헤더 값 목록입니다. 이는 요청 헤더와 응답 헤더 모두에 적용됩니다. 예를 들어 `includeRequestHeaders`를 true로, `restrictedHeaders`를 `['Authorization']`으로 전달하여 자격 증명을 숨길 수 있습니다.
+ `restrictedUrlParameters` - 수정할 URL 경로 또는 쿼리 파라미터의 목록입니다. 이는 로그, 보고서, 오류에 표시되는 URL에 적용됩니다. 파라미터는 대소문자를 구분하지 않습니다. 별표(`*`)를 값으로 전달하여 모든 URL 경로 및 쿼리 파라미터 값을 수정할 수 있습니다. 기본값은 빈 배열입니다.
+ `har` - HTTP 아카이브(HAR)를 생성해야 하는지 결정합니다. 기본값은 `true`입니다.

다음은 보고서 구성 파일의 예입니다.

```
"includeRequestHeaders": true,
"includeResponseHeaders": true,
"includeUrlPassword": false,
"includeRequestBody": true,
"includeResponseBody": true,
"restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports
"restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these URL parameters are redacted from logs and reports
```

 **로깅 구성** 

CloudWatch Synthetics에서 생성한 로그에 적용됩니다. 요청 및 응답 로그의 상세 수준을 제어합니다.
+ `logRequest` - 카나리 로그에 모든 요청을 로그할지 여부입니다. UI canary의 경우에는 브라우저에서 보낸 각 요청을 로그합니다. 기본값은 ` false`입니다.
+ `logResponse` - 카나리 로그에 모든 응답을 로그할지 여부입니다. UI canary의 경우에는 브라우저에서 수신한 모든 응답을 로그합니다. 기본값은 ` false`입니다.
+ `logRequestBody` - 카나리 로그에 요청과 함께 요청 본문을 로그할지 여부입니다. 이 구성은 `logRequest`가 true인 경우에만 적용됩니다. 기본값은 `false`입니다.
+ `logResponseBody` - 카나리 로그에 요청과 함께 응답 본문을 로그할지 여부입니다. 이 구성은 `logResponse`가 true인 경우에만 적용됩니다. 기본값은 `false`입니다.
+ `logRequestHeaders` - 카나리 로그에 요청과 함께 요청 헤더를 로그할지 여부입니다. 이 구성은 ` logRequest`가 true인 경우에만 적용됩니다. 기본값은 `false`입니다.
+ `logResponseHeaders` - 카나리 로그에 응답과 함께 응답 헤더를 로그할지 여부입니다. 이 구성은 ` logResponse`가 true인 경우에만 적용됩니다. 기본값은 `false`입니다.

 **HTTP 지표 구성** 

이 카나리에 대해 CloudWatch Synthetics에서 내보내는 HTTP 상태 코드가 서로 다른 네트워크 요청 수와 관련된 지표의 구성입니다.
+ `metric_2xx` - 이 카나리에 대한 `2xx` 지표를(`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 ` true`입니다.
+ `metric_4xx` - 이 카나리에 대한 `4xx` 지표를(`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 ` true`입니다.
+ `metric_5xx` - 이 카나리에 대한 `5xx` 지표를(`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 ` true`입니다.
+ `failedRequestsMetric` - 이 카나리에 대한 ` failedRequests` 지표를(`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregatedFailedRequestsMetric` - 이 카나리에 대한 ` failedRequests` 지표를(`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated2xxMetric` - 이 카나리에 대한 `2xx` 지표를(`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated4xxMetric` - 이 카나리에 대한 `4xx` 지표를(`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated5xxMetric` - 이 카나리에 대한 `5xx` 지표를(`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.

 **카나리 지표 구성** 

CloudWatch Synthetics에서 내보낸 다른 지표에 대한 구성입니다.
+ `failedCanaryMetric` - 이 카나리에 대한 `Failed` 지표를(`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 ` true`입니다.
+ `aggregatedFailedCanaryMetric` - 이 카나리에 대한 ` Failed` 지표를(`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.

 **기타 구성** 
+ `userAgent` - 사용자 에이전트에 추가할 문자열입니다. 사용자 에이전트는 요청 헤더에 포함된 문자열이며, 헤드리스 브라우저를 사용할 경우 사용자가 방문하는 웹 사이트의 브라우저를 식별합니다. CloudWatch Synthetics는 `CloudWatchSynthetics/canary-arn to the user agent`를 자동으로 추가합니다. 지정된 구성이 생성된 사용자 에이전트에 추가됩니다. 기본 사용자 에이전트 값은 빈 문자열입니다(`""`).

### CloudWatch Synthetics 환경 변수
<a name="Synthetics_canary_Nodejs_Playwright_script"></a>

환경 변수를 사용하여 로깅 수준 및 형식을 구성합니다.

 **로그 형식** 

CloudWatch Synthetics Playwright 런타임은 모든 카나리 실행에 대해 CloudWatch 로그를 생성합니다. 로그는 편리한 쿼리를 위해 JSON 형식으로 작성됩니다. 원하는 경우, 로그 형식을 `TEXT`로 변경할 수 있습니다.
+ `Environment variable name` – CW\$1SYNTHETICS\$1LOG\$1FORMAT 
+ `Supported values` – JSON, TEXT 
+ `Default` – JSON 

 **로그 수준** 

`Debug` 모드를 활성화하면 상세 수준이 높아지긴 하지만, 문제 해결에 유용할 수 있습니다.
+ `Environment variable name` – CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ `Supported values` – TRACE, DEBUG, INFO, WARN, ERROR, FATAL 
+ `Default` – INFO

# Puppeteer 런타임을 사용하여 Node.js 카나리 스크립트 작성
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup"></a>

**Topics**
+ [Scratch에서 CloudWatch Synthetics canary 생성](#CloudWatch_Synthetics_Canaries_write_from_scratch)
+ [Node.js canary 파일 패키징](#CloudWatch_Synthetics_Canaries_package)
+ [기존 Puppeteer 스크립트를 변경하여 Synthetics canary로 사용](#CloudWatch_Synthetics_Canaries_modify_puppeteer_script)
+ [환경 변수](#CloudWatch_Synthetics_Environment_Variables)
+ [다른 AWS 서비스와 canary 통합](#CloudWatch_Synthetics_Canaries_AWS_integrate)
+ [canary가 고정 IP 주소를 사용하도록 지정](#CloudWatch_Synthetics_Canaries_staticIP)

## Scratch에서 CloudWatch Synthetics canary 생성
<a name="CloudWatch_Synthetics_Canaries_write_from_scratch"></a>

다음은 최소 Synthetics canary 스크립트 예입니다. 이 스크립트는 성공적인 실행으로 전달되고 문자열을 반환합니다. 실패한 canary가 어떻게 보이는지 확인하려면 `let fail = false;`를 `let fail = true;`로 변경합니다.

canary 스크립트의 진입점 함수를 정의해야 합니다. 파일이 카나리의 `ArtifactS3Location`으로 지정된 Amazon S3 위치에 어떻게 업로드되는지 보려면 `/tmp` 폴더 아래에 이러한 파일을 생성합니다. 모든 카나리 아티팩트는 유일하게 쓰기 가능한 디렉터리인 `/tmp`에 저장해야 합니다. 스크립트에서 생성한 스크린샷 또는 기타 파일에 대한 스크린샷 경로가 `/tmp`으로 설정되어 있는지 확인합니다. Synthetics는 ` /tmp`에 있는 파일을 S3 버킷에 자동으로 업로드합니다.

```
/tmp/<name>
```

스크립트가 실행되면 통과 또는 실패 상태 및 지속 시간 지표가 CloudWatch에 게시되고, `/tmp`의 파일이 S3 버킷에 업로드됩니다.

```
const basicCustomEntryPoint = async function () {

    // Insert your code here

    // Perform multi-step pass/fail check

    // Log decisions made and results to /tmp

    // Be sure to wait for all your code paths to complete 
    // before returning control back to Synthetics.
    // In that way, your canary will not finish and report success
    // before your code has finished executing

    // Throw to fail, return to succeed
    let fail = false;
    if (fail) {
        throw "Failed basicCanary check.";
    }

    return "Successfully completed basicCanary checks.";
};

exports.handler = async () => {
    return await basicCustomEntryPoint();
};
```

다음으로 Synthetics 로깅을 사용하도록 스크립트를 확장하고 AWS SDK를 사용하여 호출합니다. 데모를 위해 이 스크립트는 Amazon DynamoDB 클라이언트를 생성하고 DynamoDB listTables API를 호출합니다. 요청에 대한 응답을 로깅하고 요청이 성공했는지 여부에 따라 성공 또는 실패를 로깅합니다.

```
const log = require('@aws/synthetics-logger');
const AWS = require('aws-sdk');
// Require any dependencies that your script needs
// Bundle additional files and dependencies into a .zip file with folder structure
// nodejs/node_modules/additional files and folders

const basicCustomEntryPoint = async function () {

    log.info("Starting DynamoDB:listTables canary.");
    
    let dynamodb = new AWS.DynamoDB();
    var params = {};
    let request = await dynamodb.listTables(params);
    try {
        let response = await request.promise();
        log.info("listTables response: " + JSON.stringify(response));
    } catch (err) {
        log.error("listTables error: " + JSON.stringify(err), err.stack);
        throw err;
    }

    return "Successfully completed DynamoDB:listTables canary.";
};

exports.handler = async () => {
    return await basicCustomEntryPoint();
};
```

## Node.js canary 파일 패키징
<a name="CloudWatch_Synthetics_Canaries_package"></a>

 **syn-nodejs-puppeteer-11.0 이상의 경우** 

 이전 패키징 구조(syn-nodejs-puppeteer-10.0 이하)는 최신 버전에서 계속 지원됩니다.

다음 옵션 중 하나를 사용하여 스크립트를 생성합니다.
+ .js 파일(CommonJS 구문)
+ .mjs 파일(ES 모듈 구문)

ES 모듈의 경우 다음 옵션 중 하나를 사용합니다.
+ .js 파일(CommonJS 구문)
+ .mjs 파일(ES 모듈 구문)

아래에 패키지 구조가 정의되어 있습니다.
+ 루트 수준 핸들러 파일(index.js/index.mjs)
+ 선택적 구성 파일(synthetics.json)
+ node\$1modules의 추가 종속성(필요한 경우)

패키징 구조 예제:

```
  my_function/
├── index.mjs
├── synthetics.json
├── helper-utils.mjs
└── node_modules/
    └── dependencies
```

패키징하려면 아래 단계를 수행합니다.

1. 종속성(있는 경우)을 설치하세요.

   ```
   npm install
   ```

1. .zip 패키지를 생성하세요.

   ```
   zip -r my_deployment_package.zip
   ```

 **syn-nodejs-puppeteer-11.0 이하의 경우** 

Amazon S3를 사용하는 경우 다음 구조가 필요합니다.

```
  nodejs/
└── node_modules/
    └── myCanaryFilename.js
```

 **syn-nodejs-puppeteer-3.4 이상에서 선택적 하위 폴더 지원을 추가하는 방법:** 

```
nodejs/
└── node_modules/
    └── myFolder/
        └── myCanaryFilename.js
```

**참고**  
구성에서 핸들러 경로는 사용자의 파일 위치와 일치해야 합니다.

 **핸들러 이름** 

스크립트 진입점의 파일 이름과 일치하도록 canary의 스크립트 진입점(핸들러)을 ` myCanaryFilename.functionName`으로 설정해야 합니다. `syn-nodejs-puppeteer-3.4` 이전 버전의 런타임을 사용하는 경우 `functionName`은 `handler`여야 합니다. ` syn-nodejs-puppeteer-3.4` 이상을 사용 중인 경우 함수 이름을 핸들러로 선택할 수 있습니다. `syn-nodejs-puppeteer-3.4` 이상을 사용 중인 경우 canary를 별도의 폴더에 저장할 수도 있습니다(예: ` nodejs/node_modules/myFolder/my_canary_filename`). 별도의 폴더에 저장하는 경우 스크립트 진입점에 해당 경로를 지정합니다(예: ` myFolder/my_canary_filename.functionName`).

## 기존 Puppeteer 스크립트를 변경하여 Synthetics canary로 사용
<a name="CloudWatch_Synthetics_Canaries_modify_puppeteer_script"></a>

이 섹션에서는 Puppeteer 스크립트를 가져와서 Synthetics canary 스크립트로 실행하도록 수정하는 방법에 대해 설명합니다. Puppeteer에 대한 자세한 내용은 [Puppeteer API v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md)을 참조하세요.

다음 Puppeteer 스크립트 예로 시작하겠습니다.

```
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();
```

변환 단계는 다음과 같습니다.
+ `handler` 함수를 생성하고 내보냅니다. 핸들러는 스크립트의 진입점 함수입니다. ` syn-nodejs-puppeteer-3.4` 이전 버전의 런타임을 사용하는 경우 핸들러 함수의 이름을 `handler`로 지정해야 합니다. `syn-nodejs-puppeteer-3.4` 이상을 사용하는 경우 함수 이름은 맘대로 지정할 수 있지만 스크립트에서 사용되는 이름과 같아야 합니다. 또한 `syn-nodejs-puppeteer-3.4` 이상을 사용하는 경우 스크립트를 아무 폴더 아래에 저장하고 해당 폴더를 핸들러 이름의 일부로 지정할 수 있습니다.

  ```
  const basicPuppeteerExample = async function () {};
  
  exports.handler = async () => {
      return await basicPuppeteerExample();
  };
  ```
+ `Synthetics` 종속성을 사용합니다.

  ```
  var synthetics = require('@aws/synthetics-puppeteer');
  ```
+ `Synthetics.getPage` 함수를 사용하여 Puppeteer `Page` 객체를 가져옵니다.

  ```
  const page = await synthetics.getPage();
  ```

  Synthetics.getPage 함수에 의해 반환되는 페이지 객체에는 로깅을 위해 구성된 **page.on** `request`, `response` 및 ` requestfailed` 이벤트가 있습니다. 또한 Synthetics에서는 페이지의 요청 및 응답에 대한 HAR 파일 생성을 설정하고 canary ARN을 페이지의 발신 요청의 사용자 에이전트 헤더에 추가합니다.

이제 스크립트를 Synthetics canary로 실행할 준비가 되었습니다. 다음은 업데이트된 스크립트입니다.

```
var synthetics = require('@aws/synthetics-puppeteer');  // Synthetics dependency

const basicPuppeteerExample = async function () {
    const page = await synthetics.getPage(); // Get instrumented page from Synthetics
    await page.goto('https://example.com');
    await page.screenshot({path: '/tmp/example.png'}); // Write screenshot to /tmp folder
};

exports.handler = async () => {  // Exported handler function 
    return await basicPuppeteerExample();
};
```

## 환경 변수
<a name="CloudWatch_Synthetics_Environment_Variables"></a>

canary를 생성할 때 환경 변수를 사용할 수 있습니다. 환경 변수를 사용하면 단일 canary 스크립트를 작성한 다음, 다양한 값과 함께 해당 스크립트를 사용하여 유사한 태스크가 있는 여러 canary를 빠르게 생성할 수 있습니다.

예를 들어 조직에 소프트웨어 개발의 다양한 단계에 대한 엔드포인트(예: `prod`, ` dev`, `pre-release`)가 있으며 이러한 엔드포인트 각각을 테스트하기 위해 canary를 생성해야 한다고 가정합니다. 소프트웨어를 테스트하는 단일 canary 스크립트를 작성한 다음, 세 개의 canary 각각을 생성할 때 엔드포인트 환경 변수에 대해 다양한 값을 지정할 수 있습니다. 그런 다음, canary를 생성할 때 스크립트 및 환경 변수에 사용할 값을 지정합니다.

환경 변수의 이름에는 문자, 숫자, 밑줄 문자가 포함될 수 있습니다. 이름은 문자로 시작해야 하며 2자 이상이어야 합니다. 환경 변수의 총 크기는 4KB를 초과할 수 없습니다. Lambda 예약 환경 변수를 환경 변수의 이름으로 지정할 수 없습니다. 예약된 환경 변수에 대한 자세한 내용은 [런타임 환경 변수](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime) 단원을 참조하세요.

**중요**  
환경 변수 키와 값은 AWS 소유 AWS KMS 키를 사용하여 저장 시 암호화됩니다. 그러나 클라이언트 측의 환경 변수는 암호화되지 않습니다. 환경 변수 키와 값에 민감한 정보를 저장하지 마세요.

다음 스크립트 예에서는 두 개의 환경 변수를 사용합니다. 이 스크립트는 웹 페이지를 사용할 수 있는지 여부를 확인하는 canary용입니다. 환경 변수를 사용하여 확인하는 URL과 사용하는 CloudWatch Synthetics 로그 수준을 모두 파라미터화합니다.

다음 함수는 `LogLevel`을 ` LOG_LEVEL` 환경 변수의 값으로 설정합니다.

```
 synthetics.setLogLevel(process.env.LOG_LEVEL);
```

다음 함수는 `URL`을 `URL` 환경 변수의 값으로 설정합니다.

```
const URL = process.env.URL;
```

다음 코드는 완전한 스크립트입니다. 이 스크립트를 사용하여 canary를 생성할 때 `LOG_LEVEL` 및 `URL` 환경 변수의 값을 지정합니다.

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');

const pageLoadEnvironmentVariable = async function () {

    // Setting the log level (0-3)
    synthetics.setLogLevel(process.env.LOG_LEVEL);
    // INSERT URL here
    const URL = process.env.URL;

    let page = await synthetics.getPage();
    //You can customize the wait condition here. For instance,
    //using 'networkidle2' may be less restrictive.
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    if (!response) {
        throw "Failed to load page!";
    }
    //Wait for page to render.
    //Increase or decrease wait time based on endpoint being monitored.
    await page.waitFor(15000);
    await synthetics.takeScreenshot('loaded', 'loaded');
    let pageTitle = await page.title();
    log.info('Page title: ' + pageTitle);
    log.debug('Environment variable:' + process.env.URL);

    //If the response status code is not a 2xx success code
    if (response.status() < 200 || response.status() > 299) {
        throw "Failed to load page!";
    }
};

exports.handler = async () => {
    return await pageLoadEnvironmentVariable();
};
```

### 스크립트에 환경 변수 전달
<a name="CloudWatch_Synthetics_Canaries_pass_variables"></a>

콘솔에서 canary를 생성할 때 스크립트에 환경 변수를 전달하려면 콘솔의 [**환경 변수(Environment variables)**] 섹션에서 환경 변수의 키 및 값을 지정합니다. 자세한 내용은 [canary 생성](CloudWatch_Synthetics_Canaries_Create.md) 단원을 참조하세요.

API 또는 AWS CLI를 통해 환경 변수를 전달하려면 `RunConfig` 섹션에서 ` EnvironmentVariables` 파라미터를 사용합니다. 다음은 `Environment` 및 `Region` 키가 있는 두 개의 환경 변수를 사용하는 canary를 생성하는 AWS CLI 명령의 예입니다.

```
aws synthetics create-canary --cli-input-json '{
   "Name":"nameofCanary",
   "ExecutionRoleArn":"roleArn",
   "ArtifactS3Location":"s3://amzn-s3-demo-bucket-123456789012-us-west-2",
   "Schedule":{
      "Expression":"rate(0 minute)",
      "DurationInSeconds":604800
   },
   "Code":{
      "S3Bucket": "canarycreation",
      "S3Key": "cwsyn-mycanaryheartbeat-12345678-d1bd-1234-abcd-123456789012-12345678-6a1f-47c3-b291-123456789012.zip",
      "Handler":"pageLoadBlueprint.handler"
   },
   "RunConfig": {
      "TimeoutInSeconds":60,
      "EnvironmentVariables": {
         "Environment":"Production",
         "Region": "us-west-1"
      }
   },
   "SuccessRetentionPeriodInDays":13,
   "FailureRetentionPeriodInDays":13,
   "RuntimeVersion":"syn-nodejs-2.0"
}'
```

## 다른 AWS 서비스와 canary 통합
<a name="CloudWatch_Synthetics_Canaries_AWS_integrate"></a>

모든 canary는 AWS SDK 라이브러리를 사용할 수 있습니다. canary를 다른 AWS 서비스와 통합하기 위해 canary를 작성할 때 이 라이브러리를 사용할 수 있습니다.

이렇게 하려면 canary에 다음 코드를 추가해야 합니다. 다음 예에서는 AWS Secrets Manager가 canary와 통합되는 서비스로 사용됩니다.
+ AWS SDK를 가져옵니다.

  ```
  const AWS = require('aws-sdk');
  ```
+ 통합하려는 AWS 서비스에 대한 클라이언트를 생성합니다.

  ```
  const secretsManager = new AWS.SecretsManager();
  ```
+ 클라이언트를 사용하여 해당 서비스에 대한 API 호출을 수행합니다.

  ```
  var params = {
    SecretId: secretName
  };
  return await secretsManager.getSecretValue(params).promise();
  ```

다음 canary 스크립트 코드 조각은 Secrets Manager와의 통합 예를 자세히 보여 줍니다.

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');
 
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();
 
const getSecrets = async (secretName) => {
    var params = {
        SecretId: secretName
    };
    return await secretsManager.getSecretValue(params).promise();
}
 
const secretsExample = async function () {
    let URL = "<URL>";
    let page = await synthetics.getPage();
    
    log.info(`Navigating to URL: ${URL}`);
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    
    // Fetch secrets
    let secrets = await getSecrets("secretname")
   
    /**
    * Use secrets to login. 
    *
    * Assuming secrets are stored in a JSON format like:
    * {
    *   "username": "<USERNAME>",
    *   "password": "<PASSWORD>"
    * }
    **/
    let secretsObj = JSON.parse(secrets.SecretString);
    await synthetics.executeStep('login', async function () {
        await page.type(">USERNAME-INPUT-SELECTOR<", secretsObj.username);
        await page.type(">PASSWORD-INPUT-SELECTOR<", secretsObj.password);
        
        await Promise.all([
          page.waitForNavigation({ timeout: 30000 }),
          await page.click(">SUBMIT-BUTTON-SELECTOR<")
        ]);
    });
   
    // Verify login was successful
    await synthetics.executeStep('verify', async function () {
        await page.waitForXPath(">SELECTOR<", { timeout: 30000 });
    });
};

exports.handler = async () => {
    return await secretsExample();
};
```

## canary가 고정 IP 주소를 사용하도록 지정
<a name="CloudWatch_Synthetics_Canaries_staticIP"></a>

canary가 고정 IP 주소를 사용하도록 canary를 설정할 수 있습니다.

**canary가 고정 IP 주소를 사용하도록 지정하려면**

1. 새 VPC를 생성합니다. 자세한 내용은 [VPC에서 DNS 사용하기](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html) 단원을 참조하세요.

1. 새 인터넷 게이트웨이를 생성합니다. 자세한 내용은 [VPC에 인터넷 게이트웨이 추가](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#working-with-igw) 단원을 참조하세요.

1. 새 VPC 내부에 퍼블릭 서브넷을 생성합니다.

1. VPC에 새 라우팅 테이블을 추가합니다.

1. `0.0.0.0/0`에서 인터넷 게이트웨이로 이동하는 경로를 새 라우팅 테이블에 추가합니다.

1. 새 라우팅 테이블을 퍼블릭 서브넷과 연결합니다.

1. 탄력적 IP 주소를 생성합니다. 자세한 내용은 [탄력적 IP 주소](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) 단원을 참조하세요.

1. 새 NAT 게이트웨이를 생성하여 퍼블릭 서브넷 및 탄력적 IP 주소에 할당합니다.

1. VPC 내부에 프라이빗 서브넷을 생성합니다.

1. `0.0.0.0/0`에서 NAT 게이트웨이로 이동하는 경로를 VPC 기본 라우팅 테이블에 추가합니다.

1. canary를 생성합니다.

# Python canary 스크립트 작성
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python"></a>

이 스크립트는 성공적인 실행으로 전달되고 문자열을 반환합니다. 실패한 canary가 어떻게 보이는지 확인하려면 fail = False를 fail = True로 변경합니다.

```
def basic_custom_script():
    # Insert your code here
    # Perform multi-step pass/fail check
    # Log decisions made and results to /tmp
    # Be sure to wait for all your code paths to complete 
    # before returning control back to Synthetics.
    # In that way, your canary will not finish and report success
    # before your code has finished executing
    fail = False
    if fail:
        raise Exception("Failed basicCanary check.")
    return "Successfully completed basicCanary checks."
def handler(event, context):
    return basic_custom_script()
```

## Python canary 파일 패키징
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_package"></a>

.py 파일이 두 개 이상 있거나 스크립트에 종속 항목이 있는 경우 이들을 모두 단일 ZIP 파일로 번들링할 수 있습니다. `syn-python-selenium-1.1` 런타임을 사용하는 경우 ZIP 파일은 `python` 폴더 내에 주요 canary .py 파일을 포함해야 합니다(예: `python/my_canary_filename.py`). ` syn-python-selenium-1.1` 이상을 사용하는 경우 다른 폴더를 사용할 수 있습니다(예: `python/myFolder/my_canary_filename.py`).

이 ZIP 파일은 필요한 모든 폴더와 파일을 포함해야 하지만, `python` 폴더의 다른 파일을 포함하지 않아도 됩니다.

스크립트 진입점의 파일 이름 및 함수 이름과 일치하도록 canary의 스크립트 진입점을 ` my_canary_filename.functionName`으로 설정해야 합니다. `syn-python-selenium-1.0` 런타임을 사용하는 경우 `functionName`은 `handler`여야 합니다. ` syn-python-selenium-1.1` 이상을 사용 중인 경우 이 핸들러 이름 제한은 적용되지 않으며 canary를 별도의 폴더에 저장할 수도 있습니다(예: ` python/myFolder/my_canary_filename.py`). 별도의 폴더에 저장하는 경우 스크립트 진입점에 해당 경로를 지정합니다(예: ` myFolder/my_canary_filename.functionName`).

## 기존 Selenium 스크립트를 변경하여 Synthetics canary로 사용
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_Selenium"></a>

canary로 사용할 기존의 Python 및 Selenium 스크립트를 빠르게 수정할 수 있습니다. Selenium에 대한 자세한 내용은 [www.selenium.dev/](https://www.selenium.dev/)를 참조하세요.

이 예에서는 다음 Selenium 스크립트로 시작합니다.

```
from selenium import webdriver

def basic_selenium_script():
    browser = webdriver.Chrome()
    browser.get('https://example.com')
    browser.save_screenshot('loaded.png')

basic_selenium_script()
```

변환 단계는 다음과 같습니다.

**canary로 사용할 Selenium 스크립트를 변환하려면**

1. 다음과 같이 ` aws_synthetics` 모듈의 Selenium을 사용하도록 `import` 문을 변경합니다.

   ```
   from aws_synthetics.selenium import synthetics_webdriver as webdriver
   ```

   `aws_synthetics`의 Selenium 모듈은 canary가 지표 및 로그를 내보내고 HAR 파일을 생성하며 다른 CloudWatch Synthetics 기능과 함께 작동할 수 있도록 합니다.

1. 핸들러 함수를 생성하고 Selenium 메서드를 호출합니다. 핸들러는 스크립트의 진입점 함수입니다.

   `syn-python-selenium-1.0`을 사용하는 경우 핸들러 함수의 이름을 `handler`로 지정해야 합니다. `syn-python-selenium-1.1` 이상을 사용하는 경우 함수 이름은 맘대로 지정할 수 있지만 스크립트에서 사용되는 이름과 같아야 합니다. 또한 `syn-python-selenium-1.1` 이상을 사용하는 경우 스크립트를 아무 폴더 아래에 저장하고 해당 폴더를 핸들러 이름의 일부로 지정할 수 있습니다.

   ```
   def handler(event, context):
       basic_selenium_script()
   ```

이제 스크립트가 CloudWatch Synthetics canary로 업데이트되었습니다. 다음은 업데이트된 스크립트입니다.

`webdriver`는 [SyntheticsWebDriver](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver) 클래스의 인스턴스이고, `webdriver.Chrome()`에서 반환하는 브라우저는 [SyntheticsBrowser](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsBrowser)의 인스턴스입니다.

```
from aws_synthetics.selenium import synthetics_webdriver as webdriver

def basic_selenium_script():
    browser = webdriver.Chrome()
    browser.get('https://example.com')
    browser.save_screenshot('loaded.png')

def handler(event, context):
    basic_selenium_script()
```

## 비표준 인증서를 인증하도록 기존 Puppeteer Synthetics 스크립트 변경
<a name="Canaries_Non-Standard_Certificates"></a>

Synthetics canary의 중요한 사용 사례 중 하나는 자체 엔드포인트를 모니터링하는 것입니다. 외부 트래픽을 수용할 준비가 되지 않은 엔드포인트를 모니터링하려는 경우 이러한 모니터링으로 인해 신뢰할 수 있는 타사 인증 기관에서 서명한 적절한 인증서가 없는 경우가 있을 수 있습니다.

이 시나리오에 대해 다음과 같이 두 가지 해결 방법이 있습니다.
+ 클라이언트 인증서를 인증하려면 [Amazon CloudWatch Synthetics를 사용하여 인증을 검증하는 방법-2부](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-using-amazon-cloudwatch-synthetics-part-2/)를 참조하십시오.
+ 자체 서명된 인증서를 인증하려면 [Amazon CloudWatch Synthetics에서 자체 서명된 인증서를 사용하여 인증을 검증하는 방법](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-with-self-signed-certificates-in-amazon-cloudwatch-synthetics/)을 참조하십시오.

CloudWatch Synthetics canary를 사용할 때는 이 두 가지 옵션에만 국한되지 않습니다. canary 코드를 확장하여 이러한 특성을 확장하고 비즈니스 로직을 추가할 수 있습니다.

**참고**  
Python 런타임에서 실행되는 Synthetics canary는 기본적으로 ` --ignore-certificate-errors` 플래그가 활성화되어 있으므로 이러한 canary는 비표준 인증서 구성을 가진 사이트에 도달하는 데 문제가 없어야 합니다.

# Node.js 다중 검사 블루프린트에 대한 JSON 구성 작성
<a name="CloudWatch_Synthetics_WritingCanary_Multichecks"></a>

Node.js 다중 검사 블루프린트를 사용하면 단일 카나리 실행 내에서 여러 가지 검증 검사를 수행하는 카나리를 생성할 수 있습니다. 이 블루프린트는 여러 엔드포인트를 테스트하거나, 애플리케이션의 다양한 측면을 검증하거나, 일련의 관련된 검사를 순차적으로 수행하려는 경우에 유용합니다.

**Topics**
+ [루트 구성 구조](#root-configuration-structure)
+ [글로벌 설정](#global-settings)
+ [변수 및 데이터 관리](#variables-data-management)
+ [단계 정의](#step-definitions)
+ [검사 유형](#check-types)
+ [인증 방법](#authentication-methods)
+ [어설션 및 검증](#assertions-validation)
+ [데이터 추출](#data-extraction)

## 루트 구성 구조
<a name="root-configuration-structure"></a>

루트 구성은 고급 API 블루프린트 카나리의 전체 구조를 정의합니다.


**스키마 속성**  

| 속성 | Type | 필수 | 설명 | 
| --- | --- | --- | --- | 
|  globalSettings  | 객체 | 아니요 | 모든 단계에 적용되는 기본 구성 | 
|  variables  | 객체 | 아니요 | 단계 전체에서 재사용 가능한 값(최대 10개) | 
|  steps  | 객체 |  예  | 모니터링 단계 수집(1\$110단계) | 

 **예제** 

```
{
  "globalSettings": {
    "stepTimeout": 30000,
    "userAgent": "CloudWatch-Synthetics-Advanced/1.0"
  },
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiVersion": "v1"
  },
  "steps": {
    "1": {
      "stepName": "healthCheck",
      "checkerType": "HTTP",
      "url": "${baseUrl}/health",
      "httpMethod": "GET"
    }
  }
}
```

 **검증 규칙** 
+ 하나 이상의 단계를 포함해야 함
+ 최대 10단계 허용
+ `globalSettings`, ` variables`, `steps` 이외의 추가 속성은 허용되지 않음

## 글로벌 설정
<a name="global-settings"></a>

전역 설정은 단계 수준에서 재정의되지 않는 한 모든 단계에 적용되는 기본 구성을 제공합니다.

 **속성** 


**전역 설정 속성**  

| 속성 | Type | 기본값 | Range | 설명 | 
| --- | --- | --- | --- | --- | 
|  stepTimeout  | 정수 | 30000 | 5000\$1300000 | 모든 단계의 기본 제한 시간(밀리초) | 

 **예제** 

```
{
  "globalSettings": {
    "stepTimeout": 60000,
            
  }
}
```

## 변수 및 데이터 관리
<a name="variables-data-management"></a>

변수를 사용하면 `${variableName}` 구문을 사용하여 구성 전체에서 참조할 수 있는 재사용 가능한 값을 정의할 수 있습니다.

 **변수 속성** 


| 속성 | Type | 설명 | 
| --- | --- | --- | 
| 변수 이름 | 문자열 | ^[a-zA-Z][a-zA-Z0-9\$1]\$1\$1 패턴과 일치해야 함 | 
| 변수 값 | 문자열 | 문자열 값 | 

 **제한 사항 ** 
+ 구성당 최대 10개의 변수
+ 변수 이름은 문자로 시작해야 함
+ 변수 이름에는 문자, 숫자, 밑줄을 포함할 수 있음
+ 스키마에 지정되지 않은 최대 길이

 **예제** 

```
{
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiKey": "${AWS_SECRET:my-api-key}",
    "timeout": "30000",
    "userEmail": "test@example.com"
  }
}
```

 **구성 사용** 

```
{
  "steps": {
    "1": {
      "url": "${baseUrl}/users",
      "timeout": "${timeout}",
      "headers": {
        "Authorization": "Bearer ${apiKey}"
      }
    }
  }
}
```

## 단계 정의
<a name="step-definitions"></a>

단계는 개별 모니터링 작업을 정의합니다. 각 단계에는 1\$110까지의 번호가 지정되며 특정 유형의 검사가 포함됩니다.

 *공통 단계 속성* 


| 속성 | Type | 필수 | 설명 | 
| --- | --- | --- | --- | 
|  stepName  | 문자열 |  예  | 단계의 고유 식별자 | 
|  checkerType  | 문자열 |  예  | 검사 유형: HTTP, DNS, SSL,  TCP  | 
|  extractors  | 배열 | 아니요 | 데이터 추출 구성 | 

 *단계 이름 검증* 
+ 패턴 - ^[a-zA-Z][a-zA-Z0-9\$1-]\$1\$1
+ 최대 길이 - 64자
+ 문자로 시작해야 함

 *단계 번호 지정* 
+ 단계는 문자열 키로 번호가 지정됨: "1", "2", ..., "10"
+ 패턴: ^([1-9]\$110)\$1
+ 최소 1개의 단계 필요
+ 최대 10단계 허용

 *예제* 

```
{
  "steps": {
    "1": {
      "stepName": "loginAPI",
      "checkerType": "HTTP",
      "url": "https://api.example.com/login",
      "httpMethod": "POST"
    },
    "2": {
      "stepName": "dnsCheck",
      "checkerType": "DNS",
      "domain": "example.com"
    }
  }
}
```

## 검사 유형
<a name="check-types"></a>

### HTTP 검사
<a name="http-types"></a>

포괄적인 요청 및 응답 검증을 통해 웹 엔드포인트 및 API를 모니터링합니다.

 **필수 속성** 


| 속성 | Type | 설명 | 
| --- | --- | --- | 
|  url  | 문자열 | 대상 URL(올바른 URI 형식이어야 함) | 
|  httpMethod  | 문자열 | HTTP 메서드: GET, POST, PUT,  PATCH, DELETE, HEAD, OPTIONS  | 

 **선택적 속성** 


| 속성 | Type | 기본값 | Range | 설명 | 
| --- | --- | --- | --- | --- | 
|  timeout  | 정수 | 30000 | 5000\$1300000 | 요청 제한 시간(밀리초) | 
|  waitTime  | 정수 | 0 | 0-60 | 요청까지 걸리는 지연 시간(초) | 
|  headers  | 객체 | - | - | 사용자 지정 HTTP 헤더 | 
|  body  | 문자열 | - | - | POST/PUT 작업에 대한 요청 본문 | 
|  authentication  | 객체 | - | - | 인증 구성 | 
|  assertions  | 배열 | - | - | 응답 검증 규칙 | 

 **예제** 

```
{
  "stepName": "createUser",
  "checkerType": "HTTP",
  "url": "https://api.example.com/users",
  "httpMethod": "POST",
  "timeout": 15000,
  "headers": {
    "Content-Type": "application/json",
    "X-API-Version": "v1"
  },
  "body": "{\"name\":\"John Doe\",\"email\":\"john@example.com\"}",
  "authentication": {
    "type": "API_KEY",
    "apiKey": "${AWS_SECRET:api-credentials}",
    "headerName": "X-API-Key"
  },
  "assertions": [
    {
      "type": "STATUS_CODE",
      "operator": "EQUALS",
      "value": 201
    }
  ]
}
```

### DNS 검사
<a name="dns-types"></a>

DNS 확인 및 레코드 정보를 검증합니다.

 **필수 속성** 


| 속성 | Type | 설명 | 
| --- | --- | --- | 
|  domain  | 문자열 | 쿼리할 도메인 이름(호스트 이름 형식) | 

 **선택적 속성** 


| 속성 | Type | 기본값 | 설명 | 
| --- | --- | --- | --- | 
|  recordType  | 문자열 | "A" | DNS 레코드 유형: A, CNAME, MX,  TXT, NS  | 
|  nameserver  | 문자열 | - | 쿼리할 특정 DNS 서버 | 
|  timeout  | 정수 | 30000 | 쿼리 제한 시간(5000\$1300000ms) | 
|  port  | 정수 | 53 | DNS 서버 포트(1\$165535) | 
|  protocol  | 문자열 | "UDP" | 프로토콜: UDP 또는 TCP | 
|  assertions  | 배열 | - | DNS 응답 검증 규칙 | 

 **예제** 

```
{
  "stepName": "dnsResolution",
  "checkerType": "DNS",
  "domain": "example.com",
  "recordType": "A",
  "nameserver": "8.8.8.8",
  "timeout": 10000,
  "assertions": [
    {
      "type": "RECORD_VALUE",
      "operator": "CONTAINS",
      "value": "192.168"
    }
  ]
}
```

### SSL 검사
<a name="ssl-types"></a>

SSL 인증서 상태 및 구성을 모니터링합니다.

 **필수 속성** 


| 속성 | Type | 설명 | 
| --- | --- | --- | 
|  hostname  | 문자열 | 대상 호스트 이름(호스트 이름 형식) | 

 **선택적 속성** 


| 속성 | Type | 기본값 | 설명 | 
| --- | --- | --- | --- | 
|  port  | 정수 | 443 | SSL 포트(1\$165535) | 
|  timeout  | 정수 | 30000 | 연결 제한 시간(5000\$1300000ms) | 
|  sni  | 부울 | TRUE | 서버 이름 표시 | 
|  verifyHostname  | 부울 | TRUE | 호스트 이름 확인 | 
|  allowSelfSigned  | 부울 | FALSE | 자체 서명 인증서 수락 | 
|  assertions  | 배열 | - | 인증서 검증 규칙 | 

 **예제** 

```
{
  "stepName": "sslCertCheck",
  "checkerType": "SSL",
  "hostname": "secure.example.com",
  "port": 443,
  "sni": true,
  "verifyHostname": true,
  "assertions": [
    {
      "type": "CERTIFICATE_EXPIRY",
      "operator": "GREATER_THAN",
      "value": 30,
      "unit": "DAYS"
    }
  ]
}
```

### TCP 검사
<a name="tcp-types"></a>

TCP 포트 연결 및 응답 검증을 테스트합니다.

 **필수 속성** 


| 속성 | Type | 설명 | 
| --- | --- | --- | 
|  hostname  | 문자열 | 대상 호스트 이름(호스트 이름 형식) | 
|  port  | 정수 | 대상 포트(1\$165535) | 

 **선택적 속성** 


| 속성 | Type | 기본값 | 설명 | 
| --- | --- | --- | --- | 
|  timeout  | 정수 | 30000 | 전체 제한 시간(5000\$1300000ms) | 
|  connectionTimeout  | 정수 | 3000 | 연결 제한 시간(5000\$1300000ms) | 
|  readTimeout  | 정수 | 2000 | 데이터 읽기 제한 시간(5000\$1300000ms) | 
|  sendData  | 문자열 | - | 연결 후 전송할 데이터 | 
|  expectedResponse  | 문자열 | - | 예상 응답 데이터 | 
|  encoding  | 문자열 | "UTF-8" | 데이터 인코딩: UTF-8, ASCII, HEX  | 
|  assertions  | 배열 | - | 연결 및 응답 검증 | 

 **예제** 

```
{
  "stepName": "databaseConnection",
  "checkerType": "TCP",
  "hostname": "db.example.com",
  "port": 3306,
  "connectionTimeout": 5000,
  "sendData": "SELECT 1",
  "expectedResponse": "1",
  "assertions": [
    {
      "type": "CONNECTION_SUCCESSFUL",
      "value": true
    }
  ]
}
```

## 인증 방법
<a name="authentication-methods"></a>

 **인증 없음** 

```
{
  "type": "NONE"
}
```

 **기본 인증** 


| 속성 | Type | 필수 | 설명 | 
| --- | --- | --- | --- | 
|  type  | 문자열 |  예  | "BASIC"이어야 합니다. | 
|  username  | 문자열 |  예  | 인증에 사용할 사용자 이름 | 
|  password  | 문자열 |  예  | 인증에 사용할 암호 | 

 **예제** 

```
{
  "type": "BASIC",
  "username": "admin",
  "password": "${AWS_SECRET:basic-auth:password}"
}
```

 **API 키 인증** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "API\$1KEY"이어야 합니다. | 
|  apiKey  | 문자열 |  예  | - | API 키 값 | 
|  headerName  | 문자열 | No | "X-API-Key" | API 키의 헤더 이름 | 

 **예제** 

```
{
  "type": "API_KEY",
  "apiKey": "${AWS_SECRET:api-credentials}",
  "headerName": "Authorization"
}
```

 **OAuth 클라이언트 자격 증명** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "OAUTH\$1CLIENT\$1CREDENTIALS"이어야 합니다. | 
|  tokenUrl  | 문자열 |  예  | - | OAuth 토큰 엔드포인트 URL | 
|  clientId  | 문자열 |  예  | - | OAuth 클라이언트 ID | 
|  clientSecret  | 문자열 |  예  | - | OAuth 클라이언트 보안 암호 | 
|  scope  | 문자열 | No | - | OAuth 범위 | 
|  audience  | 문자열 | No | - | OAuth 대상 | 
|  resource  | 문자열 | No | - | OAuth 리소스 | 
|  tokenApiAuth  | 배열 | 아니요 | - | 토큰 API 인증 메서드: BASIC\$1AUTH\$1HEADER, REQUEST\$1BODY  | 
|  tokenCacheTtl  | 정수 | 아니요 | 3600 | 토큰 캐시 TTL(최소 60초) | 

 **예제** 

```
{
  "type": "OAUTH_CLIENT_CREDENTIALS",
  "tokenUrl": "https://auth.example.com/oauth/token",
  "clientId": "${AWS_SECRET:oauth-creds:client_id}",
  "clientSecret": "${AWS_SECRET:oauth-creds:client_secret}",
  "scope": "read write",
  "tokenCacheTtl": 7200
}
```

 **AWS 서명(버전 4)** 


| 속성 | Type | 필수 | 설명 | 
| --- | --- | --- | --- | 
|  type  | 문자열 |  예  | "SIGV4"이어야 합니다. | 
|  service  | 문자열 |  예  | AWS 서비스의 이름(예: "execute-api") | 
|  region  | 문자열 |  예  | AWS 리전 | 
|  roleArn  | 문자열 |  예  | 서명을 위한 IAM 역할 ARN | 

 **예제** 

```
{
  "type": "SIGV4",
  "service": "execute-api",
  "region": "us-east-1",
  "roleArn": "arn:aws:iam::123456789012:role/SyntheticsRole"
}
```

## 어설션 및 검증
<a name="assertions-validation"></a>

### HTTP 어설션
<a name="http-assertions"></a>

 **상태 코드 어설션** 


| 속성 | Type | 필수 | 설명 | 
| --- | --- | --- | --- | 
|  type  | 문자열 |  예  | "STATUS\$1CODE"이어야 합니다. | 
|  operator  | 문자열 |  예  | EQUALS, NOT\$1EQUALS, GREATER\$1THAN,  LESS\$1THAN, IN\$1RANGE | 
|  value  | 정수 | 조건부 | HTTP 상태 코드(100\$1599) | 
|  rangeMin  | 정수 | 조건부 | 최소 범위 값(IN\$1RANGE에 사용) | 
|  rangeMax  | 정수 | 조건부 | 최대 범위 값(IN\$1RANGE에 사용) | 

```
{
  "type": "STATUS_CODE",
  "operator": "EQUALS",
  "value": 200
}
```

 **응답 시간 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "RESPONSE\$1TIME"이어야 합니다. | 
|  operator  | 문자열 |  예  | - | LESS\$1THAN, GREATER\$1THAN, EQUALS | 
|  value  | number |  예  | - | 시간 값(최소 0) | 
|  unit  | 문자열 | No | "MILLISECONDS" | "MILLISECONDS"이어야 합니다. | 

```
{
  "type": "RESPONSE_TIME",
  "operator": "LESS_THAN",
  "value": 500,
  "unit": "MILLISECONDS"
}
```

 **헤드 어설션** 


| 속성 | Type | 필수 | 설명 | 
| --- | --- | --- | --- | 
|  type  | 문자열 |  예  | "HEADER"이어야 합니다. | 
|  headerName  | 문자열 |  예  | 검증할 헤더 이름 | 
|  operator  | 문자열 |  예  | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH, EXIST | 
|  value  | 문자열/부울 | 조건부 | 예상 값(EXIST 연산자의 경우 부울) | 

```
{
  "type": "HEADER",
  "headerName": "Content-Type",
  "operator": "CONTAINS",
  "value": "application/json"
}
```

 **본문 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "BODY"이어야 합니다. | 
|  target  | 문자열 | No | "JSON" | JSON 또는 TEXT | 
|  path  | 문자열 | 조건부 | - | JSONPath(JSON 대상에 필요) | 
|  operator  | 문자열 |  예  | - | CONTAINS, NOT\$1CONTAINS, EQUALS,  NOT\$1EQUALS, EXISTS | 
|  value  | 문자열/부울 |  예  | - | 예상 값(EXISTS 연산자의 경우 부울) | 

```
{
  "type": "BODY",
  "target": "JSON",
  "path": "$.users[0].name",
  "operator": "EQUALS",
  "value": "John Doe"
}
```

### DNS 어설션
<a name="dns-assertions"></a>

 **레코드 값 어설션** 


| 속성 | Type | 필수 | Range | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "RECORD\$1VALUE"이어야 합니다. | 
|  operator  | 문자열 |  예  | - | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH | 
|  value  | 문자열 |  예  | - | 예상 레코드 값 | 

 **레코드 수 어설션** 


| 속성 | Type | 필수 | Range | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "RECORD\$1COUNT"이어야 합니다. | 
|  operator  | 문자열 |  예  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | 정수 |  예  | ≥ 0 | 예상 개수(최소 0) | 

 **신뢰할 수 있는 어설션** 


| 속성 | Type | 필수 | Range | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "AUTHORITATIVE"이어야 합니다. | 
|  value  | 부울 |  예  | - | 예상되는 신뢰할 수 있는 상태 | 

 **TTL 어설션** 


| 속성 | Type | 필수 | Range | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "TTL"이어야 합니다. | 
|  operator  | 문자열 |  예  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | 정수 |  예  | ≥ 0 | 예상 TTL(최소 0) | 

### SSL 어설션
<a name="ssl-assertions"></a>

 **인증서 만료 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "CERTIFICATE\$1EXPIRY"이어야 합니다. | 
|  operator  | 문자열 |  예  | - | GREATER\$1THAN, LESS\$1THAN | 
|  value  | 정수 |  예  | - | 시간 값(최소 0) | 
|  unit  | 문자열 | No | "DAYS" | DAYS, HOURS | 

 **인증서 제목 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "CERTIFICATE\$1SUBJECT"이어야 합니다. | 
|  field  | 문자열 |  예  | - | 제목 필드: CN, O, OU, C, ST, L  | 
|  operator  | 문자열 |  예  | - | CONTAINS, EQUALS, REGEX\$1MATCH | 
|  value  | 문자열 |  예  | - | 예상 필드 값 | 

 **인증서 발급자 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "CERTIFICATE\$1ISSUER"이어야 합니다. | 
|  field  | 문자열 |  예  | - | 발급자 필드: CN, O  | 
|  operator  | 문자열 |  예  | - | CONTAINS, EQUALS | 
|  value  | 문자열 |  예  | - | 예상 필드 값 | 

### TCP 어설션
<a name="tcp-assertions"></a>

 **연결 성공 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "CONNECTION\$1SUCCESSFUL"이어야 합니다. | 
|  value  | 부울 |  예  | - | 예상 연결 상태 | 

 **응답 데이터 어설션** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  type  | 문자열 |  예  | - | "RESPONSE\$1DATA"이어야 합니다. | 
|  operator  | 문자열 |  예  | - | CONTAINS, EQUALS, NOT\$1CONTAINS,  REGEX\$1MATCH, STARTS\$1WITH, ENDS\$1WITH | 
|  value  | 문자열 |  예  | - | 예상 응답 데이터 | 
|  encoding  | 문자열 | No | "UTF-8" | UTF-8, ASCII, HEX | 

## 데이터 추출
<a name="data-extraction"></a>

추출기를 사용하면 응답에서 데이터를 캡처하여 후속 단계에서 사용하거나, 보고 목적으로 사용할 수 있습니다.

 **추출 속성** 


| 속성 | Type | 필수 | 기본값 | 설명 | 
| --- | --- | --- | --- | --- | 
|  name  | 문자열 |  예  | - | 추출된 데이터의 변수 이름 | 
|  type  | 문자열 |  예  | - | 추출 유형: BODY | 
|  path  | 문자열 | No | - | 본문 추출을 위한 JSONPath  | 
|  regex  | 문자열 | No | - | 정규식 패턴 | 
|  regexGroup  | 정수 | 아니요 | 0 | 정규식 캡처 그룹(최소 0) | 

 **추출 이름 검증** 
+ 패턴: `^[a-zA-Z][a-zA-Z0-9_]*$`
+ 문자로 시작해야 함
+ 이름에 문자, 숫자, 밑줄을 포함할 수 있음

**제한 사항** - 특정 ENUM 값이 있는 스키마의 필드에는 대체가 적용되지 않습니다.

 **추출 유형** 

```
{
  "name": "userId",
  "type": "BODY",
  "path": "$.user.id"
}
```

```
{
  "stepName": "loginAndExtract",
  "checkerType": "HTTP",
  "url": "https://api.example.com/login",
  "httpMethod": "POST",
  "body": "{\"username\":\"test\",\"password\":\"pass\"}",
  "extractors": [
    {
      "name": "textVariable",
      "type": "BODY",
      "path": "$.myvalue"
    }
  ]
},
{
  "stepName": "substituteVariable",
  "checkerType": "HTTP",
  "url": "https://api.example.com/get/${textVariable}",
  "httpMethod": "GET",
  "assertions": [
    {
    "type": "BODY",
    "target": "JSON",
    "path": "$.users[0].name",
    "operator": "EQUALS",
    "value": "${textVariable}"
    }
  ]
}
```

# canary 스크립트에 사용할 수 있는 라이브러리 함수
<a name="CloudWatch_Synthetics_Canaries_Function_Library"></a>

CloudWatch Synthetics에는 canary로 사용할 Node.js 스크립트를 작성할 때 호출할 수 있는 여러 기본 제공 클래스 및 함수가 포함되어 있습니다.

일부 클래스 및 함수는 UI canary와 API canary 모두에 적용됩니다. 다른 함수는 UI canary에만 적용됩니다. UI canary는 `getPage()` 함수를 사용하고 웹 페이지 탐색 및 상호 작용을 위한 웹 드라이버로 Puppeteer를 사용하는 canary입니다.

**참고**  
새 버전의 Synthetics 런타임을 사용하도록 canary를 업그레이드할 때마다 canary에서 사용하는 모든 Synthetics 라이브러리 함수도 Synthetics 런타임이 지원하는 것과 동일한 버전의 NodeJS로 자동 업그레이드됩니다.

**Topics**
+ [Node.js 카나리에 사용할 수 있는 라이브러리 함수](Library_function_Nodejs.md)
+ [Java 카나리에 사용할 수 있는 라이브러리 함수](CloudWatch_Synthetics_Canaries_Java.md)
+ [Playwright을 사용하여 Node.js 카나리 스크립트에 사용할 수 있는 라이브러리 함수](CloudWatch_Synthetics_Canaries_Nodejs_Playwright.md)
+ [Puppeteer를 사용하여 Node.js 카나리 스크립트에 사용할 수 있는 라이브러리 함수](CloudWatch_Synthetics_Canaries_Library_Nodejs.md)
+ [Selenium을 사용하는 Python canary 스크립트에 사용할 수 있는 라이브러리 함수](CloudWatch_Synthetics_Canaries_Library_Python.md)

# Node.js 카나리에 사용할 수 있는 라이브러리 함수
<a name="Library_function_Nodejs"></a>

이 섹션에서는 Node.js 런타임을 사용하여 카나리 스크립트에 사용할 수 있는 라이브러리 함수에 대해 설명합니다.

**Topics**
+ [addExecutionError(errorMessage, ex);](#Library_function_Nodejs_addExecutionError_Nodecanary)
+ [getCanaryName();](#Library_function_Nodejs_getCanaryName)
+ [getCanaryArn();](#Library_function_Nodejs_Nodecanary)
+ [getCanaryUserAgentString();](#Library_function_Nodejs_getCanaryUserAgentString_Nodecanary)
+ [getRuntimeVersion();](#Library_function_Nodejs_getRuntimeVersion_Nodecanary)
+ [getLogLevel()](#Library_function_Nodejs_getLogLevel_Nodecanary)
+ [setLogLevel()](#Library_function_Nodejs_setLogLevel_Nodecanary)
+ [executeStep(stepName, functionToExecute, [stepConfig])](#Library_function_Nodejs_executestep_Nodecanary)
+ [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#Library_function_Nodejs_executeHttpStep)

## addExecutionError(errorMessage, ex);
<a name="Library_function_Nodejs_addExecutionError_Nodecanary"></a>

`errorMessage`는 오류를 설명하며, `ex`는 발생한 예외입니다.

`addExecutionError`를 사용하여 canary에 대한 실행 오류를 설정할 수 있습니다. 이 함수는 스크립트 실행을 중단하지 않고 canary에 실패합니다. 또한 `successPercent` 지표에 영향을 주지 않습니다.

오류가 canary 스크립트의 성공 또는 실패를 나타내는 데 중요하지 않은 경우에만 오류를 실행 오류로 추적해야 합니다.

`addExecutionError`의 사용 예는 다음과 같습니다. 엔드포인트의 가용성을 모니터링하고 페이지가 로드된 후에 스크린샷을 생성합니다. 스크린샷 캡처 실패가 엔드포인트의 가용성을 결정하지 않기 때문에 스크린샷을 생성하는 동안 발생한 오류를 포착하여 실행 오류로 추가할 수 있습니다. 가용성 지표는 여전히 ​​엔드포인트가 실행 중임을 나타내지만 canary 상태는 실패로 표시됩니다. 다음 샘플 코드 블록은 이러한 오류를 포착하여 실행 오류로 추가합니다.

```
try {await synthetics.executeStep(stepName, callbackFunc);} catch(ex) {synthetics.addExecutionError('Unable to take screenshot ', ex);}
```

## getCanaryName();
<a name="Library_function_Nodejs_getCanaryName"></a>

canary의 이름을 반환합니다.

## getCanaryArn();
<a name="Library_function_Nodejs_Nodecanary"></a>

canary의 ARN을 반환합니다.

## getCanaryUserAgentString();
<a name="Library_function_Nodejs_getCanaryUserAgentString_Nodecanary"></a>

canary의 사용자 지정 사용자 에이전트를 반환합니다.

## getRuntimeVersion();
<a name="Library_function_Nodejs_getRuntimeVersion_Nodecanary"></a>

이 함수는 런타임 버전 `syn-nodejs-3.0` 이상에서 사용할 수 있습니다. 이 함수는 canary의 Synthetics 런타임 버전을 반환합니다. 예를 들어 반환 값이 `syn-nodejs-3.0`일 수 있습니다.

## getLogLevel()
<a name="Library_function_Nodejs_getLogLevel_Nodecanary"></a>

Synthetics 라이브러리에 대한 현재 로그 수준을 검색합니다. 가능한 값은 다음과 같습니다.
+ `0` – 디버그
+ `1` – 정보
+ `2` – 경고
+ `3` – 오류

예제:

```
let logLevel = synthetics.getLogLevel();
```

## setLogLevel()
<a name="Library_function_Nodejs_setLogLevel_Nodecanary"></a>

Synthetics 라이브러리의 로그 수준을 설정합니다. 가능한 값은 다음과 같습니다.
+ `0` – 디버그
+ `1` – 정보
+ `2` – 경고
+ `3` – 오류

예제:

```
synthetics.setLogLevel(0);
```

## executeStep(stepName, functionToExecute, [stepConfig])
<a name="Library_function_Nodejs_executestep_Nodecanary"></a>

제공된 단계를 실행하며 시작/성공/실패 로깅, 성공/실패, 기간 지표로 래핑합니다.

`executeStep` 함수는 다음 작업도 수행합니다.
+ 단계가 시작되었음을 기록합니다.
+ 타이머를 시작합니다.
+ 제공된 함수를 실행합니다.
+ 함수가 값을 정상적으로 반환하면 성공한 것으로 간주됩니다. 함수가 오류를 생성하면 실패한 것으로 간주됩니다.
+ 타이머를 종료합니다.
+ 단계 성공 또는 실패 여부를 기록합니다.
+ `stepName SuccessPercent` 지표(성공 시 100, 실패 시 0)를 내보냅니다.
+ 단계 시작 및 종료 시간 기준의 값을 사용하여 `stepName Duration metric`을 내보냅니다.
+ functionToExecute가 반환한 값을 반환하거나, ` functionToExecute`가 반환한 내용을 다시 생성합니다.
+ 카나리의 보고서에 단계 실행 요약을 추가합니다.

 **예제** 

```
await synthetics.executeStep(stepName, async function () {
    return new Promise((resolve, reject) => {
        const req = https.request(url, (res) => {
            console.log(`Status: ${res.statusCode}`);
            if (res.statusCode >= 400) {
                reject(new Error(`Request failed with status ${res.statusCode} for ${url}`));
            } else {
                resolve();
            }
        });

        req.on('error', (err) => {
            reject(new Error(`Request failed for ${url}: ${err.message}`));
        });

        req.end();
    });
});
```

## executeHttpStep(stepName, requestOptions, [callback], [stepConfig])
<a name="Library_function_Nodejs_executeHttpStep"></a>

제공된 HTTP 요청을 단계로 실행하고 `SuccessPercent`(통과 또는 실패) 및 `Duration` 지표를 게시합니다.

**executeHttpStep**은 요청에 지정된 프로토콜에 따라 내부적으로 HTTP 또는 HTTPS 네이티브 함수를 사용합니다.

이 함수는 canary의 보고서에 단계 실행 요약도 추가합니다. 요약에는 다음과 같은 각 HTTP 요청에 관한 세부 정보가 포함됩니다.
+ 시작 시간
+ 종료 시간
+ 상태(PASSED/FAILED)
+ 실패 원인(실패한 경우)
+ 요청 또는 응답 헤더, 본문, 상태 코드, 상태 메시지, 성능 타이밍과 같은 HTTP 호출 세부 정보 

**Topics**
+ [파라미터](#Library_function_Nodejs_executeHttpStep_parameters_Nodecanary)
+ [executeHttpStep 사용 예](#Library_function_Nodejs_executeHttpStep_examples_Nodecanary)

### 파라미터
<a name="Library_function_Nodejs_executeHttpStep_parameters_Nodecanary"></a>

 **stepName(*String*)** 

단계 이름을 지정합니다. 이 이름은 이 단계의 CloudWatch 지표 게시에도 사용됩니다.

 **requestOptions(*Object 또는 String*)** 

이 파라미터의 값은 URL, URL 문자열 또는 객체일 수 있습니다. 객체인 경우 HTTP 요청을 수행하기 위해 구성 가능한 옵션 집합이어야 합니다. Node.js 설명서에 있는 [http.request(options[, callback])](https://nodejs.org/api/http.html#http_http_request_options_callback)의 모든 옵션을 지원합니다.

이러한 Node.js 옵션 외에도 **requestOptions**는 추가 파라미터인 `body`를 지원합니다. `body` 파라미터를 사용하면 데이터를 요청 본문으로 전달할 수 있습니다.

 **callback(*response*)** 

(선택 사항) HTTP 응답을 사용하여 호출되는 사용자 함수입니다. 응답은 [클래스: http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage) 유형입니다.

 **stepConfig(*object*)** 

(선택 사항) 이 파라미터를 사용하여 이 단계의 다른 구성으로 글로벌 Synthetics 구성을 재정의할 수 있습니다.

### executeHttpStep 사용 예
<a name="Library_function_Nodejs_executeHttpStep_examples_Nodecanary"></a>

다음 일련의 예는 서로를 기반으로 하여 이 옵션의 다양한 사용을 보여 줍니다.

이 첫 번째 예에서는 요청 파라미터를 구성합니다. URL을 **requestOptions**로 전달할 수 있습니다.

```
let requestOptions = 'https://www.amazon.com';
```

또는 다음과 같은 옵션 집합을 전달할 수 있습니다.

```
let requestOptions = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
```

다음 예에서는 응답을 수락하는 콜백 함수를 생성합니다. 기본적으로 [**콜백(callback)**]을 지정하지 않으면 CloudWatch Synthetics는 상태가 200\$1299(포함)인지 확인합니다.

```
// Handle validation for positive scenario
    const callback = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
```

다음 예에서는 글로벌 CloudWatch Synthetics 구성을 재정의하는 이 단계의 구성을 생성합니다. 이 예에서 단계 구성은 보고서의 요청 헤더, 응답 헤더, 요청 본문(게시물 데이터), 응답 본문을 허용하고 X-Amz-Security-Token' 및 'Authorization' 헤더 값을 제한합니다. 기본적으로 이러한 값은 보안상의 이유로 보고서에 포함되지 않습니다. 이러한 값을 포함하도록 선택하는 경우 데이터는 S3 버킷에만 저장됩니다.

```
// By default headers, post data, and response body are not included in the report for security reasons. 
// Change the configuration at global level or add as step configuration for individual steps
let stepConfig = {
    includeRequestHeaders: true, 
    includeResponseHeaders: true,
    restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
    includeRequestBody: true,
    includeResponseBody: true
};
```

이 마지막 예에서는 요청을 **executeHttpStep**에 전달하고 단계의 이름을 지정합니다.

```
await synthetics.executeHttpStep('Verify GET products API', requestOptions, callback, stepConfig);
```

이 일련의 예를 통해 CloudWatch Synthetics는 보고서의 각 단계에서 세부 정보를 추가하고 **stepName**을 사용하여 각 단계의 지표를 생성합니다.

 `Verify GET products API` 단계의 `successPercent` 및 `duration` 지표를 확인할 수 있습니다. API 호출 단계의 지표를 모니터링하여 API 성능을 모니터링할 수 있습니다.

이러한 함수를 사용하는 완전한 스크립트 샘플은 [다단계 API canary](CloudWatch_Synthetics_Canaries_Samples.md#CloudWatch_Synthetics_Canaries_Samples_APIsteps) 단원을 참조하세요.

# Java 카나리에 사용할 수 있는 라이브러리 함수
<a name="CloudWatch_Synthetics_Canaries_Java"></a>

`executeStep` 함수는 카나리 코드를 모듈화하고 단계에서 실행하는 데 사용됩니다. CloudWatch Synthetics에서 Synthetics 단계는 카나리 스크립트를 명확하게 정의된 작업으로 세분화하여, 애플리케이션 여정의 다양한 부분을 개별적으로 모니터링할 수 있는 방법입니다. 각 단계에 대해 CloudWatch Synthetics는 다음을 수행합니다.
+ 각 카나리 실행에 대해 단계 지속 시간, *pass* 또는 *fail* 상태 등과 같은 단계 실행 세부 정보에 대한 요약이 포함된 보고서가 생성됩니다. CloudWatch Synthetics 콘솔에서 실행을 선택하면 **단계** 탭에서 각 단계의 실행 세부 정보를 볼 수 있습니다.
+ 각 단계에 대한 *SuccessPercent* 및 *Duration* CloudWatch 지표가 배출되므로 사용자는 각 단계의 가용성과 지연 시간을 모니터링할 수 있습니다.

   **사용량** 

  ```
  synthetics.executeStep(stepName,()->{
      try {
          //step code to be executed
          return null;
      } catch (Exception e) {
          throw e;
      }
  }).get();
  ```

   **파라미터** 
  + *stepName*, String(필수) - Synthetics 단계를 설명하는 이름입니다.
  + *실행할 함수*, Callable<T>(필수) - 실행할 작업을 나타냅니다.
  + *stepOptions*, `com.amazonaws.synthetics.StepOptions (optional)` - 단계 실행을 구성하는 데 사용할 수 있는 StepOptions 객체입니다.

    *stepConfiguration*, ` com.amazonaws.synthetics.StepConfiguration`(stepOptions의 일부분으로 필요)

 **반환** 

반환되는 값은 *CompletableFuture<T>*입니다.

**참고**  
Synthetics는 순차적 단계만 지원합니다. 후속 단계로 진행하기 전에 단계가 완료되도록 예제와 같이 `.get()` 메서드를 호출해야 합니다.

# Playwright을 사용하여 Node.js 카나리 스크립트에 사용할 수 있는 라이브러리 함수
<a name="CloudWatch_Synthetics_Canaries_Nodejs_Playwright"></a>

이 섹션에서는 Node.js Playwright 런타임을 사용하여 카나리 스크립트에 사용할 수 있는 라이브러리 함수에 대해 설명합니다.

**Topics**
+ [시작](#Synthetics_Library_Nodejs_Playwright_functions)
+ [newPage](#Synthetics_Library_Nodejs_Playwright_function_newPage)
+ [해지](#Synthetics_Library_Nodejs_Playwright_function_close)
+ [getDefaultLaunchOptions](#Synthetics_Library_Nodejs_Playwright_function_getDefaultLaunchOptions)
+ [executeStep](#Synthetics_Library_Nodejs_Playwright_function_executeStep)

## 시작
<a name="Synthetics_Library_Nodejs_Playwright_functions"></a>

이 함수는 Playwright 시작 함수를 사용하여 Chromium 브라우저를 시작하고, 브라우저 객체를 반환합니다. 브라우저 바이너리의 압축을 풀고, 헤드리스 브라우저에 적합한 기본 옵션을 사용하여 크롬 브라우저를 시작합니다. `launch` 함수에 대한 자세한 내용은 Playwright 설명서의 [https://playwright.dev/docs/api/class-browsertype#browser-type-launch](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) 섹션을 참조하세요.

 **사용량** 

```
const browser = await synthetics.launch();
```

 **인수** 

`options` [옵션](https://playwright.dev/docs/api/class-browsertype#browser-type-launch)(선택 사항)은 브라우저에 설정할 수 있는 구성 가능한 옵션 집합입니다.

 **반환** 

[Browser](https://playwright.dev/docs/api/class-browser)가 Playwright 브라우저 인스턴스인 Promise `<Browser>`가 반환됩니다.

이 함수를 다시 직접적으로 호출하면 새 브라우저를 시작하기 전에 이전에 열었던 브라우저가 닫힙니다. CloudWatch Synthetics에서 사용하는 시작 파라미터를 재정의할 수 있으며 브라우저를 시작할 때 추가 파라미터를 전달할 수 있습니다. 예를 들어 다음 코드 조각에서는 기본 인수와 기본 실행 경로를 사용하여 브라우저를 시작하지만 뷰포트는 800 x 600픽셀입니다. 자세한 내용은 Playwright 설명서의 [Playwright launch options](https://playwright.dev/docs/api/class-browsertype#browser-type-launch)를 참조하세요.

```
const browser = await synthetics.launch({
  defaultViewport: { 
      "deviceScaleFactor": 1, 
      "width": 800,
      "height": 600 
}});
```

 브라우저에 기본적으로 전달되는 Chromium 플래그를 추가하거나 재정의할 수도 있습니다. 예를 들어 다음과 같이 CloudWatch Synthetics 시작 파라미터의 인수에 `--disable-web-security` 플래그를 추가하여 웹 보안을 사용 중지할 수 있습니다.

```
// This function adds the --disable-web-security flag to the launch parameters
const defaultOptions = await synthetics.getDefaultLaunchOptions();
const launchArgs = [...defaultOptions.args, '--disable-web-security'];
const browser = await synthetics.launch({
    args: launchArgs
  });
```

## newPage
<a name="Synthetics_Library_Nodejs_Playwright_function_newPage"></a>

`newPage()` 함수는 새 Playwright 페이지를 생성하고 반환합니다. Synthetics는 HTTP 아카이브(HAR) 생성을 위한 네트워크 캡처를 활성화하기 위해 Chrome DevTools Protocol(CDP) 연결을 자동으로 설정합니다.

 **사용량** 

다음 중 한 가지 방법으로 `newPage()`를 사용합니다.

 **1: 새 브라우저 컨텍스트에서 새 페이지 생성:** 

```
const page = await synthetics.newPage(browser);
```

 **2. 지정된 브라우저 컨텍스트에서 새 페이지 생성:** 

```
// Create a new browser context
const browserContext = await browser.newContext();

// Create a new page in the specified browser context
const page = await synthetics.newPage(browserContext)
```

 **인수** 

Playwright [Browser](https://playwright.dev/docs/api/class-browser) 인스턴스 또는 Playwright [BrowserContext](https://playwright.dev/docs/api/class-browsercontext) 인스턴스 중에 하나를 수락합니다.

 **반환** 

Page가 Playwright [Page](https://playwright.dev/docs/api/class-page) 인스턴스인 Promise <Page>가 반환됩니다.

## 해지
<a name="Synthetics_Library_Nodejs_Playwright_function_close"></a>

현재 열려 있는 브라우저를 닫습니다.

 **사용량** 

```
await synthetics.close();
```

스크립트의 `finally` 블록에서 브라우저를 닫는 것이 좋습니다.

 **인수** 

없음 

 **반환** 

브라우저 시작을 위해 Synthetics 시작 함수에서 사용되는 Promise<void>가 반환됩니다.

## getDefaultLaunchOptions
<a name="Synthetics_Library_Nodejs_Playwright_function_getDefaultLaunchOptions"></a>

`getDefaultLaunchOptions()` 함수는 CloudWatch Synthetics에서 사용하는 브라우저 시작 옵션을 반환합니다.

 **사용량** 

```
const defaultOptions = await synthetics.getDefaultLaunchOptions();
```

 **인수** 

없음 

 **반환** 

브라우저 시작을 위해 Synthetics `launch` 함수에서 사용되는 Playwright [ 시작 옵션](https://playwright.dev/docs/api/class-browsertype#browser-type-launch)이 반환됩니다.

## executeStep
<a name="Synthetics_Library_Nodejs_Playwright_function_executeStep"></a>

`executeStep` 함수는 Synthetics 스크립트에서 단계를 실행하는 데 사용됩니다. CloudWatch Synthetics에서 Synthetics 단계는 카나리 스크립트를 명확하게 정의된 작업으로 세분화하여, 애플리케이션 여정의 다양한 부분을 개별적으로 모니터링할 수 있는 방법입니다. 각 단계에 대해 CloudWatch Synthetics는 다음을 수행합니다.
+ 단계가 시작되기 전과 단계가 완료된 후 스크린샷을 자동으로 캡처합니다. 단계 내에서 스크린샷을 캡처할 수도 있습니다. 스크린샷은 기본적으로 캡처되지만, Synthetics 구성을 사용하여 끌 수 있습니다.
+ 각 카나리 실행에 대해 단계 지속 시간, `pass` 또는 `fail` 상태, 소스 및 대상 페이지 URL, 연결된 스크린샷 등과 같은 단계 실행 세부 정보에 대한 요약이 포함된 보고서가 생성됩니다. CloudWatch Synthetics 콘솔에서 실행을 선택하면 **단계** 탭에서 각 단계의 실행 세부 정보를 볼 수 있습니다.
+ 각 단계에 대한 `SuccessPercent` 및 `Duration` CloudWatch 지표가 내보내기되므로, 사용자는 각 단계의 가용성과 지연 시간을 모니터링할 수 있습니다.

 **사용량** 

```
await synthetics.executeStep("mystepname", async function () {
  await page.goto(url, { waitUntil: 'load', timeout: 30000 });
}
```

**참고**  
단계는 순차적으로 실행해야 하며, Promise에 `await`를 사용해야 합니다.

 **인수** 
+ `stepName` 문자열(필수)(부울) - Synthetics 단계의 이름입니다.
+ `functionToExecute` 비동기 함수(필수) - Synthetics를 실행할 함수입니다. 이 함수에는 단계에 대한 로직이 포함되어야 합니다.
+ `stepConfig` 객체(선택 사항) - 단계 구성은 이 단계의 글로벌 Synthetics 구성을 재정의합니다.
  + `continueOnStepFailure` 부울(선택 사항) - 이 단계가 실패한 후에도 카나리 스크립트를 계속 실행할지 여부입니다.
  + `screenshotOnStepStart` 부울(선택 사항) - 이 단계를 시작할 때 스크린샷을 생성할지 여부입니다.
  + `screenshotOnStepSuccess` 부울(선택 사항) - 이 단계가 성공할 경우 스크린샷을 생성할지 여부입니다.
  + `screenshotOnStepFailure` 부울(선택 사항) - 이 단계가 성공할 경우 스크린샷을 생성할지 여부입니다.
+ `page` - Playwright 페이지 객체(선택 사항)

  Playwright 페이지 객체입니다. Synthetics는이 페이지 객체를 사용하여 스크린샷과 URL을 캡처합니다. 기본적으로 Synthetics는 스크린샷과 URL 등의 페이지 세부 정보를 캡처하기 위해 `synthetics.newPage()` 함수를 직접적으로 호출할 때 생성된 Playwright 페이지를 사용합니다.

 **반환** 

` functionToExecute` 함수에서 반환된 값을 확인하는 Promise가 반환됩니다. 예제 스크립트는 이 가이드의 [canary 스크립트 샘플 코드](CloudWatch_Synthetics_Canaries_Samples.md) 섹션을 참조하세요.

# Puppeteer를 사용하여 Node.js 카나리 스크립트에 사용할 수 있는 라이브러리 함수
<a name="CloudWatch_Synthetics_Canaries_Library_Nodejs"></a>

이 섹션에서는 Node.js 카나리 스크립트에 사용할 수 있는 라이브러리 함수를 설명합니다.

**Topics**
+ [모든 canary에 적용되는 Node.js 라이브러리 클래스 및 함수](#CloudWatch_Synthetics_Library_allcanaries)
+ [UI canary에만 적용되는 Node.js 라이브러리 클래스 및 함수](#CloudWatch_Synthetics_Library_UIcanaries)
+ [API canary에만 적용되는 Node.js 라이브러리 클래스 및 함수](#CloudWatch_Synthetics_Library_APIcanaries)

## 모든 canary에 적용되는 Node.js 라이브러리 클래스 및 함수
<a name="CloudWatch_Synthetics_Library_allcanaries"></a>

다음 Node.js용 CloudWatch Synthetics 라이브러리 함수는 모든 canary에 사용할 수 있습니다.

**Topics**
+ [Synthetics 클래스](#CloudWatch_Synthetics_Library_Synthetics_Class_all)
+ [SyntheticsConfiguration 클래스](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)
+ [Synthetics Logger](#CloudWatch_Synthetics_Library_SyntheticsLogger)
+ [SyntheticsLogHelper 클래스](#CloudWatch_Synthetics_Library_SyntheticsLogHelper)

### Synthetics 클래스
<a name="CloudWatch_Synthetics_Library_Synthetics_Class_all"></a>

모든 canary에 사용할 수 있는 다음 함수는 Synthetics 클래스에 있습니다.

**Topics**
+ [addExecutionError(errorMessage, ex);](#CloudWatch_Synthetics_Library_addExecutionError)
+ [getCanaryName();](#CloudWatch_Synthetics_Library_getCanaryName)
+ [getCanaryArn();](#CloudWatch_Synthetics_Library_getCanaryARN)
+ [getCanaryUserAgentString();](#CloudWatch_Synthetics_Library_getCanaryUserAgentString)
+ [getRuntimeVersion();](#CloudWatch_Synthetics_Library_getRuntimeVersion)
+ [getLogLevel()](#CloudWatch_Synthetics_Library_getLogLevel)
+ [setLogLevel()](#CloudWatch_Synthetics_Library_setLogLevel)

#### addExecutionError(errorMessage, ex);
<a name="CloudWatch_Synthetics_Library_addExecutionError"></a>

`errorMessage`는 오류를 설명하며, `ex`는 발생한 예외입니다.

`addExecutionError`를 사용하여 canary에 대한 실행 오류를 설정할 수 있습니다. 이 함수는 스크립트 실행을 중단하지 않고 canary에 실패합니다. 또한 `successPercent` 지표에 영향을 주지 않습니다.

오류가 canary 스크립트의 성공 또는 실패를 나타내는 데 중요하지 않은 경우에만 오류를 실행 오류로 추적해야 합니다.

`addExecutionError`의 사용 예는 다음과 같습니다. 엔드포인트의 가용성을 모니터링하고 페이지가 로드된 후에 스크린샷을 생성합니다. 스크린샷 캡처 실패가 엔드포인트의 가용성을 결정하지 않기 때문에 스크린샷을 생성하는 동안 발생한 오류를 포착하여 실행 오류로 추가할 수 있습니다. 가용성 지표는 여전히 ​​엔드포인트가 실행 중임을 나타내지만 canary 상태는 실패로 표시됩니다. 다음 샘플 코드 블록은 이러한 오류를 포착하여 실행 오류로 추가합니다.

```
try {
    await synthetics.takeScreenshot(stepName, "loaded");
} catch(ex) {
    synthetics.addExecutionError('Unable to take screenshot ', ex);
}
```

#### getCanaryName();
<a name="CloudWatch_Synthetics_Library_getCanaryName"></a>

canary의 이름을 반환합니다.

#### getCanaryArn();
<a name="CloudWatch_Synthetics_Library_getCanaryARN"></a>

canary의 ARN을 반환합니다.

#### getCanaryUserAgentString();
<a name="CloudWatch_Synthetics_Library_getCanaryUserAgentString"></a>

canary의 사용자 지정 사용자 에이전트를 반환합니다.

#### getRuntimeVersion();
<a name="CloudWatch_Synthetics_Library_getRuntimeVersion"></a>

이 함수는 런타임 버전 `syn-nodejs-puppeteer-3.0` 이상에서 사용할 수 있습니다. 이 함수는 canary의 Synthetics 런타임 버전을 반환합니다. 예를 들어 반환 값이 `syn-nodejs-puppeteer-3.0`일 수 있습니다.

#### getLogLevel()
<a name="CloudWatch_Synthetics_Library_getLogLevel"></a>

Synthetics 라이브러리에 대한 현재 로그 수준을 검색합니다. 가능한 값은 다음과 같습니다.
+ `0` – 디버그
+ `1` – 정보
+ `2` – 경고
+ `3` – 오류

예제:

```
let logLevel = synthetics.getLogLevel();
```

#### setLogLevel()
<a name="CloudWatch_Synthetics_Library_setLogLevel"></a>

Synthetics 라이브러리의 로그 수준을 설정합니다. 가능한 값은 다음과 같습니다.
+ `0` – 디버그
+ `1` – 정보
+ `2` – 경고
+ `3` – 오류

예제:

```
synthetics.setLogLevel(0);
```

### SyntheticsConfiguration 클래스
<a name="CloudWatch_Synthetics_Library_SyntheticsConfiguration"></a>

이 클래스는 `syn-nodejs-2.1` 런타임 버전 이상에서만 사용할 수 있습니다.

`SyntheticsConfiguration` 클래스를 사용하여 Synthetics 라이브러리 함수의 동작을 구성할 수 있습니다. 예를 들어 이 클래스를 사용하여 스크린샷을 캡처하지 않도록 `executeStep()` 함수를 구성할 수 있습니다.

canary의 모든 단계에 적용되는 글로벌 수준에서 CloudWatch Synthetics 구성을 설정할 수 있습니다. 또한 구성 키-값 페어를 전달하여 단계 수준에서 이러한 구성을 재정의할 수도 있습니다.

단계 수준에서 옵션을 전달할 수 있습니다. 예를 보려면 [async executeStep(stepName, functionToExecute, [stepConfig]);](#CloudWatch_Synthetics_Library_executeStep) 및 [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#CloudWatch_Synthetics_Library_executeHttpStep) 단원을 참조하세요.

**Topics**
+ [setConfig(options)](#CloudWatch_Synthetics_Library_setConfig)
+ [시각적 모니터링](#CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting)

#### setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfig"></a>

` options `는 canary에 대해 구성 가능한 옵션의 집합인 객체입니다. 다음 단원에서는 ` options `의 가능한 필드를 설명합니다.

##### 모든 canary에 대한 setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfigall"></a>

`syn-nodejs-puppeteer-3.2` 이상을 사용하는 카나리의 경우 **setConfig**의 **(options)**에 다음 파라미터가 포함될 수 있습니다.
+ `includeRequestHeaders`(boolean) - 보고서에 요청 헤더를 포함할지 여부입니다. 기본값은 `false`입니다.
+ `includeResponseHeaders`(boolean) - 보고서에 응답 헤더를 포함할지 여부입니다. 기본값은 `false`입니다.
+ `restrictedHeaders`(array) - 헤더가 포함된 경우 무시할 헤더 값 목록입니다. 이는 요청 헤더와 응답 헤더 모두에 적용됩니다. 예를 들어 **includeRequestHeaders**를 `true`로, **restrictedHeaders**를 `['Authorization']`으로 전달하여 자격 증명을 숨길 수 있습니다.
+ `includeRequestBody`(boolean) - 보고서에 요청 본문을 포함할지 여부입니다. 기본값은 `false`입니다.
+ `includeResponseBody`(boolean) - 보고서에 응답 본문을 포함할지 여부입니다. 기본값은 `false`입니다.
**중요**  
`includeResponseBody` 또는 ` logResponseBody`를 활성화하는 경우 aws-sdk v3 클라이언트와 같은 일부 API의 응답에서 데이터 객체가 반환되지 않습니다. 이는 Node.js 제한 및 사용된 응답 객체 유형 때문입니다.

 **CloudWatch 지표에 관한 setConfig(options)** 

`syn-nodejs-puppeteer-3.1` 이상을 사용하는 카나리의 경우 **setConfig**의 **(options)**에는 카나리에서 게시하는 지표를 결정하는 다음 부울 파라미터가 포함될 수 있습니다. 이러한 각 옵션의 기본값은 `true`입니다. `aggregated`로 시작하는 옵션은 ` CanaryName` 측정기준 없이 지표를 내보낼지 여부를 결정합니다. 이러한 지표를 사용하여 모든 canary에 대한 집계 결과를 확인할 수 있습니다. 다른 옵션은 `CanaryName` 측정기준과 함께 지표를 내보낼지 여부를 결정합니다. 이러한 지표를 사용하여 각 개별 canary의 결과를 확인할 수 있습니다.

canary에서 내보내는 CloudWatch 지표 목록은 [canary가 게시한 CloudWatch 지표](CloudWatch_Synthetics_Canaries_metrics.md) 단원을 참조하세요.
+ `failedCanaryMetric`(boolean) - 이 canary에 대한 ` Failed` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `failedRequestsMetric`(boolean) - 이 canary에 대한 `Failed requests` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `_2xxMetric`(boolean) - 이 canary에 대한 `2xx` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `_4xxMetric`(boolean) - 이 canary에 대한 `4xx` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `_5xxMetric`(boolean) - 이 canary에 대한 `5xx` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `stepDurationMetric`(boolean) - 이 canary에 대한 `Step duration` 지표를 (`CanaryName` `StepName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `stepSuccessMetric`(boolean) - 이 canary에 대한 `Step success` 지표를 (`CanaryName` `StepName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregatedFailedCanaryMetric`(boolean) - 이 canary에 대한 `Failed` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregatedFailedRequestsMetric`(boolean) - 이 canary에 대한 `Failed Requests` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated2xxMetric`(boolean) - 이 canary에 대한 ` 2xx` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated4xxMetric`(boolean) - 이 canary에 대한 ` 4xx` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated5xxMetric`(boolean) - 이 canary에 대한 ` 5xx` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `visualMonitoringSuccessPercentMetric`(boolean) - 이 canary에 대한 `visualMonitoringSuccessPercent` 지표를 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `visualMonitoringTotalComparisonsMetric`(boolean) - 이 canary에 대한 `visualMonitoringTotalComparisons` 지표를 내보낼지 여부입니다. 기본값은 `false`입니다.
+ `includeUrlPassword`(boolean) - URL에 표시되는 암호를 포함할지 여부입니다. 기본적으로 URL에 표시되는 암호를 로그 및 보고서에서 삭제하여 민감한 데이터가 노출되는 것을 방지합니다. 기본값은 `false`입니다.
+ `restrictedUrlParameters`(array) - 수정할 URL 경로 또는 쿼리 파라미터의 목록입니다. 이는 로그, 보고서, 오류에 표시되는 URL에 적용됩니다. 파라미터는 대소문자를 구분하지 않습니다. 별표(\$1)를 값으로 전달하여 모든 URL 경로 및 쿼리 파라미터 값을 수정할 수 있습니다. 기본값은 빈 배열입니다.
+ `logRequest`(boolean) - canary 로그에 모든 요청을 로그할지 여부입니다. UI canary의 경우에는 브라우저에서 보낸 각 요청을 로그합니다. 기본값은 `true`입니다.
+ `logResponse`(boolean) - canary 로그에 모든 응답을 로그할지 여부입니다. UI canary의 경우에는 브라우저에서 수신한 모든 응답을 로그합니다. 기본값은 `true`입니다.
+ `logRequestBody`(boolean) - canary 로그에 요청과 함께 요청 본문을 로그할지 여부입니다. 이 구성은 `logRequest`가 `true`인 경우에만 적용됩니다. 기본값은 `false`입니다.
+ `logResponseBody`(boolean) - canary 로그에 응답과 함께 응답 본문을 로그할지 여부입니다. 이 구성은 `logResponse`가 `true`인 경우에만 적용됩니다. 기본값은 ` false`입니다.
**중요**  
`includeResponseBody` 또는 ` logResponseBody`를 활성화하는 경우 aws-sdk v3 클라이언트와 같은 일부 API의 응답에서 데이터 객체가 반환되지 않습니다. 이는 Node.js 제한 및 사용된 응답 객체 유형 때문입니다.
+ `logRequestHeaders`(boolean) - canary 로그에 요청과 함께 요청 헤더를 로그할지 여부입니다. 이 구성은 `logRequest`가 `true`인 경우에만 적용됩니다. 기본값은 ` false`입니다.

  `includeRequestHeaders`가 아티팩트의 헤더를 사용 설정한다는 점에 유의하세요.
+ `logResponseHeaders`(boolean) - canary 로그에 응답과 함께 응답 헤더를 로그할지 여부입니다. 이 구성은 `logResponse`가 `true`인 경우에만 적용됩니다. 기본값은 ` false`입니다.

  `includeResponseHeaders`가 아티팩트의 헤더를 사용 설정한다는 점에 유의하세요.

**참고**  
각 canary에 대한 `Duration` 및 `SuccessPercent` 지표를 항상(`CanaryName` 지표가 있거나 없거나 모두) 내보냅니다.

##### 지표를 사용 또는 사용 중지하는 메서드
<a name="CloudWatch_Synthetics_Library_setConfig_metrics"></a>

 **disableAggregatedRequestMetrics()** 

canary가 `CanaryName` 측정기준 없이 내보내지는 모든 요청 지표를 내보내지 못하도록 합니다.

 **disableRequestMetrics()** 

canary별 지표와 모든 canary에서 집계된 지표를 모두 포함하여 모든 요청 지표를 사용 중지합니다.

 **disableStepMetrics()** 

단계 성공 지표 및 단계 지속 시간 지표 모두를 포함하여 모든 단계 지표를 사용 중지합니다.

 **enableAggregatedRequestMetrics()** 

canary가 ` CanaryName` 측정기준 없이 내보내지는 모든 요청 지표를 내보낼 수 있도록 합니다.

 **enableRequestMetrics()** 

canary별 지표와 모든 canary에서 집계된 지표를 모두 포함하여 모든 요청 지표를 사용하도록 설정합니다.

 **enableStepMetrics()** 

단계 성공 지표 및 단계 지속 시간 지표 모두를 포함하여 모든 단계 지표를 사용 설정합니다.

 **get2xxMetric()** 

canary가 ` CanaryName` 측정기준과 함께 `2xx` 지표를 내보낼지 여부를 반환합니다.

 **get4xxMetric()** 

canary가 ` CanaryName` 측정기준과 함께 `4xx` 지표를 내보낼지 여부를 반환합니다.

 **get5xxMetric()** 

canary가 ` CanaryName` 측정기준과 함께 `5xx` 지표를 내보낼지 여부를 반환합니다.

 **getAggregated2xxMetric()** 

canary가 측정기준 없이 `2xx` 지표를 내보낼지 여부를 반환합니다.

 **getAggregated4xxMetric()** 

canary가 측정기준 없이 `4xx` 지표를 내보낼지 여부를 반환합니다.

 **getAggregatedFailedCanaryMetric()** 

canary가 측정기준 없이 `Failed` 지표를 내보낼지 여부를 반환합니다.

 **getAggregatedFailedRequestsMetric()** 

canary가 측정기준 없이 `Failed requests` 지표를 내보낼지 여부를 반환합니다.

 **getAggregated5xxMetric()** 

canary가 측정기준 없이 `5xx` 지표를 내보낼지 여부를 반환합니다.

 **getFailedCanaryMetric()** 

canary가 ` CanaryName` 측정기준과 함께 `Failed` 지표를 내보낼지 여부를 반환합니다.

 **getFailedRequestsMetric()** 

canary가 `CanaryName` 측정기준과 함께 `Failed requests` 지표를 내보낼지 여부를 반환합니다.

 **getStepDurationMetric()** 

canary가 이 canary에 대한 ` CanaryName` 측정기준과 함께 `Duration` 지표를 내보낼지 여부를 반환합니다.

 **getStepSuccessMetric()** 

canary가 이 canary에 대한 ` CanaryName` 측정기준과 함께 `StepSuccess` 지표를 내보낼지 여부를 반환합니다.

 **with2xxMetric(\$12xxMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `2xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with4xxMetric(\$14xxMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `4xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with5xxMetric(\$15xxMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `5xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withAggregated2xxMetric(aggregated2xxMetric)** 

이 canary에 대한 측정기준 없이 `2xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withAggregated4xxMetric(aggregated4xxMetric)** 

이 canary에 대한 측정기준 없이 `4xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withAggregated5xxMetric(aggregated5xxMetric)** 

이 canary에 대한 측정기준 없이 `5xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 ** withAggregatedFailedCanaryMetric(aggregatedFailedCanaryMetric)** 

이 canary에 대한 측정기준 없이 `Failed` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 ** withAggregatedFailedRequestsMetric(aggregatedFailedRequestsMetric)** 

이 canary에 대한 측정기준 없이 `Failed requests` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withFailedCanaryMetric(failedCanaryMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `Failed` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withFailedRequestsMetric(failedRequestsMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `Failed requests` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withStepDurationMetric(stepDurationMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `Duration` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withStepSuccessMetric(stepSuccessMetric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 ` StepSuccess` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

##### 다른 기능을 사용 또는 사용 중지하는 메서드
<a name="CloudWatch_Synthetics_Library_setConfig_methods"></a>

 **withHarFile()** 

이 canary에 대한 HAR 파일을 생성할지 여부를 지정하는 부울 인수를 허용합니다.

 **withStepsReport()** 

이 canary에 대한 단계 실행 요약을 보고할지 여부를 지정하는 부울 인수를 허용합니다.

 **withIncludeUrlPassword()** 

URL에 표시되는 암호를 로그 및 보고서에 포함할지 여부를 지정하는 부울 인수를 허용합니다.

 **withRestrictedUrlParameters()** 

수정할 URL 경로 또는 쿼리 파라미터의 배열을 허용합니다. 이는 로그, 보고서, 오류에 표시되는 URL에 적용됩니다. 별표(\$1)를 값으로 전달하여 모든 URL 경로 및 쿼리 파라미터 값을 수정할 수 있습니다.

 **withLogRequest()** 

canary의 로그에 모든 요청을 로그할지 여부를 지정하는 부울 인수를 허용합니다.

 **withLogResponse()** 

canary의 로그에 모든 응답을 로그할지 여부를 지정하는 부울 인수를 허용합니다.

 **withLogRequestBody()** 

canary의 로그에 모든 요청 본문을 로그할지 여부를 지정하는 부울 인수를 허용합니다.

 **withLogResponseBody()** 

canary의 로그에 모든 응답 본문을 로그할지 여부를 지정하는 부울 인수를 허용합니다.

 **withLogRequestHeaders()** 

canary의 로그에 모든 요청 헤더를 로그할지 여부를 지정하는 부울 인수를 허용합니다.

 **withLogResponseHeaders()** 

canary의 로그에 모든 응답 헤더를 로그할지 여부를 지정하는 부울 인수를 허용합니다.

 **getHarFile()** 

canary가 HAR 파일을 생성할지 여부를 반환합니다.

 **getStepsReport()** 

canary가 단계 실행 요약을 보고할지 여부를 반환합니다.

 **getIncludeUrlPassword()** 

canary가 URL에 표시되는 암호를 로그 및 보고서에 포함할지 여부를 반환합니다.

 **getRestrictedUrlParameters()** 

canary가 URL 경로 또는 쿼리 파라미터를 수정할지 여부를 반환합니다.

 **getLogRequest()** 

canary가 canary의 로그에 모든 요청을 로그할지 여부를 반환합니다.

 **getLogResponse()** 

canary가 canary의 로그에 모든 응답을 로그할지 여부를 반환합니다.

 **getLogRequestBody()** 

canary가 canary의 로그에 모든 요청 본문을 로그할지 여부를 반환합니다.

 **getLogResponseBody()** 

canary가 canary의 로그에 모든 응답 본문을 로그할지 여부를 반환합니다.

 **getLogRequestHeaders()** 

canary가 canary의 로그에 모든 요청 헤더를 로그할지 여부를 반환합니다.

 **getLogResponseHeaders()** 

canary가 canary의 로그에 모든 응답 헤더를 로그할지 여부를 반환합니다.

 **모든 canary에 대한 함수** 
+ `withIncludeRequestHeaders`(includeRequestHeaders)
+ `withIncludeResponseHeaders`(includeResponseHeaders)
+ `withRestrictedHeaders`(restrictedHeaders)
+ `withIncludeRequestBody`(includeRequestBody)
+ `withIncludeResponseBody`(includeResponseBody)
+ `enableReportingOptions`() - 모든 보고 활성화-- **includeRequestHeaders**, **includeResponseHeaders**, **includeRequestBody**, **includeResponseBody**
+ `disableReportingOptions`() - 모든 보고 옵션 비활성화-- **includeRequestHeaders**, **includeResponseHeaders**, **includeRequestBody**, **includeResponseBody**

##### UI canary에 대한 setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfigUI"></a>

UI canary의 경우 **setConfig**에는 다음 부울 파라미터가 포함될 수 있습니다.
+ `continueOnStepFailure`(부울) - 단계가 실패한 후 카나리 스크립트를 계속 실행할지 여부입니다(단계 실패에 대해서는 **executeStep** 함수 참조). 단계가 실패한 경우 canary 실행은 여전히 ​​실패로 표시됩니다. 기본값은 `false`입니다.
+ `harFile`(boolean) - HAR 파일을 생성할지 여부입니다. 기본값은 `True`입니다.
+ `screenshotOnStepStart`(boolean) - 단계를 시작하기 전에 스크린샷을 생성할지 여부입니다.
+ `screenshotOnStepSuccess`(boolean) - 성공적인 단계를 완료한 후 스크린샷을 생성할지 여부입니다.
+ `screenshotOnStepFailure`(boolean) - 단계가 실패한 후 스크린샷을 생성할지 여부입니다.

##### 스크린샷을 사용 또는 사용 중지하는 메서드
<a name="CloudWatch_Synthetics_Library_setConfig_screenshots"></a>

 **disableStepScreenshots()** 

모든 스크린샷 옵션(screenshotOnStepStart, screenshotOnStepSuccess, screenshotOnStepFailure)을 사용 중지합니다.

 **enableStepScreenshots()** 

모든 스크린샷 옵션(screenshotOnStepStart, screenshotOnStepSuccess, screenshotOnStepFailure)을 사용하도록 설정합니다. 기본적으로 이러한 메서드는 모두 사용 설정되어 있습니다.

 **getScreenshotOnStepFailure()** 

단계가 실패한 후 canary가 스크린샷을 생성할지 여부를 반환합니다.

 **getScreenshotOnStepStart()** 

단계를 시작하기 전에 canary가 스크린샷을 생성할지 여부를 반환합니다.

 **getScreenshotOnStepSuccess()** 

단계를 성공적으로 완료한 후 canary가 스크린샷을 생성할지 여부를 반환합니다.

 **withScreenshotOnStepStart(screenshotOnStepStart)** 

단계를 시작하기 전에 스크린샷을 생성할지 여부를 나타내는 부울 인수를 허용합니다.

 **withScreenshotOnStepSuccess(screenshotOnStepSuccess)** 

단계를 성공적으로 완료한 후 스크린샷을 생성할지 여부를 나타내는 부울 인수를 허용합니다.

 **withScreenshotOnStepFailure(screenshotOnStepFailure)** 

단계가 실패한 후 스크린샷을 생성할지 여부를 나타내는 부울 인수를 허용합니다.

 **UI canary의 사용** 

먼저, Synthetics 종속 항목을 가져오고 구성을 가져옵니다.

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();
```

다음으로, 다음 옵션 중 하나를 사용하여 setConfig 메서드를 호출함으로써 각 옵션의 구성을 설정합니다.

```
// Set configuration values
    synConfig.setConfig({
        screenshotOnStepStart: true, 
        screenshotOnStepSuccess: false,
        screenshotOnStepFailure: false
    });
```

또는

```
synConfig.withScreenshotOnStepStart(false).withScreenshotOnStepSuccess(true).withScreenshotOnStepFailure(true)
```

모든 스크린샷을 사용 중지하려면 이 예와 같이 `disableStepScreenshots()` 함수를 사용합니다.

```
synConfig.disableStepScreenshots();
```

코드의 어느 지점에서든 스크린샷을 사용 및 사용 중지할 수 있습니다. 예를 들어 한 단계에 대해서만 스크린샷을 사용 중지하려면 해당 단계를 실행하기 전에 스크린샷을 사용 중지한 다음, 이 단계가 끝나면 스크린샷을 사용하도록 설정합니다.

##### API canary에 대한 setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfigAPI"></a>

API canary의 경우 **setConfig**에는 다음 부울 파라미터가 포함될 수 있습니다.
+ `continueOnHttpStepFailure`(boolean) - HTTP 단계가 실패한 후 canary 스크립트를 계속 실행할지 여부입니다(단계 실패에 대해서는 **executeHttpStep** 함수 참조). 단계가 실패한 경우 canary 실행은 여전히 ​​실패로 표시됩니다. 기본값은 `true`입니다.

#### 시각적 모니터링
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting"></a>

시각적 모니터링에서는 canary 실행 중에 생성한 스크린샷과 기준 canary 실행 중에 생성한 스크린샷을 비교합니다. 두 스크린샷 간의 불일치가 임계 백분율을 초과하면 canary가 실패하며, canary 실행 보고서에서 색상으로 강조 표시된 차이가 있는 영역을 확인할 수 있습니다. 시각적 모니터링은 **syn-puppeteer-node-3.2** 이상을 실행하는 canary에서 지원됩니다. 현재 Python 및 Selenium을 실행하는 canary에서는 지원되지 않습니다.

시각적 모니터링을 사용하려면 canary 스크립트에 다음 코드 줄을 추가합니다. 자세한 내용은 [SyntheticsConfiguration 클래스](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)을(를) 참조하세요.

```
syntheticsConfiguration.withVisualCompareWithBaseRun(true);
```

이 줄을 스크립트에 추가한 후 canary가 처음 성공적으로 실행되면 해당 실행 중에 생성한 스크린샷을 비교를 위한 기준으로 사용합니다. 성공한 첫 번째 canary 실행 후 CloudWatch 콘솔을 사용하여 다음 중 하나를 수행하도록 canary를 편집할 수 있습니다.
+ canary의 다음 실행을 새 기준으로 설정합니다.
+ 현재 기준 스크린샷에 경계선을 그려서 시각적 비교 중에 무시할 스크린샷 영역을 지정합니다.
+ 스크린샷을 제거하여 시각적 모니터링에 사용되지 않도록 합니다.

CloudWatch 콘솔을 사용하여 canary를 편집하는 방법에 대한 자세한 내용은 [canary 편집 또는 삭제](synthetics_canaries_deletion.md) 단원을 참조하세요.

 **시각적 모니터링을 위한 기타 옵션** 

 ** syntheticsConfiguration.withVisualVarianceThresholdPercentage(desiredPercentage)** 

시각적 비교에서 스크린샷 불일치에 대해 허용 가능한 백분율을 설정합니다.

 ** syntheticsConfiguration.withVisualVarianceHighlightHexColor("\$1fafa00")** 

시각적 모니터링을 사용하는 canary 실행 보고서를 검토할 때 불일치 영역을 지정하는 강조 표시 색상을 설정합니다.

 ** syntheticsConfiguration.withFailCanaryRunOnVisualVariance(failCanary)** 

임곗값보다 큰 시각적 차이가 있는 경우 canary 실패 여부를 설정합니다. 기본값은 canary 실패입니다.

### Synthetics Logger
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger"></a>

SyntheticsLogger는 동일한 로그 수준으로 콘솔과 로컬 로그 파일에 모두 로그를 기록합니다. 이 로그 파일은 로그 수준이 호출된 로그 함수의 원하는 로깅 수준 이하인 경우에만 두 위치에 기록됩니다.

로컬 로그 파일의 로깅 문 앞에는 호출된 함수의 로그 수준과 일치하도록 “DEBUG: “, “INFO: “등이 추가됩니다.

Synthetics canary 로깅과 동일한 로그 수준에서 Synthetics 라이브러리를 실행하려는 경우 SyntheticsLogger를 사용할 수 있습니다.

S3 결과 위치에 업로드되는 로그 파일을 생성할 때는 SyntheticsLogger를 사용할 필요가 없습니다. 대신 ` /tmp` 폴더에 다른 로그 파일을 생성할 수 있습니다. `/tmp` 폴더 아래에 생성된 모든 파일은 S3의 결과 위치에 아티팩트로 업로드됩니다.

Synthetics Library Logger를 사용하려면 다음을 실행합니다.

```
const log = require('@aws/synthetics-logger');
```

유용한 함수 정의:

 **log.debug(*message*, *ex* );**

파라미터: *message*는 로깅할 메시지이며, *ex*는 기록할 예외입니다(있는 경우).

예제:

```
log.debug("Starting step - login.");
```

 **log.error(*message*, *ex* );**

파라미터: *message*는 로깅할 메시지이며, *ex*는 기록할 예외입니다(있는 경우).

예제:

```
try {
  await login();
catch (ex) {
  log.error("Error encountered in step - login.", ex);
}
```

 **log.info(*message*, *ex* );**

파라미터: *message*는 로깅할 메시지이며, *ex*는 기록할 예외입니다(있는 경우).

예제:

```
log.info("Successfully completed step - login.");
```

 **log.log(*message*, *ex* );**

`log.info`에 대한 별칭입니다.

파라미터: *message*는 로깅할 메시지이며, *ex*는 기록할 예외입니다(있는 경우).

예제:

```
 log.log("Successfully completed step - login.");
```

 **log.warn(*message*, *ex* );**

파라미터: *message*는 로깅할 메시지이며, *ex*는 기록할 예외입니다(있는 경우).

예제:

```
log.warn("Exception encountered trying to publish CloudWatch Metric.", ex);
```

### SyntheticsLogHelper 클래스
<a name="CloudWatch_Synthetics_Library_SyntheticsLogHelper"></a>

`SyntheticsLogHelper` 클래스는 런타임 ` syn-nodejs-puppeteer-3.2` 이상 런타임에서 사용할 수 있습니다. 이 클래스는 CloudWatch Synthetics 라이브러리에 이미 초기화되어 있으며 Synthetics 구성으로 구성되어 있습니다. 스크립트에서 이 클래스를 종속 항목으로 추가할 수 있습니다. 이 클래스를 사용하면 URL, 헤더, 오류 메시지를 제거하여 민감한 정보를 수정할 수 있습니다.

**참고**  
Synthetics는 로그하는 모든 URL과 오류 메시지를 Synthetics 구성 설정인 `restrictedUrlParameters`에 따라 로그, 보고서, HAR 파일, canary 실행 오류에 포함하기 전에 제거합니다. 스크립트에서 URL 또는 오류를 로그하는 경우에만 ` getSanitizedUrl` 또는 `getSanitizedErrorMessage`를 사용해야 합니다. Synthetics는 스크립트에서 발생시킨 canary 오류를 제외하고는 어떠한 canary 아티팩트도 저장하지 않습니다. canary 실행 아티팩트는 고객 계정에 저장됩니다. 자세한 내용은 [Synthetics canary에 대한 보안 고려 사항](servicelens_canaries_security.md) 단원을 참조하세요.

**Topics**
+ [getSanitizedUrl(url, stepConfig = null)](#CloudWatch_Synthetics_Library_getSanitizedUrl)
+ [getSanitizedErrorMessage](#CloudWatch_Synthetics_Library_getSanitizedErrorMessage)
+ [getSanitizedHeaders(headers, stepConfig=null)](#CloudWatch_Synthetics_Library_getSanitizedHeaders)

#### getSanitizedUrl(url, stepConfig = null)
<a name="CloudWatch_Synthetics_Library_getSanitizedUrl"></a>

이 함수는 `syn-nodejs-puppeteer-3.2` 이상에서 사용할 수 있습니다. 이 함수는 구성에 따라 제거된 URL 문자열을 반환합니다. `restrictedUrlParameters` 속성을 설정하여 암호 및 access\$1token과 같은 민감한 URL 파라미터를 수정하도록 선택할 수 있습니다. 기본적으로 URL의 암호는 수정됩니다. 필요한 경우 `includeUrlPassword`를 true로 설정하여 URL 암호를 사용하도록 설정할 수 있습니다.

전달된 URL이 유효한 URL이 아닌 경우 이 함수는 오류를 발생시킵니다.

 **파라미터** 
+ *url*은 문자열이며 제거할 URL입니다.
+  *stepConfig*(선택 사항)는 이 함수의 글로벌 Synthetics 구성을 재정의합니다. `stepConfig`가 전달되지 않으면 글로벌 구성이 URL을 제거하는 데 사용됩니다.

 **예** 

이 예에서는 샘플 URL ` https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200`을 사용합니다. 이 예에서 `access_token`은 로그되어서는 안 되는 민감한 정보를 포함합니다. Synthetics 서비스는 어떠한 canary 실행 아티팩트도 저장하지 않습니다. 로그, 스크린샷, 보고서와 같은 아티팩트는 모두 고객 계정의 Amazon S3 버킷에 저장됩니다.

첫 번째 단계는 Synthetics 구성을 설정하는 것입니다.

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Import Synthetics logger for logging url
const log = require('@aws/synthetics-logger');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();

// Set restricted parameters
synConfig.setConfig({
   restrictedUrlParameters: ['access_token'];
});
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('URL');



const urlConfig = {
   restrictedUrlParameters = ['*']
};
const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('URL', urlConfig);
logger.info('My example url is: ' + sanitizedUrl);
```

다음으로, URL을 제거하고 로그합니다.

```
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200');
```

그러면 canary 로그에 다음이 로그됩니다.

```
My example url is: https://example.com/learn/home?access_token=REDACTED&token_type=Bearer&expires_in=1200
```

다음 예와 같이 Synthetics 구성 옵션이 포함된 선택적 파라미터를 전달하여 URL에 대한 Synthetics 구성을 재정의할 수 있습니다.

```
const urlConfig = {
   restrictedUrlParameters = ['*']
};
const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200', urlConfig);
logger.info('My example url is: ' + sanitizedUrl);
```

앞의 예는 모든 쿼리 파라미터를 수정하며 다음과 같이 로그됩니다.

```
My example url is: https://example.com/learn/home?access_token=REDACTED&token_type=REDACTED&expires_in=REDACTED
```

#### getSanitizedErrorMessage
<a name="CloudWatch_Synthetics_Library_getSanitizedErrorMessage"></a>

이 함수는 `syn-nodejs-puppeteer-3.2` 이상에서 사용할 수 있습니다. 이 함수는 Synthetics 구성에 따라 존재하는 URL을 제거하여 제거된 오류 문자열을 반환합니다. 선택적 `stepConfig` 파라미터를 전달하여 이 함수를 호출할 때 글로벌 Synthetics 구성을 재정의하도록 선택할 수 있습니다.

 **파라미터** 
+ *error*는 제거할 오류이며, Error 객체 또는 문자열일 수 있습니다.
+  *stepConfig*(선택 사항)는 이 함수의 글로벌 Synthetics 구성을 재정의합니다. `stepConfig`가 전달되지 않으면 글로벌 구성이 URL을 제거하는 데 사용됩니다.

 **예** 

이 예에서는 ` Failed to load url: https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200` 오류를 사용합니다.

첫 번째 단계는 Synthetics 구성을 설정하는 것입니다.

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Import Synthetics logger for logging url
const log = require('@aws/synthetics-logger');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();

// Set restricted parameters
synConfig.setConfig({
   restrictedUrlParameters: ['access_token'];
});
```

다음으로, 오류 메시지를 제거하고 로그합니다.

```
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

try {
   // Your code which can throw an error containing url which your script logs
} catch (error) {
    const sanitizedErrorMessage = syntheticsLogHelper.getSanitizedErrorMessage(errorMessage);
    logger.info(sanitizedErrorMessage);
}
```

그러면 canary 로그에 다음이 로그됩니다.

```
Failed to load url: https://example.com/learn/home?access_token=REDACTED&token_type=Bearer&expires_in=1200
```

#### getSanitizedHeaders(headers, stepConfig=null)
<a name="CloudWatch_Synthetics_Library_getSanitizedHeaders"></a>

이 함수는 `syn-nodejs-puppeteer-3.2` 이상에서 사용할 수 있습니다. 이 함수는 ` syntheticsConfiguration`의 `restrictedHeaders` 속성에 따라 제거된 헤더를 반환합니다. `restrictedHeaders` 속성에 지정된 헤더는 로그, HAR 파일, 보고서에서 수정됩니다.

 **파라미터** 
+ *headers*는 제거할 헤더가 포함된 객체입니다.
+ *stepConfig*(선택 사항)는 이 함수의 글로벌 Synthetics 구성을 재정의합니다. `stepConfig`가 전달되지 않으면 글로벌 구성이 헤더를 제거하는 데 사용됩니다.

## UI canary에만 적용되는 Node.js 라이브러리 클래스 및 함수
<a name="CloudWatch_Synthetics_Library_UIcanaries"></a>

다음 Node.js용 CloudWatch Synthetics 라이브러리 함수는 UI canary에만 사용할 수 있습니다.

**Topics**
+ [Synthetics 클래스](#CloudWatch_Synthetics_Library_Synthetics_Class)
+ [BrokenLinkCheckerReport 클래스](#CloudWatch_Synthetics_Library_BrokenLinkCheckerReport)
+ [SyntheticsLink 클래스](#CloudWatch_Synthetics_Library_SyntheticsLink)

### Synthetics 클래스
<a name="CloudWatch_Synthetics_Library_Synthetics_Class"></a>

다음 함수는 Synthetics 클래스에 있습니다.

**Topics**
+ [async addUserAgent(page, userAgentString);](#CloudWatch_Synthetics_Library_addUserAgent)
+ [async executeStep(stepName, functionToExecute, [stepConfig]);](#CloudWatch_Synthetics_Library_executeStep)
+ [getDefaultLaunchOptions();](#CloudWatch_Synthetics_Library_getDefaultLaunchOptions)
+ [getPage();](#CloudWatch_Synthetics_Library_getPage)
+ [getRequestResponseLogHelper();](#CloudWatch_Synthetics_Library_getRequestResponseLogHelper)
+ [launch(options)](#CloudWatch_Synthetics_Library_LaunchOptions)
+ [RequestResponseLogHelper 클래스](#CloudWatch_Synthetics_Library_RequestResponseLogHelper)
+ [setRequestResponseLogHelper();](#CloudWatch_Synthetics_Library_setRequestResponseLogHelper)
+ [async takeScreenshot(name, suffix);](#CloudWatch_Synthetics_Library_takeScreenshot)

#### async addUserAgent(page, userAgentString);
<a name="CloudWatch_Synthetics_Library_addUserAgent"></a>

이 함수는 지정된 페이지의 사용자 에이전트 헤더에 *userAgentString*을 추가합니다.

예제:

```
await synthetics.addUserAgent(page, "MyApp-1.0");
```

페이지의 사용자 에이전트 헤더가 ` browsers-user-agent-header-valueMyApp-1.0`으로 설정됩니다.

#### async executeStep(stepName, functionToExecute, [stepConfig]);
<a name="CloudWatch_Synthetics_Library_executeStep"></a>

제공된 단계를 실행하며 시작/성공/실패 로깅, 시작/성공/실패 스크린샷, 성공/실패 및 기간 지표로 래핑합니다.

**참고**  
`syn-nodejs-2.1` 이상 런타임을 사용하는 경우 스크린샷을 생성할지 여부 및 시기를 구성할 수 있습니다. 자세한 내용은 [SyntheticsConfiguration 클래스](#CloudWatch_Synthetics_Library_SyntheticsConfiguration) 섹션을 참조하세요.

`executeStep` 함수는 다음 작업도 수행합니다.
+ 단계가 시작되었음을 기록합니다.
+ 이름이 `<stepName>-starting`인 스크린샷을 캡처합니다.
+ 타이머를 시작합니다.
+ 제공된 함수를 실행합니다.
+ 함수가 값을 정상적으로 반환하면 성공한 것으로 간주됩니다. 함수가 오류를 생성하면 실패한 것으로 간주됩니다.
+ 타이머를 종료합니다.
+ 단계 성공 또는 실패 여부를 기록합니다.
+ 이름이 `<stepName>-succeeded` 또는 ` <stepName>-failed`인 스크린샷을 캡처합니다.
+ `stepName` `SuccessPercent` 지표(성공 시 100, 실패 시 0)를 내보냅니다.
+ 단계 시작 및 종료 시간 기준의 값을 사용하여 `stepName` `Duration` 지표를 내보냅니다.
+ 마지막으로, `functionToExecute`에서 반환된 값을 반환하고 `functionToExecute`에서 생성된 오류를 다시 생성합니다.

canary가 `syn-nodejs-2.0` 런타임 이상을 사용하는 경우 이 함수는 canary의 보고서에 단계 실행 요약도 추가합니다. 요약에는 시작 시간, 종료 시간, 상태(PASSED/FAILED), 실패 원인(실패한 경우), 각 단계를 실행하는 동안 캡처된 스크린샷과 같은 각 단계에 관한 세부 정보가 포함됩니다.

예제:

```
await synthetics.executeStep('navigateToUrl', async function (timeoutInMillis = 30000) {
           await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});});
```

응답:

`functionToExecute`에서 반환된 값을 반환합니다.

 **syn-nodejs-2.2로 업데이트** 

`syn-nodejs-2.2`부터 선택적으로 단계 구성을 전달하여 단계 수준에서 CloudWatch Synthetics 구성을 재정의할 수 있습니다. `executeStep`에 전달할 수 있는 옵션 목록은 [SyntheticsConfiguration 클래스](#CloudWatch_Synthetics_Library_SyntheticsConfiguration) 단원을 참조하세요.

다음 예에서는 ` continueOnStepFailure`에 대한 기본 `false` 구성을 `true`로 재정의하고 스크린샷을 생성할 시기를 지정합니다.

```
var stepConfig = {
    'continueOnStepFailure': true,
    'screenshotOnStepStart': false,
    'screenshotOnStepSuccess': true,
    'screenshotOnStepFailure': false
}

await executeStep('Navigate to amazon', async function (timeoutInMillis = 30000) {
      await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});
 }, stepConfig);
```

#### getDefaultLaunchOptions();
<a name="CloudWatch_Synthetics_Library_getDefaultLaunchOptions"></a>

`getDefaultLaunchOptions()` 함수는 CloudWatch Synthetics에서 사용하는 브라우저 시작 옵션을 반환합니다. 자세한 내용은 [Launch options type](https://pptr.dev/browsers-api/browsers.launchoptions/) 섹션을 참조하세요.

```
// This function returns default launch options used by Synthetics.
const defaultOptions = await synthetics.getDefaultLaunchOptions();
```

#### getPage();
<a name="CloudWatch_Synthetics_Library_getPage"></a>

현재 열린 페이지를 Puppeteer 객체로 반환합니다. 자세한 내용은 [Puppeteer API v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md)을 참조하세요.

예제:

```
let page = await synthetics.getPage();
```

응답:

현재 브라우저 세션에서 현재 열려 있는 페이지(Puppeteer 객체)입니다.

#### getRequestResponseLogHelper();
<a name="CloudWatch_Synthetics_Library_getRequestResponseLogHelper"></a>

**중요**  
`syn-nodejs-puppeteer-3.2` 런타임 이상을 사용하는 canary에서는 `RequestResponseLogHelper` 클래스와 함께 이 함수가 더 이상 사용되지 않습니다. 이 함수를 사용하면 canary 로그에 경고가 표시됩니다. 이 함수는 향후 런타임 버전에서 제거됩니다. 이 함수를 사용할 경우 대신 [RequestResponseLogHelper 클래스](#CloudWatch_Synthetics_Library_RequestResponseLogHelper) 클래스를 사용하세요.

이 함수는 요청 및 응답 로깅 플래그를 수정하기 위한 빌더 패턴으로 사용됩니다.

예제:

```
synthetics.setRequestResponseLogHelper(getRequestResponseLogHelper().withLogRequestHeaders(false));;
```

응답:

```
{RequestResponseLogHelper}
```

#### launch(options)
<a name="CloudWatch_Synthetics_Library_LaunchOptions"></a>

이 함수의 옵션은 `syn-nodejs-2.1` 런타임 버전 이상에서만 사용할 수 있습니다.

이 함수는 UI canary에만 사용됩니다. 이 함수는 기존 브라우저를 닫고 새 브라우저를 시작합니다.

**참고**  
CloudWatch Synthetics는 스크립트 실행을 시작하기 전에 항상 브라우저를 시작합니다. 사용자 지정 옵션으로 새 브라우저를 시작하려는 경우 외에는 launch()를 호출할 필요가 없습니다.

(options)는 브라우저에 설정할 수 있는 구성 가능한 옵션 집합입니다. 자세한 내용은 [실행 옵션 유형](https://pptr.dev/browsers-api/browsers.launchoptions/) 섹션을 참조하세요.

옵션 없이 이 함수를 호출하면 Synthetics는 기본 인수인 `executablePath` 및 `defaultViewport`를 사용하여 브라우저를 시작합니다. CloudWatch Synthetics의 기본 뷰포트는 1920 x 1080입니다.

CloudWatch Synthetics에서 사용하는 시작 파라미터를 재정의할 수 있으며 브라우저를 시작할 때 추가 파라미터를 전달할 수 있습니다. 예를 들어 다음 코드 조각에서는 기본 인수와 기본 실행 경로를 사용하여 브라우저를 시작하지만 뷰포트는 800 x 600입니다.

```
await synthetics.launch({
        defaultViewport: { 
            "deviceScaleFactor": 1, 
            "width": 800,
            "height": 600 
    }});
```

다음 샘플 코드에서는 CloudWatch Synthetics 시작 파라미터에 새로운 `ignoreHTTPSErrors` 파라미터를 추가합니다.

```
await synthetics.launch({
        ignoreHTTPSErrors: true
 });
```

다음과 같이 CloudWatch Synthetics 시작 파라미터의 인수에 `--disable-web-security` 플래그를 추가하여 웹 보안을 사용 중지할 수 있습니다.

```
// This function adds the --disable-web-security flag to the launch parameters
const defaultOptions = await synthetics.getDefaultLaunchOptions();
const launchArgs = [...defaultOptions.args, '--disable-web-security'];
await synthetics.launch({
     args: launchArgs
  });
```

#### RequestResponseLogHelper 클래스
<a name="CloudWatch_Synthetics_Library_RequestResponseLogHelper"></a>

**중요**  
`syn-nodejs-puppeteer-3.2` 런타임 이상을 사용하는 canary에서는 이 클래스가 더 이상 사용되지 않습니다. 이 클래스를 사용하면 canary 로그에 경고가 표시됩니다. 이 함수는 향후 런타임 버전에서 제거됩니다. 이 함수를 사용할 경우 대신 [RequestResponseLogHelper 클래스](#CloudWatch_Synthetics_Library_RequestResponseLogHelper) 클래스를 사용하세요.

요청 및 응답 페이로드의 세분화된 구성 및 문자열 표현 생성을 처리합니다.

```
class RequestResponseLogHelper {
 
    constructor () {
        this.request = {url: true, resourceType: false, method: false, headers: false, postData: false};
        this.response = {status: true, statusText: true, url: true, remoteAddress: false, headers: false};
    }
 
    withLogRequestUrl(logRequestUrl);
    
    withLogRequestResourceType(logRequestResourceType);
    
    withLogRequestMethod(logRequestMethod);
    
    withLogRequestHeaders(logRequestHeaders);
    
    withLogRequestPostData(logRequestPostData);

        
    withLogResponseStatus(logResponseStatus);
    
    withLogResponseStatusText(logResponseStatusText);
   
    withLogResponseUrl(logResponseUrl);
 
    withLogResponseRemoteAddress(logResponseRemoteAddress);
    
    withLogResponseHeaders(logResponseHeaders);
```

예제:

```
synthetics.setRequestResponseLogHelper(getRequestResponseLogHelper()
.withLogRequestPostData(true)
.withLogRequestHeaders(true)
.withLogResponseHeaders(true));
```

응답:

```
{RequestResponseLogHelper}
```

#### setRequestResponseLogHelper();
<a name="CloudWatch_Synthetics_Library_setRequestResponseLogHelper"></a>

**중요**  
`syn-nodejs-puppeteer-3.2` 런타임 이상을 사용하는 canary에서는 `RequestResponseLogHelper` 클래스와 함께 이 함수가 더 이상 사용되지 않습니다. 이 함수를 사용하면 canary 로그에 경고가 표시됩니다. 이 함수는 향후 런타임 버전에서 제거됩니다. 이 함수를 사용할 경우 대신 [RequestResponseLogHelper 클래스](#CloudWatch_Synthetics_Library_RequestResponseLogHelper) 클래스를 사용하세요.

이 함수는 요청 및 응답 로깅 플래그를 설정하기 위한 빌더 패턴으로 사용됩니다.

예제:

```
synthetics.setRequestResponseLogHelper().withLogRequestHeaders(true).withLogResponseHeaders(true);
```

응답:

```
{RequestResponseLogHelper}
```

#### async takeScreenshot(name, suffix);
<a name="CloudWatch_Synthetics_Library_takeScreenshot"></a>

이름 및 접미사를 사용하여 현재 페이지의 스크린샷(.PNG)을 생성합니다(선택 사항).

예제:

```
await synthetics.takeScreenshot("navigateToUrl", "loaded")
```

이 예에서는 ` 01-navigateToUrl-loaded.png`라는 스크린샷을 캡처하여 canary의 S3 버킷에 업로드합니다.

` stepName`을 첫 번째 파라미터로 전달하여 특정 canary 단계에 대한 스크린샷을 생성할 수 있습니다. 스크린샷은 보고서의 canary 단계에 연결되어 디버깅하는 동안 각 단계를 추적하는 데 도움이 됩니다.

CloudWatch Synthetics canary는 단계 시작 전(`executeStep` 함수)과 단계 완료 후에 자동으로 스크린샷을 생성합니다(스크린샷을 사용 중지하도록 canary를 구성하지 않은 경우). `takeScreenshot` 함수에서 단계 이름을 전달하면 더 많은 스크린샷을 생성할 수 있습니다.

다음 예에서는 `stepName`의 값으로 `signupForm`을 사용하여 스크린샷을 생성합니다. 스크린샷은 이름이 ` 02-signupForm-address`가 되며 canary 보고서의 ` signupForm`이라는 단계에 연결됩니다.

```
await synthetics.takeScreenshot('signupForm', 'address')
```

### BrokenLinkCheckerReport 클래스
<a name="CloudWatch_Synthetics_Library_BrokenLinkCheckerReport"></a>

이 클래스는 Synthetics 링크를 추가하는 메서드를 제공합니다. `syn-nodejs-2.0-beta` 런타임 버전 이상을 사용하는 canary에서만 지원됩니다.

`BrokenLinkCheckerReport`를 사용하려면 스크립트에 다음 줄을 포함합니다.

```
const BrokenLinkCheckerReport = require('@aws/synthetics-broken-link-checker-report');
            
const brokenLinkCheckerReport = new BrokenLinkCheckerReport();
```

유용한 함수 정의:

 **addLink(*syntheticsLink*, isBroken)** 

` syntheticsLink `는 링크를 나타내는 ` SyntheticsLink` 객체입니다. 이 함수는 상태 코드에 따라 링크를 추가합니다. 기본적으로 상태 코드를 사용할 수 없거나 상태 코드가 400 이상인 경우 이 함수는 링크가 잘못된 것으로 간주합니다. 선택적 파라미터 `isBrokenLink`를 `true` 또는 `false` 값과 함께 전달하여 이 기본 동작을 재정의할 수 있습니다.

이 함수에는 반환 값이 없습니다.

 **getLinks()** 

이 함수는 잘못된 링크 검사기 보고서에 포함된 `SyntheticsLink` 객체의 배열을 반환합니다.

 **getTotalBrokenLinks()** 

이 함수는 잘못된 링크의 총수를 나타내는 숫자를 반환합니다.

 **getTotalLinksChecked()** 

이 함수는 보고서에 포함된 링크의 총수를 나타내는 숫자를 반환합니다.

 **BrokenLinkCheckerReport 사용 방법** 

다음 canary 스크립트 코드 조각은 링크를 탐색하여 잘못된 링크 검사기 보고서에 추가하는 예를 보여 줍니다.

1. `SyntheticsLink`, `BrokenLinkCheckerReport`, ` Synthetics`를 가져옵니다.

   ```
   const BrokenLinkCheckerReport = require('@aws/synthetics-broken-link-checker-report');
   const SyntheticsLink = require('@aws/synthetics-link');
   
   // Synthetics dependency
   const synthetics = require('@aws/synthetics-puppeteer');
   ```

1. 보고서에 대한 링크를 추가하려면 ` BrokenLinkCheckerReport`의 인스턴스를 생성합니다.

   ```
   let brokenLinkCheckerReport = new BrokenLinkCheckerReport();
   ```

1. URL을 탐색하여 잘못된 링크 검사기 보고서에 추가합니다.

   ```
   let url = "https://amazon.com";
   
   let syntheticsLink = new SyntheticsLink(url);
   
   // Navigate to the url.
   let page = await synthetics.getPage();
   
   // Create a new instance of Synthetics Link
   let link = new SyntheticsLink(url)
   
   try {
       const response = await page.goto(url, {waitUntil: 'domcontentloaded', timeout: 30000});
   } catch (ex) {
       // Add failure reason if navigation fails.
       link.withFailureReason(ex);
   }
   
   if (response) {
       // Capture screenshot of destination page
       let screenshotResult = await synthetics.takeScreenshot('amazon-home', 'loaded');
      
       // Add screenshot result to synthetics link
       link.addScreenshotResult(screenshotResult);
   
       // Add status code and status description to the link
       link.withStatusCode(response.status()).withStatusText(response.statusText())
   }
   
   // Add link to broken link checker report.
   brokenLinkCheckerReport.addLink(link);
   ```

1. 보고서를 Synthetics에 추가합니다. 그러면 각 canary 실행에 대해 ` BrokenLinkCheckerReport.json`이라는 JSON 파일이 S3 버킷에 생성됩니다. 스크린샷, 로그, HAR 파일과 함께 각 canary 실행에 대한 링크 보고서를 콘솔에서 확인할 수 있습니다.

   ```
   await synthetics.addReport(brokenLinkCheckerReport);
   ```

### SyntheticsLink 클래스
<a name="CloudWatch_Synthetics_Library_SyntheticsLink"></a>

이 클래스는 정보를 래핑하는 메서드를 제공합니다. `syn-nodejs-2.0-beta` 런타임 버전 이상을 사용하는 canary에서만 지원됩니다.

`SyntheticsLink`를 사용하려면 스크립트에 다음 줄을 포함합니다.

```
const SyntheticsLink = require('@aws/synthetics-link');

const syntheticsLink = new SyntheticsLink("https://www.amazon.com");
```

이 함수는 `syntheticsLinkObject`를 반환합니다.

유용한 함수 정의:

 **withUrl(*url*)** 

` url `은 URL 문자열입니다. 이 함수는 `syntheticsLinkObject`를 반환합니다.

 **withText(*text*)** 

` text `는 앵커 텍스트를 나타내는 문자열입니다. 이 함수는 `syntheticsLinkObject`를 반환합니다. 이 함수는 링크에 해당하는 앵커 텍스트를 추가합니다.

 **withParentUrl(*parentUrl*)** 

` parentUrl `은 상위(소스 페이지) URL을 나타내는 문자열입니다. 이 함수는 `syntheticsLink Object`를 반환합니다.

 **withStatusCode(*statusCode*)** 

` statusCode `는 상태 코드를 나타내는 문자열입니다. 이 함수는 `syntheticsLinkObject`를 반환합니다.

 **withFailureReason(*failureReason*)** 

` failureReason `은 실패 원인을 나타내는 문자열입니다. 이 함수는 `syntheticsLink Object`를 반환합니다.

 **addScreenshotResult(*screenshotResult*)** 

` screenshotResult `는 객체이며, Synthetics 함수 `takeScreenshot`에 의해 반환된 `ScreenshotResult`의 인스턴스입니다. 객체에는 다음이 포함됩니다.
+ `fileName` - ` screenshotFileName`을 나타내는 문자열
+ `pageUrl` (선택 사항)
+ `error` (선택 사항)

## API canary에만 적용되는 Node.js 라이브러리 클래스 및 함수
<a name="CloudWatch_Synthetics_Library_APIcanaries"></a>

다음 Node.js용 CloudWatch Synthetics 라이브러리 함수는 API canary에만 사용할 수 있습니다.

**Topics**
+ [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#CloudWatch_Synthetics_Library_executeHttpStep)

### executeHttpStep(stepName, requestOptions, [callback], [stepConfig])
<a name="CloudWatch_Synthetics_Library_executeHttpStep"></a>

제공된 HTTP 요청을 단계로 실행하고 `SuccessPercent`(통과 또는 실패) 및 `Duration` 지표를 게시합니다.

**executeHttpStep**은 요청에 지정된 프로토콜에 따라 내부적으로 HTTP 또는 HTTPS 네이티브 함수를 사용합니다.

이 함수는 canary의 보고서에 단계 실행 요약도 추가합니다. 요약에는 다음과 같은 각 HTTP 요청에 관한 세부 정보가 포함됩니다.
+ 시작 시간
+ 종료 시간
+ 상태(PASSED/FAILED)
+ 실패 원인(실패한 경우)
+ 요청 또는 응답 헤더, 본문, 상태 코드, 상태 메시지, 성능 타이밍과 같은 HTTP 호출 세부 정보 

**Topics**
+ [파라미터](#CloudWatch_Synthetics_Library_executeHttpStep_parameters)
+ [executeHttpStep 사용 예](#CloudWatch_Synthetics_Library_executeHttpStep_examples)

#### 파라미터
<a name="CloudWatch_Synthetics_Library_executeHttpStep_parameters"></a>

 **stepName(*String*)** 

단계 이름을 지정합니다. 이 이름은 이 단계의 CloudWatch 지표 게시에도 사용됩니다.

 **requestOptions(*Object 또는 String*)** 

이 파라미터의 값은 URL, URL 문자열 또는 객체일 수 있습니다. 객체인 경우 HTTP 요청을 수행하기 위해 구성 가능한 옵션 집합이어야 합니다. Node.js 설명서에 있는 [http.request(options[, callback])](https://nodejs.org/api/http.html#http_http_request_options_callback)의 모든 옵션을 지원합니다.

이러한 Node.js 옵션 외에도 **requestOptions**는 추가 파라미터인 `body`를 지원합니다. `body` 파라미터를 사용하면 데이터를 요청 본문으로 전달할 수 있습니다.

 **callback(*response*)** 

(선택 사항) HTTP 응답을 사용하여 호출되는 사용자 함수입니다. 응답은 [클래스: http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage) 유형입니다.

 **stepConfig(*object*)** 

(선택 사항) 이 파라미터를 사용하여 이 단계의 다른 구성으로 글로벌 Synthetics 구성을 재정의할 수 있습니다.

#### executeHttpStep 사용 예
<a name="CloudWatch_Synthetics_Library_executeHttpStep_examples"></a>

다음 일련의 예는 서로를 기반으로 하여 이 옵션의 다양한 사용을 보여 줍니다.

이 첫 번째 예에서는 요청 파라미터를 구성합니다. URL을 **requestOptions**로 전달할 수 있습니다.

```
let requestOptions = 'https://www.amazon.com';
```

또는 다음과 같은 옵션 집합을 전달할 수 있습니다.

```
let requestOptions = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
```

다음 예에서는 응답을 수락하는 콜백 함수를 생성합니다. 기본적으로 [**콜백(callback)**]을 지정하지 않으면 CloudWatch Synthetics는 상태가 200\$1299(포함)인지 확인합니다.

```
// Handle validation for positive scenario
    const callback = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
```

다음 예에서는 글로벌 CloudWatch Synthetics 구성을 재정의하는 이 단계의 구성을 생성합니다. 이 예에서 단계 구성은 보고서의 요청 헤더, 응답 헤더, 요청 본문(게시물 데이터), 응답 본문을 허용하고 X-Amz-Security-Token' 및 'Authorization' 헤더 값을 제한합니다. 기본적으로 이러한 값은 보안상의 이유로 보고서에 포함되지 않습니다. 이러한 값을 포함하도록 선택하는 경우 데이터는 S3 버킷에만 저장됩니다.

```
// By default headers, post data, and response body are not included in the report for security reasons. 
// Change the configuration at global level or add as step configuration for individual steps
let stepConfig = {
    includeRequestHeaders: true, 
    includeResponseHeaders: true,
    restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
    includeRequestBody: true,
    includeResponseBody: true
};
```

이 마지막 예에서는 요청을 **executeHttpStep**에 전달하고 단계의 이름을 지정합니다.

```
await synthetics.executeHttpStep('Verify GET products API', requestOptions, callback, stepConfig);
```

이 일련의 예를 통해 CloudWatch Synthetics는 보고서의 각 단계에서 세부 정보를 추가하고 **stepName**을 사용하여 각 단계의 지표를 생성합니다.

 `Verify GET products API` 단계의 `successPercent` 및 `duration` 지표를 확인할 수 있습니다. API 호출 단계의 지표를 모니터링하여 API 성능을 모니터링할 수 있습니다.

이러한 함수를 사용하는 완전한 스크립트 샘플은 [다단계 API canary](CloudWatch_Synthetics_Canaries_Samples.md#CloudWatch_Synthetics_Canaries_Samples_APIsteps) 단원을 참조하세요.

# Selenium을 사용하는 Python canary 스크립트에 사용할 수 있는 라이브러리 함수
<a name="CloudWatch_Synthetics_Canaries_Library_Python"></a>

이 단원에서는 Python canary 스크립트에 사용할 수 있는 Selenium 라이브러리 함수를 설명합니다.

**Topics**
+ [모든 canary에 적용되는 Python 및 Selenium 라이브러리 클래스 및 함수](#CloudWatch_Synthetics_Library_allcanaries_Python)
+ [UI canary에만 적용되는 Python 및 Selenium 라이브러리 클래스 및 함수](#CloudWatch_Synthetics_Library_Python_UIcanaries)

## 모든 canary에 적용되는 Python 및 Selenium 라이브러리 클래스 및 함수
<a name="CloudWatch_Synthetics_Library_allcanaries_Python"></a>

다음 Python용 CloudWatch Synthetics Selenium 라이브러리 함수는 모든 canary에 사용할 수 있습니다.

**Topics**
+ [SyntheticsConfiguration 클래스](#CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python)
+ [SyntheticsLogger 클래스](#CloudWatch_Synthetics_Library_SyntheticsLogger_Python)

### SyntheticsConfiguration 클래스
<a name="CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python"></a>

SyntheticsConfiguration 클래스를 사용하여 Synthetics 라이브러리 함수의 동작을 구성할 수 있습니다. 예를 들어 이 클래스를 사용하여 스크린샷을 캡처하지 않도록 ` executeStep()` 함수를 구성할 수 있습니다.

글로벌 수준에서 CloudWatch Synthetics 구성을 설정할 수 있습니다.

함수 정의:

#### set\$1config(options)
<a name="CloudWatch_Synthetics_Library_setConfig_Python"></a>

```
from aws_synthetics.common import synthetics_configuration
```

` options `는 canary에 대해 구성 가능한 옵션의 집합인 객체입니다. 다음 단원에서는 ` options `의 가능한 필드를 설명합니다.
+ `screenshot_on_step_start`(boolean) - 단계를 시작하기 전에 스크린샷을 생성할지 여부입니다.
+ `screenshot_on_step_success`(boolean) - 성공적인 단계를 완료한 후 스크린샷을 생성할지 여부입니다.
+ `screenshot_on_step_failure`(boolean) - 단계가 실패한 후 스크린샷을 생성할지 여부입니다.

 **with\$1screenshot\$1on\$1step\$1start(screenshot\$1on\$1step\$1start)** 

단계를 시작하기 전에 스크린샷을 생성할지 여부를 나타내는 부울 인수를 허용합니다.

 **with\$1screenshot\$1on\$1step\$1success(screenshot\$1on\$1step\$1success)** 

단계를 성공적으로 완료한 후 스크린샷을 생성할지 여부를 나타내는 부울 인수를 허용합니다.

 **with\$1screenshot\$1on\$1step\$1failure(screenshot\$1on\$1step\$1failure)** 

단계가 실패한 후 스크린샷을 생성할지 여부를 나타내는 부울 인수를 허용합니다.

 **get\$1screenshot\$1on\$1step\$1start()** 

단계를 시작하기 전에 스크린샷을 생성할지 여부를 반환합니다.

 **get\$1screenshot\$1on\$1step\$1success()** 

단계를 성공적으로 완료한 후 스크린샷을 생성할지 여부를 반환합니다.

 **get\$1screenshot\$1on\$1step\$1failure()** 

단계가 실패한 후 스크린샷을 생성할지 여부를 반환합니다.

 **disable\$1step\$1screenshots()** 

모든 스크린샷 옵션(get\$1screenshot\$1on\$1step\$1start, get\$1screenshot\$1on\$1step\$1success, get\$1screenshot\$1on\$1step\$1failure)을 사용 중지합니다.

 **enable\$1step\$1screenshots()** 

모든 스크린샷 옵션(get\$1screenshot\$1on\$1step\$1start, get\$1screenshot\$1on\$1step\$1success, get\$1screenshot\$1on\$1step\$1failure)을 사용하도록 설정합니다. 기본적으로 이러한 메서드는 모두 사용 설정되어 있습니다.

 **CloudWatch 지표에 관한 setConfig(options)** 

`syn-python-selenium-1.1` 이상을 사용하는 카나리의 경우 **setConfig**의 **(options)**에는 카나리에서 게시하는 지표를 결정하는 다음 부울 파라미터가 포함될 수 있습니다. 이러한 각 옵션의 기본값은 `true`입니다. ` aggregated`로 시작하는 옵션은 ` CanaryName` 측정기준 없이 지표를 내보낼지 여부를 결정합니다. 이러한 지표를 사용하여 모든 canary에 대한 집계 결과를 확인할 수 있습니다. 다른 옵션은 `CanaryName` 측정기준과 함께 지표를 내보낼지 여부를 결정합니다. 이러한 지표를 사용하여 각 개별 canary의 결과를 확인할 수 있습니다.

canary에서 내보내는 CloudWatch 지표 목록은 [canary가 게시한 CloudWatch 지표](CloudWatch_Synthetics_Canaries_metrics.md) 단원을 참조하세요.
+ `failed_canary_metric`(boolean) - 이 canary에 대한 ` Failed` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `failed_requests_metric`(boolean) - 이 canary에 대한 `Failed requests` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `2xx_metric`(boolean) - 이 canary에 대한 `2xx` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `4xx_metric`(boolean) - 이 canary에 대한 `4xx` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `5xx_metric`(boolean) - 이 canary에 대한 `5xx` 지표를 (`CanaryName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `step_duration_metric`(boolean) - 이 canary에 대한 `Step duration` 지표를 (`CanaryName` `StepName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `step_success_metric`(boolean) - 이 canary에 대한 `Step success` 지표를 (`CanaryName` `StepName` 측정기준과 함께) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated_failed_canary_metric`(boolean) - 이 canary에 대한 `Failed` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated_failed_requests_metric`(boolean) - 이 canary에 대한 `Failed Requests` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated_2xx_metric`(boolean) - 이 canary에 대한 ` 2xx` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated_4xx_metric`(boolean) - 이 canary에 대한 ` 4xx` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.
+ `aggregated_5xx_metric`(boolean) - 이 canary에 대한 ` 5xx` 지표를 (`CanaryName` 측정기준 없이) 내보낼지 여부입니다. 기본값은 `true`입니다.

 **with\$12xx\$1metric(2xx\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `2xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$14xx\$1metric(4xx\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `4xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$15xx\$1metric(5xx\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `5xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withAggregated2xxMetric(aggregated2xxMetric)** 

이 canary에 대한 측정기준 없이 `2xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **withAggregated4xxMetric(aggregated4xxMetric)** 

이 canary에 대한 측정기준 없이 `4xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$1aggregated\$15xx\$1metric(aggregated\$15xx\$1metric)** 

이 canary에 대한 측정기준 없이 `5xx` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 ** with\$1aggregated\$1failed\$1canary\$1metric(aggregated\$1failed\$1canary\$1metric)** 

이 canary에 대한 측정기준 없이 `Failed` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 ** with\$1aggregated\$1failed\$1requests\$1metric(aggregated\$1failed\$1requests\$1metric)** 

이 canary에 대한 측정기준 없이 `Failed requests` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$1failed\$1canary\$1metric(failed\$1canary\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `Failed` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$1failed\$1requests\$1metric(failed\$1requests\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `Failed requests` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$1step\$1duration\$1metric(step\$1duration\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `Duration` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

 **with\$1step\$1success\$1metric(step\$1success\$1metric)** 

이 canary에 대한 `CanaryName` 측정기준과 함께 `StepSuccess` 지표를 내보낼지 여부를 지정하는 부울 인수를 허용합니다.

##### 지표를 사용 또는 사용 중지하는 메서드
<a name="CloudWatch_Synthetics_Python_setConfig_metrics"></a>

 **disable\$1aggregated\$1request\$1metrics()** 

canary가 ` CanaryName` 측정기준 없이 내보내지는 모든 요청 지표를 내보내지 못하도록 합니다.

 **disable\$1request\$1metrics()** 

canary별 지표와 모든 canary에서 집계된 지표를 모두 포함하여 모든 요청 지표를 사용 중지합니다.

 **disable\$1step\$1metrics()** 

단계 성공 지표 및 단계 지속 시간 지표 모두를 포함하여 모든 단계 지표를 사용 중지합니다.

 **enable\$1aggregated\$1request\$1metrics()** 

canary가 ` CanaryName` 측정기준 없이 내보내지는 모든 요청 지표를 내보낼 수 있도록 합니다.

 **enable\$1request\$1metrics()** 

canary별 지표와 모든 canary에서 집계된 지표를 모두 포함하여 모든 요청 지표를 사용하도록 설정합니다.

 **enable\$1step\$1metrics()** 

단계 성공 지표 및 단계 지속 시간 지표 모두를 포함하여 모든 단계 지표를 사용 설정합니다.

 **UI canary의 사용** 

먼저, Synthetics 종속 항목을 가져오고 구성을 가져옵니다. 다음으로, 다음 옵션 중 하나를 사용하여 setConfig 메서드를 호출함으로써 각 옵션의 구성을 설정합니다.

```
from aws_synthetics.common import synthetics_configuration

synthetics_configuration.set_config(
     {
        "screenshot_on_step_start": False,
        "screenshot_on_step_success": False,
        "screenshot_on_step_failure": True
     }
)

or
```

또는

```
synthetics_configuration.with_screenshot_on_step_start(False).with_screenshot_on_step_success(False).with_screenshot_on_step_failure(True)
```

모든 스크린샷을 사용 중지하려면 이 예와 같이 disableStepScreenshots() 함수를 사용합니다.

```
synthetics_configuration.disable_step_screenshots()
```

코드의 어느 지점에서든 스크린샷을 사용 및 사용 중지할 수 있습니다. 예를 들어 한 단계에 대해서만 스크린샷을 사용 중지하려면 해당 단계를 실행하기 전에 스크린샷을 사용 중지한 다음, 이 단계가 끝나면 스크린샷을 사용하도록 설정합니다.

##### UI canary에 대한 set\$1config(options)
<a name="CloudWatch_Synthetics_Library_Python_UI"></a>

`syn-python-selenium-1.1`을 시작으로 UI canary의 경우 ` set_config`에 다음 부울 파라미터가 포함될 수 있습니다.
+ `continue_on_step_failure`(부울) - 단계가 실패한 후 카나리 스크립트를 계속 실행할지 여부입니다(단계 실패에 대해서는 **executeStep** 함수 참조). 단계가 실패한 경우 canary 실행은 여전히 ​​실패로 표시됩니다. 기본값은 `false`입니다.

### SyntheticsLogger 클래스
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger_Python"></a>

`synthetics_logger`는 동일한 로그 수준에서 콘솔과 로컬 로그 파일 모두에 로그를 작성합니다. 이 로그 파일은 로그 수준이 호출된 로그 함수의 원하는 로깅 수준 이하인 경우에만 두 위치에 기록됩니다.

로컬 로그 파일의 로깅 문 앞에는 호출된 함수의 로그 수준과 일치하도록 “DEBUG: “, “INFO: “등이 추가됩니다.

Amazon S3 결과 위치에 업로드되는 로그 파일을 생성할 때는 `synthetics_logger`를 사용할 필요가 없습니다. 대신 `/tmp` 폴더에 다른 로그 파일을 생성할 수 있습니다. `/tmp` 폴더 아래에 생성된 파일은 S3 버킷의 결과 위치에 아티팩트로 업로드됩니다.

`synthetics_logger`를 사용하려면

```
from aws_synthetics.common import synthetics_logger
```

****유용한 함수 정의:

로그 수준 가져오기:

```
log_level = synthetics_logger.get_level()
```

로그 수준 설정:

```
synthetics_logger.set_level()
```

지정된 수준의 메시지를 로그합니다. 수준은 다음 구문 예와 같이 `DEBUG`, ` INFO`, `WARN` 또는 `ERROR`일 수 있습니다.

```
synthetics_logger.debug(message, *args, **kwargs)
```

```
synthetics_logger.info(message, *args, **kwargs)
```

```
synthetics_logger.log(message, *args, **kwargs)
```

```
synthetics_logger.warning(message, *args, **kwargs)
```

```
synthetics_logger.error(message, *args, **kwargs)
```

디버그 파라미터에 대한 자세한 내용은 표준 Python 설명서의 [logging.debug](https://docs.python.org/3/library/logging.html#logging.debug)를 참조하세요.

이러한 로깅 함수에서 `message`는 메시지 형식 문자열입니다. `args`는 문자열 형식 지정 연산자를 사용하여 `msg`에 병합되는 인수입니다.

`kwargs`에는 다음과 같은 세 가지 키워드 인수가 있습니다.
+ `exc_info` - false로 평가되지 않은 경우 예외 정보를 로깅 메시지에 추가합니다.
+ `stack_info` - 기본값은 false입니다. true인 경우 실제 로깅 호출을 포함하여 스택 정보를 로깅 메시지에 추가합니다.
+ `extra` - 사용자 정의 속성으로 로깅 이벤트에 대해 생성된 `LogRecord`의 `__dict__`를 채우는 데 사용되는 사전을 전달하는 데 사용할 수 있는 세 번째 선택적 키워드 인수입니다.

예시:

`DEBUG` 수준의 메시지 로그:

```
synthetics_logger.debug('Starting step - login.')
```

`INFO` 수준의 메시지 로그(`logger.log`는 `logger.info`의 동의어임):

```
synthetics_logger.info('Successfully completed step - login.')
```

또는

```
synthetics_logger.log('Successfully completed step - login.')
```

`WARN` 수준의 메시지 로그:

```
synthetics_logger.warning('Warning encountered trying to publish %s', 'CloudWatch Metric')
```

`ERROR` 수준의 메시지 로그:

```
synthetics_logger.error('Error encountered trying to publish %s', 'CloudWatch Metric')
```

예외 로그:

```
synthetics_logger.exception(message, *args, **kwargs)
```

`ERROR` 수준의 메시지를 로그합니다. 예외 정보가 로깅 메시지에 추가됩니다. 예외 핸들러에서만 이 함수를 호출해야 합니다.

예외 파라미터에 대한 자세한 내용은 표준 Python 설명서의 [logging.exception](https://docs.python.org/3/library/logging.html#logging.exception)을 참조하세요.

`message`는 메시지 형식 문자열입니다. `args`는 문자열 형식 지정 연산자를 사용하여 `msg`에 병합되는 인수입니다.

`kwargs`에는 다음과 같은 세 가지 키워드 인수가 있습니다.
+ `exc_info` - false로 평가되지 않은 경우 예외 정보를 로깅 메시지에 추가합니다.
+ `stack_info` - 기본값은 false입니다. true인 경우 실제 로깅 호출을 포함하여 스택 정보를 로깅 메시지에 추가합니다.
+ `extra` - 사용자 정의 속성으로 로깅 이벤트에 대해 생성된 `LogRecord`의 `__dict__`를 채우는 데 사용되는 사전을 전달하는 데 사용할 수 있는 세 번째 선택적 키워드 인수입니다.

예제:

```
synthetics_logger.exception('Error encountered trying to publish %s', 'CloudWatch Metric')
```

## UI canary에만 적용되는 Python 및 Selenium 라이브러리 클래스 및 함수
<a name="CloudWatch_Synthetics_Library_Python_UIcanaries"></a>

다음 Python용 CloudWatch Synthetics Selenium 라이브러리 함수는 UI canary에만 사용할 수 있습니다.

**Topics**
+ [SyntheticsBrowser 클래스](#CloudWatch_Synthetics_Library_Python_SyntheticsBrowser)
+ [SyntheticsWebDriver 클래스](#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver)

### SyntheticsBrowser 클래스
<a name="CloudWatch_Synthetics_Library_Python_SyntheticsBrowser"></a>

**참고**  
`SyntheticsBrowser`는 Chrome 브라우저에서만 지원됩니다.

`synthetics_webdriver.Chrome()`을 호출하여 브라우저 인스턴스를 생성할 때 반환되는 브라우저 인스턴스는 `SyntheticsBrowser` 유형입니다. ` SyntheticsBrowser` 클래스는 WebDriver 클래스를 상속하고 [WebDriver](https://www.selenium.dev/documentation/webdriver/)가 공개하는 모든 메서드에 대한 액세스를 제공합니다. ChromeDriver를 제어하고 카나리 스크립트가 브라우저를 구동할 수 있도록 하여 Selenium WebDriver가 Synthetics와 함께 작동할 수 있도록 합니다.

**참고**  
Synthetics는 WebDriver [quit](https://www.selenium.dev/selenium/docs/api/py/selenium_webdriver_firefox/selenium.webdriver.firefox.webdriver.html) 메서드를 재정의하여 아무 작업도 수행하지 않습니다. 브라우저 종료에 대해서는 걱정할 필요가 없습니다. Synthetics가 자동으로 처리합니다.

이 클래스는 표준 Selenium 메서드 외에 다음 메서드도 제공합니다.

**Topics**
+ [set\$1viewport\$1size(width, height)](#CloudWatch_Synthetics_Library_set_viewport_size)
+ [save\$1screenshot(filename, suffix)](#CloudWatch_Synthetics_Library_save_screenshot)

#### set\$1viewport\$1size(width, height)
<a name="CloudWatch_Synthetics_Library_set_viewport_size"></a>

브라우저의 뷰포트를 설정합니다. 예제:

```
browser.set_viewport_size(1920, 1080)
```

#### save\$1screenshot(filename, suffix)
<a name="CloudWatch_Synthetics_Library_save_screenshot"></a>

스크린샷을 `/tmp` 디렉터리에 저장합니다. 스크린샷은 이 디렉터리에서 S3 버킷의 canary 아티팩트 폴더로 업로드됩니다.

*filename*은 스크린샷의 파일 이름이며, *suffix*는 스크린샷의 이름을 지정하는 데 사용할 선택적 문자열입니다.

예제:

```
browser.save_screenshot('loaded.png', 'page1')
```

### SyntheticsWebDriver 클래스
<a name="CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver"></a>

이 클래스를 사용하려면 스크립트에서 다음을 사용합니다.

```
from aws_synthetics.selenium import synthetics_webdriver
```

**Topics**
+ [add\$1execution\$1error(errorMessage, ex);](#CloudWatch_Synthetics_Library_Python_addExecutionError)
+ [add\$1user\$1agent(user\$1agent\$1str)](#CloudWatch_Synthetics_Library_add_user_agent)
+ [execute\$1step(step\$1name, function\$1to\$1execute)](#CloudWatch_Synthetics_Library_Python_execute_step)
+ [get\$1http\$1response(url)](#CloudWatch_Synthetics_Library_Python_get_http_response)
+ [Chrome()](#CloudWatch_Synthetics_Library_Python_Chrome)

#### add\$1execution\$1error(errorMessage, ex);
<a name="CloudWatch_Synthetics_Library_Python_addExecutionError"></a>

`errorMessage`는 오류를 설명하며, `ex`는 발생한 예외입니다.

`add_execution_error`를 사용하여 canary에 대한 실행 오류를 설정할 수 있습니다. 이 함수는 스크립트 실행을 중단하지 않고 canary에 실패합니다. 또한 `successPercent` 지표에 영향을 주지 않습니다.

오류가 canary 스크립트의 성공 또는 실패를 나타내는 데 중요하지 않은 경우에만 오류를 실행 오류로 추적해야 합니다.

`add_execution_error`의 사용 예는 다음과 같습니다. 엔드포인트의 가용성을 모니터링하고 페이지가 로드된 후에 스크린샷을 생성합니다. 스크린샷 캡처 실패가 엔드포인트의 가용성을 결정하지 않기 때문에 스크린샷을 생성하는 동안 발생한 오류를 포착하여 실행 오류로 추가할 수 있습니다. 가용성 지표는 여전히 ​​엔드포인트가 실행 중임을 나타내지만 canary 상태는 실패로 표시됩니다. 다음 샘플 코드 블록은 이러한 오류를 포착하여 실행 오류로 추가합니다.

```
try:
    browser.save_screenshot("loaded.png")  
except Exception as ex:
   self.add_execution_error("Unable to take screenshot", ex)
```

#### add\$1user\$1agent(user\$1agent\$1str)
<a name="CloudWatch_Synthetics_Library_add_user_agent"></a>

브라우저의 사용자 에이전트 헤더에 `user_agent_str` 값을 추가합니다. 브라우저 인스턴스를 생성하기 전에 `user_agent_str`을 할당해야 합니다.

예제:

```
await synthetics_webdriver.add_user_agent('MyApp-1.0')
```

`add_user_agent`는 `async` 함수 내부에서 사용해야 합니다.

#### execute\$1step(step\$1name, function\$1to\$1execute)
<a name="CloudWatch_Synthetics_Library_Python_execute_step"></a>

하나의 함수를 처리합니다. 또한 다음을 수행합니다.
+ 단계가 시작되었음을 기록합니다.
+ 이름이 `<stepName>-starting`인 스크린샷을 캡처합니다.
+ 타이머를 시작합니다.
+ 제공된 함수를 실행합니다.
+ 함수가 값을 정상적으로 반환하면 성공한 것으로 간주됩니다. 함수가 오류를 생성하면 실패한 것으로 간주됩니다.
+ 타이머를 종료합니다.
+ 단계 성공 또는 실패 여부를 기록합니다.
+ 이름이 `<stepName>-succeeded` 또는 ` <stepName>-failed`인 스크린샷을 캡처합니다.
+ `stepName` `SuccessPercent` 지표(성공 시 100, 실패 시 0)를 내보냅니다.
+ 단계 시작 및 종료 시간 기준의 값을 사용하여 `stepName` `Duration` 지표를 내보냅니다.
+ 마지막으로, `functionToExecute`에서 반환된 값을 반환하고 `functionToExecute`에서 생성된 오류를 다시 생성합니다.

예제:

```
from selenium.webdriver.common.by import By

def custom_actions():
        #verify contains
        browser.find_element(By.XPATH, "//*[@id=\"id_1\"][contains(text(),'login')]")
        #click a button
        browser.find_element(By.XPATH, '//*[@id="submit"]/a').click()

    await synthetics_webdriver.execute_step("verify_click", custom_actions)
```

#### get\$1http\$1response(url)
<a name="CloudWatch_Synthetics_Library_Python_get_http_response"></a>

제공된 URL에 대해 HTTP 요청을 생성하고 HTTP 요청의 응답 코드를 반환합니다. HTTP 요청 중에 예외가 발생하면 값이 '오류인 문자열이 대신 반환됩니다.

예제:

```
response_code = syn_webdriver.get_http_response(url)
if not response_code or response_code == "error" or response_code < 200 or response_code > 299:
    raise Exception("Failed to load page!")
```

#### Chrome()
<a name="CloudWatch_Synthetics_Library_Python_Chrome"></a>

Chromium 브라우저의 인스턴스를 시작하고 브라우저의 생성된 인스턴스를 반환합니다.

예제:

```
browser = synthetics_webdriver.Chrome()
browser.get("https://example.com/)
```

시크릿 모드로 브라우저를 시작하려면 다음을 사용하세요.

```
add_argument('——incognito')
```

프록시 설정을 추가하려면 다음을 사용하세요.

```
add_argument('--proxy-server=%s' % PROXY)
```

예제:

```
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("——incognito")
browser = syn_webdriver.Chrome(chrome_options=chrome_options)
```

# cron을 사용하여 canary 실행 예약
<a name="CloudWatch_Synthetics_Canaries_cron"></a>

cron 표현식을 사용하면 canary 일정을 계획할 때 유연하게 설정할 수 있습니다. cron 표현식에는 다음 표에 나열된 순서대로 5개 또는 6개의 필드가 있습니다. 필드는 공백으로 구분됩니다. 구문은 canary를 생성하는 데 CloudWatch 콘솔을 사용하는지, AWS CLI 또는 AWS SDK를 사용하는지에 따라 달라집니다. 콘솔을 사용할 경우 처음 5개의 필드만 지정합니다. AWS CLI 또는 AWS SDK를 사용할 경우 6개 필드를 모두 지정하고 `Year` 필드에 `*`를 지정해야 합니다.


|  **필드**  |  **허용된 값**  |  **허용되는 특수 문자**  | 
| --- | --- | --- | 
|  분  |  0\$159  |  , - \$1 /  | 
|  시간  |  0\$123  |  , - \$1 /  | 
|  날짜  |  1\$131  |  , - \$1 ? / L W  | 
|  월  |  1-12 또는 JAN-DEC  |  , - \$1 /  | 
|  요일  |  1-7 또는 SUN-SAT  |  , - \$1 ? L \$1  | 
|  연도  |  \$1  |    | 

**특수 문자**
+ **,**(쉼표)를 사용하면 필드의 표현식에 여러 값을 포함할 수 있습니다. 예를 들어 Month 필드에서 JAN,FEB,MAR는 1월, 2월, 3월을 포함한다는 의미입니다.
+ **-**(대시) 특수 문자로 범위를 지정할 수 있습니다. 예컨대, Day 필드에서 1-15는 지정된 달의 1일에서 15일까지 포함한다는 의미입니다.
+ **\$1**(별표) 특수 문자로 필드에 모든 값을 포함할 수 있습니다. Hours 필드에서 **\$1**는 모든 시간을 포함한다는 의미입니다. 동일한 표현식의 Day-of-month 필드와 Day-of-week 필드 모두에 **\$1**를 사용할 수 없습니다. 필드 중 하나에 사용할 경우 다른 하나에는 반드시 **?**를 사용해야 합니다.
+ **/**(슬래시)로 증분을 지정할 수 있습니다. Minutes 필드에 1/10을 입력하면 지정한 시간의 1분부터 시작해서 매 10분 간격을 지정할 수 있습니다(예: 11분, 21분, 31분 등).
+ **?**(물음표)로 하나 또는 다른 하나를 지정할 수 있습니다. Day-of-month 필드에 **7**을 입력하면서 7일이 무슨 요일이든 상관없는 경우 Day-of-week 필드에 **?**를 입력할 수 있습니다.
+ '날짜' 또는 '요일' 필드에서 **L** 와일드카드로 해당 월 또는 주의 마지막 날을 지정할 수 있습니다.
+ '날짜' 필드에서는 **W** 와일드카드로 어떤 한 평일을 지정할 수 있습니다. 예를 들어 '날짜' 필드에 **3W**를 입력하면 해당 월의 세 번째 평일에 가장 가까운 날을 지정할 수 있습니다.
+ '요일' 필드의 **\$1** 와일드카드는 그 달에 속한 정해진 요일의 특정 인스턴스를 지정합니다. 예를 들어 3\$12는 그 달의 두 번째 화요일입니다. 3은 각 주의 셋째 날이므로 화요일을 나타내며 2는 그 달에 속한 해당 유형의 두 번째 날을 나타냅니다.

**제한 사항**
+ 같은 cron 표현식에서 '날짜' 및 '요일' 필드를 지정할 수 없습니다. 필드 중 하나에 값 또는 `*`(별표)를 지정하는 경우 다른 필드에는 **?**(물음표)를 사용해야 합니다.
+ 1분보다 빠른 속도로 이어지는 cron 표현식은 지원되지 않습니다.
+ 실행되기 전에 1년 넘게 기다리도록 canary를 설정할 수 없으므로 `Year` 필드에 `*`만 지정할 수 있습니다.

**예제**  
canary를 생성할 때 다음 샘플 cron 문자열을 참조할 수 있습니다. 다음 예는 AWS CLI 또는 AWS SDK를 사용하여 canary를 생성하거나 업데이트하기 위한 올바른 구문입니다. CloudWatch 콘솔을 사용하는 경우 각 예에서 마지막 `*`를 생략합니다.


| 표현식 | 의미 | 
| --- | --- | 
|   `0 10 * * ? *`   |  매일 오전 10시(UTC)에 실행  | 
|   `15 12 * * ? *`   |  매일 오후 12시 15분(UTC)에 실행  | 
|   `0 18 ? * MON-FRI *`   |  매주 월요일부터 금요일까지 오후 6시(UTC)에 실행  | 
|   `0 8 1 * ? *`   |  매월 1일 오전 8시(UTC)에 실행  | 
|   `0/10 * ? * MON-SAT *`   |  매주 월요일부터 토요일까지 10분마다 실행  | 
|   `0/5 8-17 ? * MON-FRI *`   |  월요일부터 금요일까지 오전 8시부터 오후 5시 55분(UTC) 사이에 5분마다 실행   | 

# 자동으로 재시도하도록 카나리 구성
<a name="CloudWatch_Synthetics_Canaries_autoretry"></a>

카나리를 생성 또는 업데이트할 때 예약된 카나리가 실패하면 추가적으로 자동 실행을 시도하도록 카나리를 구성할 수 있습니다. 이렇게 하면 실제 장애와 일시적인 결함을 구분하여 보다 신뢰할 수 있는 결과를 얻을 수 있습니다. 이 기능은 허위 경보와 수동 개입을 줄이면서 복원력이 뛰어난 모니터링 시스템을 구축하는 데 적합합니다.

**카나리 자동 재시도 생성**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **Application Signals**, **Synthetics canary**를 선택합니다.

1. **Create Canary(canary 생성)**를 선택합니다.

1. **추가 구성**의 **자동 재시도**에서 원하는 최대 재시도 횟수를 선택합니다.

**카나리의 최대 재시도 횟수 업데이트**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **Application Signals**, **Synthetics canary**를 선택합니다.

1. 다음 중 하나를 수행할 수 있습니다.
   + 카나리를 선택하고 **작업**, **자동 재시도 활성화**를 선택한 다음 최대 재시도를 조정합니다.
   + 카나리를 선택하고 **작업**, **편집**을 선택합니다. **세부 정보 편집** 페이지의 **추가 구성**에 있는 **자동 재시도**에서 재시도 구성을 조정합니다.

 **제한 사항 ** 

다음은 자동 재시도 구성 관련 제한 사항입니다.
+ 런타임 버전 `syn-nodejs-puppeteer-10.0 ` 이상, ` syn-nodejs-playwright-2.0` 이상, `syn-python-selenium-5.1` 이상, `syn-nodejs-3.0` 이상에서만 지원됩니다.
+ 10분 후 시간 초과되는 장기 실행 카나리는 재시도가 1회로 제한됩니다. 다른 모든 카나리는 최대 2회의 재시도가 지원됩니다.

# CloudWatch Synthetics 카나리에서 종속 항목 사용
<a name="CloudWatch_Synthetics_Canaries_dependencies"></a>

이 섹션에서는 CloudWatch Synthetics 카나리에서 `Dependencies`를 사용하는 방법을 설명합니다. `Dependencies` 필드를 사용하면 카나리 스크립트에서 사용할 수 있는 추가 라이브러리 또는 사용자 지정 코드를 포함할 수 있도록 카나리에 대한 종속 항목을 지정할 수 있습니다.

## 개요
<a name="overview"></a>

CloudWatch Synthetics 카나리는 Lambda 계층을 종속 항목으로 지정하도록 지원합니다. 이 기능을 사용하면 다음을 수행할 수 있습니다.
+ 여러 카나리에서 공통 코드 공유
+ 카나리 스크립트 코드와 별도로 종속 항목 관리
+ 종속 항목을 Lambda 계층으로 이동하여 카나리 스크립트의 크기 축소

## 지원되는 API
<a name="supported-apis"></a>

`Dependencies` 필드는 다음 API에서 지원됩니다.
+  [CreateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) 
+  [UpdateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html) 
+  [ StartCanaryDryRun](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_StartCanaryDryRun.html) 

## 구문
<a name="syntax"></a>

`Dependencies` 필드는 요청 구문에서 코드 구조의 일부입니다.

```
"Code": { 
  "Handler": "string",
  "S3Bucket": "string",
  "S3Key": "string",
  "S3Version": "string",
  "ZipFile": blob,
  "Dependencies": [
    {
      "Type": "LambdaLayer",
      "Reference": "string"
    }
  ]
}
```

## 종속 항목 추가
<a name="usage"></a>

다음은 다양한 시나리오에서 `Dependencies` 필드를 사용하기 위한 몇 가지 예제와 지침입니다.

### 종속 항목이 있는 카나리 생성
<a name="creating-canary"></a>

카나리를 생성할 때 Lambda 계층을 종속 항목으로 지정할 수 있습니다.

```
{
  "Name": "my-canary",
  "Code": {
    "Handler": "pageLoadBlueprint.handler",
    "S3Bucket": "my-bucket",
    "S3Key": "my-canary-script.zip",
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-custom-layer:1"
      }
    ]
  },
  "ArtifactS3Location": "s3://my-bucket/artifacts/",
  "ExecutionRoleArn": "arn:aws:iam::123456789012:role/my-canary-role",
  "Schedule": {
    "Expression": "rate(5 minutes)"
  },
  "RuntimeVersion": "syn-nodejs-puppeteer-3.9"
}
```

### 카나리의 종속 항목 업데이트
<a name="updating-canary"></a>

UpdateCanary API를 사용하여 카나리의 종속 항목을 업데이트할 수 있습니다.

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-updated-layer:2"
      }
    ]
  }
}
```

### 종속 항목 제거
<a name="removing-dependencies"></a>

카나리에서 종속 항목을 제거하려면 종속 항목 필드에 빈 배열을 제공합니다.

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": []
  }
}
```

### StartCanaryDryRun을 사용하여 종속 항목 테스트
<a name="testing-dependencies"></a>

새 종속 항목으로 카나리를 업데이트하기 전에 StartCanaryDryRun API를 사용하여 카나리를 테스트할 수 있습니다.

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-test-layer:3"
      }
    ]
  }
}
```

## 제한 사항 및 고려 사항
<a name="limitations"></a>
+ 하나의 Lambda 계층만 종속 항목으로 지정할 수 있습니다.
+ 종속 항목이 있는 카나리를 생성하는 데 사용되는 역할은 [필요한 역할 및 권한](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Roles.html) 외에도 종속 항목 계층에 대한 ` lambda:GetLayerVersion` 액세스 권한을 보유해야 합니다.

## 호환되는 Lambda 계층 생성
<a name="creating-compatible-layers"></a>

계층을 생성하고 패키징하는 방법에 대한 자세한 내용은 [계층으로 Lambda 종속성 관리](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html)를 참조하세요. 카나리 패킹 구조를 기반으로 하는 카나리 검사의 패키징 구조를 이해하려면 [카나리 스크립트 작성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html)을 참조하세요.