[AWS] CloudWatch Synthetics에서 VPC 내외부 서비스 모니터링 시도

8470 단어 syntheticscanaryAWS
CloudWatch Synthetics는 합성 모니터링을 제공하는 서비스입니다.애플리케이션 노드(REST API, URL, 웹 사이트 컨텐츠 등)의 작동을 모니터링할 수 있지만 구현 스크립트를 통해Synthetics의 이름과 같이 사용자 인터페이스 자원 불러오기, 사무 처리, 지연, 흐름 유도와 끊긴 링크를 포함한 복잡한 작업 부하를 계속 검증할 수 있습니다.
이번에 우리는 CloudWatch Synthetics를 사용하여 VPC의 안쪽과 바깥쪽에서 VPC 내에 구축된 사이트를 감시하려고 한다.
구성 시도:
  • 모니터링 대상은 Qiita와 유사한 OSSKnowledge에서 시도됩니다.
  • CloudWatch Synthetics에서 지식 라이브러리의 공공 IP, 전용 IP를 각각 지정하여 감시한다.
  • 그림의 Public IP(1)는 지식 라이브러리의 공공 IP를 나타내고, Public IP(2)는 NAT Gateway의 IP(지식 라이브러리에서 접근할 수 있는 IP)를 나타낸다.
  • 실제 모니터링 설정은 CloudWatch Synthetics에서 Canary(카나리아)로 불리는 대상을 만든 후 수행됩니다.
  • 1. VPC 준비

  • 구성도와 같이 공통 서브넷과 전용 서브넷이 있는 VPC를 만듭니다.
  • 자세한 제작 절차는 생략하였으나 시도만 하였다면 VPC 마법사의 "공공과 개인 서브넷을 갖춘 VPC"를 이용하시면 됩니다.
  • 점은 Canary의 실체가 Lambda Function이기 때문에 VPC 내의 동작은 Lambda와 같은 제한을 받는다.구체적으로 전용 서브넷에서 이동해야 하기 때문에 두 개의 서브넷을 구성했다.

  • 2.knowledge 구축


    이번에는 감시 대상(동작이 있는 사이트라면 뭐든지)으로 Qiita와 비슷한 OSS의 Knowledge를 시도할 기회가 생겨서 사용했습니다.
    이곳은 손댈 곳이 아니기 때문에 EC2Dockerhub 공용 이미지에서 그렇게 동작해 보았습니다.
    # docker run -d -p 8080:8080 koda/docker-knowledge:latest
    
    시작 후 테스트용 글을 등록합니다.

    3. CloudWatch Synthetics(Canary) 생성


    여기서부터 본론이야.콘솔에서 CloudWatch Synthetics에서 Canary 만들기를 선택합니다.

    생성 방법을 지정합니다.먼저 GUI 워크플로우 생성기를 시도합니다.

    화면 아래에서 실행을 선택하십시오.이제 nodejs와python을 선택할 수 있습니다. 이번에python을 선택하십시오.

    동일한 화면의 워크플로우 생성기에서 작업을 계속 설정합니다.다음 작업을 선택할 수 있습니다.

    예를 들어, 검색 상자에 검색 키워드를 입력한 예는 다음과 같습니다.리본에서 를 클릭합니다.

    같은 화면의 스크립트 편집기에서도 다음 코드가 자동으로 생성됩니다.
    # Execute customer steps
    def customer_actions_1():
        browser.find_element_by_xpath("//input[@id='navSearch'][contains(text(),'test')]")
    
    await syn_webdriver.execute_step('verifyText', customer_actions_1)
    
    마찬가지로 찾기 버튼을 누른 예에서 작업을 선택합니다. 클릭을 선택하고 선택기를 입력합니다.

    이 지식 라이브러리 예시에서 id 속성도name 속성도 없기 때문에class로 검색을 강행합니다.자동으로 생성된 코드는 다음과 같습니다.
    # Execute customer steps
    def customer_actions_1():
        browser.find_element_by_xpath("//button[@class='btn-search']").click()
    
    await syn_webdriver.execute_step('click', customer_actions_1)
    
    이번에 최종적으로 다음과 같은 코드를 만들었다.내용은 설명과 같이 TopPage 액세스 → 검색 상자에 "test"를 입력하여 검색 → 검색 결과에 "test"가 있는지 확인합니다.
    import asyncio
    from aws_synthetics.selenium import synthetics_webdriver as syn_webdriver
    from aws_synthetics.common import synthetics_logger as logger, synthetics_configuration
    
    TIMEOUT = 60
    
    async def main():
        private_url = "http://10.0.0.13:8080/open.knowledge/list"
        public_url = "http://xx.xx.xx.xx:8080/open.knowledge/list"
        browser = syn_webdriver.Chrome()
    
        url = private_url # ここのみCanaryごとに編集
    
        # synthetics設定(スクリーンショットの取得)
        synthetics_configuration.set_config({
           "screenshot_on_step_start" : True,
           "screenshot_on_step_success": True,
           "screenshot_on_step_failure": True
        });
    
        # TopPageにアクセス
        def navigate_to_toppage():
            browser.implicitly_wait(TIMEOUT)
            browser.get(url)
    
        await syn_webdriver.execute_step("navigateToTopPage", navigate_to_toppage)
    
        # 検索ボックスにキーワード入力して検索
        def input_search_word_and_search():
            browser.find_element_by_xpath("//input[@id='navSearch']").send_keys("test")
            browser.find_element_by_xpath("//button[@class='btn btn-default']").click()
    
        await syn_webdriver.execute_step('inputSearchWordAndSearch', input_search_word_and_search)
    
        # 記事があるか確認
        def check_search_result():
            browser.find_element_by_xpath("//div[@class='list-title'][contains(.,'test')]")
    
        await syn_webdriver.execute_step('checkSearchResult', check_search_result)
    
        logger.info("Canary successfully executed")
    
    async def handler(event, context):
        # user defined log statements using synthetics_logger
        logger.info("Selenium Python workflow canary")
        return await main()
    
    그 다음
  • S3 시간대: 처리 결과(스크린 스냅샷 등)를 저장하는 S3 시간대
  • 지정
  • IAM 역할: CloudWatchSyntheticsRole-canary-name-uid라는 새 역할을 만들거나 기존 역할을 지정
  • VPC: 사전 준비된 VPC, 전용 서브넷
  • 지정
  • 정기적 실행 여부
  • 설정하고 저장할 때 Canary를 실행합니다.또한 현재 GUI 워크플로우 생성기는 새로 만들 때만 사용할 수 있으며, 만들어진 후에는 스크립트 편집기에서 직접 스크립트를 편집할 수 있습니다.

    4. 테스트 및 결과 확인


    테스트 결과는 다음과 같은 화면 스냅샷으로 표시됩니다.

    전용 IP가 지정한 테스트 결과를 보십시오.실행 세부 정보에는 각 단계의 결과와 화면 스냅샷이 포함됩니다.

    S3에 저장된 화면 스냅샷을 확인한 경우 읽어들이기 처리되었는지 확인할 수 있습니다.(주소 표시줄이 없기 때문에 결과는 완전히 같다) 공공 IP가 지정한 실행 결과도 똑같이 확인할 수 있다.

    공공 액세스만 차단


    테스트에서 EC2 보안 그룹을 변경하고 공용 IP 액세스를 거부하면 다음과 같은 오류가 발생합니다.저장된 캡처는 흰색 그림입니다.

    전체적인 확인 결과를 보면 개인 IP 지정이 성공했음을 확인할 수 있다.둘 다 URL만 바꿔서 같은 스크립트를 실행하기 때문에 이런 상황에서 네트워크 경로에 문제가 있는지 추측할 수 있을 것 같습니다.

    이번 검증 결과는 다음과 같다.

    참고 자료

  • AWS 실행 감시 실천~ 시스템에 문제가 생겼을 때 어떻게 신속하게 처리하나요~
  • 외형 감시라는 단어의 오류
  • 컨테이너 만들기
  • VPC에서 Canary 실행
  • Knowledge
  • Dockerhub: koda/docker-knowledge
  • 좋은 웹페이지 즐겨찾기