실패한 canary 문제 해결 - Amazon CloudWatch

실패한 canary 문제 해결

canary가 실패하면 문제 해결을 위해 다음을 확인합니다.

일반 문제 해결

  • canary 세부 정보 페이지에서 자세한 정보를 확인할 수 있습니다. CloudWatch 콘솔의 탐색 창에서 [Canaries]를 선택한 다음, canary 이름을 선택하여 canary 세부 정보 페이지를 엽니다. [가용성(Availability)] 탭에서 [SuccessPercent] 지표를 확인하여 문제가 지속적인지 또는 간헐적인지 확인합니다.

    계속해서 [가용성(Availability)] 탭에서 실패한 데이터 요소를 선택하여 실패한 해당 실행에 대한 스크린샷, 로그, 단계 보고서(사용 가능한 경우)를 확인합니다.

    단계가 스크립트의 일부이므로 단계 보고서를 사용할 수 있는 경우 어떤 단계가 실패했는지 확인하고 관련 스크린샷을 살펴봄으로써 고객에게 표시되는 문제를 확인합니다.

    또한 HAR 파일을 확인하여 요청이 하나 이상 실패하는지 확인할 수도 있습니다. 로그를 사용하여 실패한 요청 및 오류를 드릴다운함으로써 더 심층적으로 분석할 수 있습니다. 마지막으로, 이러한 아티팩트를 성공적인 canary 실행의 아티팩트와 비교하여 문제를 정확하게 파악할 수 있습니다.

    기본적으로 CloudWatch Synthetics는 UI canary의 각 단계에 대해 스크린샷을 캡처합니다. 그러나 스크립트가 스크린샷을 사용 중지하도록 구성되었을 수 있습니다. 디버깅하는 동안 스크린샷을 다시 사용하도록 설정할 수 있습니다. 마찬가지로 API canary의 경우 디버깅하는 동안 HTTP 요청 및 응답의 헤더 및 본문을 확인할 수 있습니다. 보고서에 이 데이터를 포함하는 방법에 대한 자세한 내용은 executeHttpStep(stepName, requestOptions, [callback], [stepConfig]) 단원을 참조하세요.

  • 애플리케이션에 대한 최근 배포가 있는 경우 배포를 롤백한 다음, 나중에 디버깅합니다.

  • 엔드포인트에 수동으로 연결하여 동일한 문제를 재현할 수 있는지 확인합니다.

Lambda 환경 업데이트 후 canary 실패

CloudWatch Synthetics canary는 사용자 계정에서 Lambda 함수로 구현됩니다. 이러한 Lambda 함수는 보안 업데이트, 버그 수정 및 기타 개선 사항이 포함된 정규 Lambda 런타임 업데이트에 따라 달라집니다. Lambda는 기존 함수와 역호환되는 런타임 업데이트를 제공하기 위해 노력합니다. 하지만 소프트웨어 패치와 마찬가지로, 드물지만 런타임 업데이트가 기존 함수에 부정적인 영향을 미칠 수 있는 경우도 있습니다. canary가 Lambda 런타임 업데이트의 영향을 받았다고 생각되는 경우 (지원되는 리전에서) Lambda 런타임 관리 수동 모드를 사용하여 Lambda 런타임 버전을 일시적으로 롤백할 수 있습니다. 이렇게 하면 canary 함수가 계속 작동하고 중단을 최소화하여 최신 런타임 버전으로 돌아가기 전에 비호환성을 해결할 시간을 확보할 수 있습니다.

Lambda 런타임 업데이트 후 canary가 실패하는 경우 가장 좋은 해결책은 최신 Synthetics 런타임 중 하나로 업그레이드하는 것입니다. 최신 런타임에 대한 자세한 내용은 Synthetics 런타임 버전 섹션을 참조하세요.

Lambda 런타임 관리 제어가 제공되는 리전에서는 런타임 관리 제어를 위한 수동 모드를 사용하여 canary를 이전 Lambda 관리형 런타임으로 되돌릴 수도 있습니다. 다음 섹션의 아래 단계를 따라 AWS CLI 또는 Lambda 콘솔을 사용하여 수동 모드를 설정할 수 있습니다.

주의

런타임 설정을 수동 모드로 변경하면 Lambda 함수는 자동 모드로 되돌아갈 때까지 자동 보안 업데이트를 수신하지 않습니다. 이 기간 동안 Lambda 함수의 보안이 취약해질 수 있습니다.

사전 조건 

1단계: Lambda 함수 ARN 가져오기

다음 명령을 실행하여 응답에서 EngineArn 필드를 가져옵니다. 이 EngineArn은 canary와 관련된 Lambda 함수의 ARN입니다. 다음 단계에서 이 ARN을 사용합니다.

aws synthetics get-canary --name my-canary | jq '.Canary.EngineArn'

EngingArn의 출력 예시:

"arn:aws:lambda:us-west-2:123456789012:function:cwsyn-my-canary-dc5015c2-db17-4cb5-afb1-EXAMPLE991:8"

2단계: 마지막으로 사용된 정상 Lambda 런타임 버전 ARN 가져오기

canary가 Lambda 런타임 업데이트의 영향을 받았는지 여부를 이해하는 데 도움이 되도록 로그에 나와 있는 Lambda 런타임 버전 ARN의 변경 날짜 및 시간이 canary에 영향을 미친 것으로 확인된 날짜 및 시간인지 확인합니다. 일치하지 않는 경우 문제의 원인이 Lambda 런타임 업데이트가 아닐 수 있습니다.

canary가 Lambda 런타임 업데이트의 영향을 받은 경우 이전에 사용하고 있던 작동 중인 Lambda 런타임 버전의 ARN을 찾아야 합니다. Identifying runtime version changes의 지침을 따라 이전 런타임의 ARN을 찾습니다. 런타임 버전 ARN을 기록하고, 3단계로 진행하여 런타임 관리 구성을 설정합니다.

canary가 아직 Lambda 환경 업데이트의 영향을 받지 않은 경우 현재 사용 중인 Lambda 런타임 버전의 ARN을 찾을 수 있습니다. 다음 명령을 실행하여 응답에서 Lambda 함수의 RuntimeVersionArn을 가져옵니다.

aws lambda get-function-configuration \ --function-name "arn:aws:lambda:us-west-2:123456789012:function:cwsyn-my-canary-dc5015c2-db17-4cb5-afb1-EXAMPLE991:8" | jq '.RuntimeVersionConfig.RuntimeVersionArn'

RuntimeVersionArn의 출력 예시:

"arn:aws:lambda:us-west-2::runtime:EXAMPLE647b82f490a45d7ddd96b557b916a30128d9dcab5f4972911ec0f"

3단계: Lambda 런타임 관리 구성 업데이트

AWS CLI 또는 Lambda 콘솔을 사용하여 런타임 관리 구성을 업데이트할 수 있습니다.

AWS CLI를 사용하여 Lambda 런타임 관리 구성 수동 모드 설정

다음 명령을 입력하여 Lambda 함수의 런타임 관리를 수동 모드로 변경합니다. 1단계에서 찾은 값을 사용하여 function-namequalifier를 각각 Lambda 함수 ARN 및 Lambda 함수 버전 번호로 바꿔야 합니다. 또한 runtime-version-arn을 2단계에서 찾은 버전 ARN으로 바꿉니다.

aws lambda put-runtime-management-config \ --function-name "arn:aws:lambda:us-west-2:123456789012:function:cwsyn-my-canary-dc5015c2-db17-4cb5-afb1-EXAMPLE991" \ --qualifier 8 \ --update-runtime-on "Manual" \ --runtime-version-arn "arn:aws:lambda:us-west-2::runtime:a993d90ea43647b82f490a45d7ddd96b557b916a30128d9dcab5f4972911ec0f"
Lambda 콘솔을 사용하여 canary를 수동 모드로 변경
  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 버전 탭을 선택하고 ARN에 해당하는 버전 번호 링크를 선택한 다음 코드 탭을 선택합니다.

  3. 런타임 설정으로 스크롤하고, 런타임 관리 구성을 확장한 다음 런타임 버전 ARN을 복사합니다.

    화면의 런타임 설정 섹션을 표시하고 이 섹션에서 런타임 버전 ARN이 나타나는 위치를 보여줍니다.
  4. 런타임 관리 구성 편집을 선택하고 수동을 선택한 다음 이전에 복사한 런타임 버전 ARN을 런타임 버전 ARN 필드에 붙여넣습니다. 그런 다음 저장을 선택합니다.

    런타임 관리 구성 화면을 표시하고 이전에 복사한 런타임 버전 ARN을 붙여 넣을 위치를 표시합니다.

canary가 AWS WAF에 의해 차단됨

AWS WAF에서 canary를 차단하지 않도록 CloudWatchSynthetics 문자열을 허용하는 AWS WAF 문자열 일치 조건을 설정합니다. 자세한 내용은 AWS WAF 설명서의 Working with string match conditions를 참조하세요.

요소가 표시될 때까지 대기

로그 및 스크린샷을 분석한 후 스크립트의 요소가 화면에 표시되기를 기다리고 있는데 시간이 초과되는 경우 관련 스크린샷을 확인하여 요소가 페이지에 표시되는지 확인합니다. xpath가 올바른지 확인합니다.

Puppeteer 관련 문제는 Puppeteer의 GitHub 페이지 또는 인터넷 게시판을 확인하세요.

노드가 표시되지 않거나 page.click()의 HTMLElement가 아님

노드가 표시되지 않거나 page.click()HTMLElement가 아닌 경우 먼저, 요소를 클릭하는 데 사용 중인 xpath를 확인합니다. 또한 요소가 화면 맨 아래에 있는 경우 뷰포트를 조정합니다. CloudWatch Synthetics는 기본적으로 1920 * 1080의 뷰포트를 사용합니다. 브라우저를 시작할 때 또는 Puppeteer 함수 page.setViewport를 사용하여 다른 뷰포트를 설정할 수 있습니다.

S3에 아티팩트를 업로드할 수 없음, 예외: S3 버킷 위치를 가져올 수 없음: 액세스가 거부됨

Amazon S3 오류로 인해 canary가 실패한 경우 CloudWatch Synthetics가 권한 문제로 인해 canary에 대해 생성된 스크린샷, 로그 또는 보고서를 업로드할 수 없습니다. 다음을 확인하세요.

  • canary의 IAM 역할에 s3:ListAllMyBuckets 권한, 올바른 Amazon S3 버킷에 대한 s3:GetBucketLocation 권한 및 canary가 아티팩트를 저장하는 버킷에 대한 s3:PutObject 권한을 확인합니다. canary가 시각적 모니터링을 수행하는 경우 역할은 버킷에 대한 s3:GetObject 권한도 필요합니다. VPC 엔드포인트가 있는 VPC에 canary를 배포하는 경우 Amazon VPC S3 게이트웨이 엔드포인트 정책에서도 이와 동일한 권한이 필요합니다.

  • canary가 표준 AWS 관리형 키(기본값) 대신 암호화를 위해 AWS KMS 고객 관리형 키를 사용하는 경우 canary의 IAM 역할은 해당 키를 사용하여 암호화하거나 복호화할 수 있는 권한이 없을 수 있습니다. 자세한 내용은 canary 아티팩트 암호화 단원을 참조하십시오.

  • 버킷 정책에서 canary가 사용하는 암호화 메커니즘을 허용하지 않을 수 있습니다. 예를 들어 버킷 정책에서 특정 암호화 메커니즘 또는 KMS 키 사용을 규정한 경우 canary에 대해 동일한 암호화 모드를 선택해야 합니다.

canary가 시각적 모니터링을 수행하는 경우, 자세한 내용은 시각적 모니터링 사용 시 아티팩트 위치 및 암호화 업데이트 섹션을 참조하세요.

오류: 프로토콜 오류(Runtime.callFunctionOn): 대상이 닫혔습니다.

이 오류는 페이지 또는 브라우저가 닫힌 후 일부 네트워크 요청이 있는 경우 나타납니다. 비동기 작업을 기다리는 것을 잊었을 수 있습니다. 스크립트를 실행한 후 CloudWatch Synthetics는 브라우저를 닫습니다. 브라우저가 닫힌 후 비동기 작업을 실행하면 target closed error가 발생할 수 있습니다.

canary 실패. 오류: 데이터 요소 없음 - canary가 시간 초과 오류를 표시함

이는 canary 실행이 제한 시간을 초과했음을 의미합니다. CloudWatch Synthetics가 SuccessPercent CloudWatch 지표를 게시하거나 HAR 파일, 로그, 스크린샷과 같은 아티팩트를 업데이트하기 전에 canary 실행이 중지되었습니다. 제한 시간이 너무 낮으면 시간을 늘릴 수 있습니다.

기본적으로 canary 제한 시간 값은 해당 빈도와 같습니다. canary 빈도보다 작거나 같도록 제한 시간 값을 수동으로 조정할 수 있습니다. canary 빈도가 낮으면 빈도를 증가하여 제한 시간을 늘려야 합니다. CloudWatch Synthetics 콘솔을 사용하여 canary를 생성하거나 업데이트할 때 Schedule(일정)에서 빈도와 초과 시간 값을 모두 조정할 수 있습니다.

Lambda 콜드 스타트와 canary 계측 부팅에 걸리는 시간이 허용되려면 canary 시간 초과 값이 15초 이상이어야 합니다.

이 오류가 발생하면 CloudWatch Synthetics 콘솔에서 canary 아티팩트를 볼 수 없습니다. CloudWatch Logs를 사용하여 canary의 로그를 확인할 수 있습니다.

CloudWatch Logs를 사용하여 canary의 로그를 확인하려면
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 [로그 그룹(Log groups)]을 선택합니다.

  3. 필터 상자에 canary 이름을 입력하여 로그 그룹을 찾습니다. canary의 로그 그룹 이름은 /aws/lambda/cwsyn-canaryName-randomId입니다.

내부 엔드포인트에 액세스하려고 시도

canary가 내부 네트워크의 엔드포인트에 액세스하도록 하려면 VPC를 사용하도록 CloudWatch Synthetics를 설정하는 것이 좋습니다. 자세한 내용은 VPC에서 canary 실행 단원을 참조하십시오.

canary 런타임 버전 업그레이드 및 다운그레이드 문제

최근에 런타임 버전 syn-1.0에서 이후 버전으로 canary를 업그레이드한 경우 교차 원본 요청 공유(CORS) 문제일 수 있습니다. 자세한 내용은 교차 원본 요청 공유(CORS) 문제 단원을 참조하세요.

최근에 canary를 이전 런타임 버전으로 다운그레이드한 경우 사용 중인 CloudWatch Synthetics 함수를 다운그레이드한 이전 런타임 버전에서 사용할 수 있는지 확인합니다. 예를 들어 executeHttpStep 함수는 런타임 버전 syn-nodejs-2.2 이상에서 사용할 수 있습니다. 함수의 가용성을 확인하려면 canary 스크립트 작성 단원을 참조하세요.

참고

canary의 런타임 버전을 업그레이드하거나 다운그레이드할 계획이 있다면 먼저, canary를 복제하고 복제된 canary에서 런타임 버전을 업데이트하는 것이 좋습니다. 새 런타임 버전의 복제가 작동하는지 확인한 후에는 원래 canary의 런타임 버전을 업데이트하고 복제를 삭제할 수 있습니다.

교차 원본 요청 공유(CORS) 문제

UI canary에서 일부 네트워크 요청이 403 또는 net::ERR_FAILED로 실패하는 경우 canary에 활성 추적이 사용 설정되어 있는지 그리고 Puppeteer 함수 page.setExtraHTTPHeaders를 사용하여 헤더를 추가했는지 확인합니다. 그렇다면 실패한 네트워크 요청은 교차 원본 요청 공유(CORS) 제한으로 인해 발생했을 수 있습니다. 활성 추적을 사용 중지하거나 추가 HTTP 헤더를 제거하여 이에 해당하는 경우인지 여부를 확인할 수 있습니다.

이런 일이 발생하는 이유는 무엇인가요?

활성 추적을 사용하면 호출을 추적하기 위해 모든 발신 요청에 추가 헤더가 추가됩니다. 추적 헤더를 추가하거나 Puppeteer의 page.setExtraHTTPHeaders를 사용하여 추가 헤더를 추가하여 요청 헤더를 수정하면 XMLHttpRequest(XHR) 요청에 대한 CORS 검사가 발생합니다.

활성 추적을 사용 중지하거나 추가 헤더를 제거하지 않으려는 경우 교차 원본 액세스를 허용하도록 웹 애플리케이션을 업데이트하거나 스크립트에서 Chrome 브라우저를 시작할 때 disable-web-security 플래그를 사용하여 웹 보안을 사용 중지할 수 있습니다.

CloudWatch Synthetics launch 함수를 사용하여 CloudWatch Synthetics에서 사용하는 시작 파라미터를 재정의하고 추가 disable-web-security 플래그 파라미터를 전달할 수 있습니다. 자세한 내용은 Node.js canary 스크립트에 사용할 수 있는 라이브러리 함수 단원을 참조하세요.

참고

런타임 버전 syn-nodejs-2.1 이상을 사용할 경우 CloudWatch Synthetics에서 사용하는 시작 파라미터를 재정의할 수 있습니다.

canary 경쟁 조건 문제

CloudWatch Synthetics를 사용할 때 최상의 경험을 위해 canary용으로 작성된 코드가 멱등성이어야 합니다. 그렇지 않으면 드물기는 하지만 canary가 여러 실행에서 동일한 리소스와 상호 작용할 때 canary 실행 시 경쟁 조건이 발생할 수 있습니다.