Kihagyás

Remote debugging engedélyezése backend-service-ben

Az alkalmazás egy távoli szerveren futó példányának hibakereséséhez ad segítséget a remote debugging, ami lehetővé teszi, hogy egy debuggert csatoljunk a szerveren futó alkalmazáshoz. Ahhoz, hogy a remote debuggingot engedélyezzük, módosítanunk kell a /opt/project/infrastructure/docker-compose-services.yml és /opt/project/infrastructure/.env fájlokat.

  1. Vegyük fel a /opt/project/infrastructure/docker-compose-services.yml fájlban a debug portot a ports szekciónál.

    services:
      backend-service:
        ...
        ports:
          - 8080:8080
          - ${OUTER_TCP_PORT}:${INNER_DOCKER_HOST_PORT} <-- debug port mapping, példa 5555:5555
    
    Ez a beállítás létrehoz egy tűzfalszabályt ami egy külső TCP portot hozzárendel a Docker host portjához, ezzel elérhetővé téve külvilág felé. Ezen a porton keresztül tudjuk majd a debuggert a konténerhez csatlakoztatni.

  2. Egészítsük ki a *JAVA_TOOLS_OPTIONS változókat /opt/project/infrastructure/.env fájlban a debugger számára szükséges JVM argumentumokkal.

    Szükséges debug argumentum:

    -Xdebug -Xrunjdwp:transport:dt_socket,server=y,suspend=n,address=*:${INNER_DOCKER_HOST_PORT}
    

    Példa eredmény 2 node esetén

    NODE_1_JAVA_TOOL_OPTIONS="-Xms1g -Xmx1g -javaagent:/infrastructure/elastic-apm-agent-1.38.0.jar -Delastic.apm.environment=DEV -Delastic.apm.service_name=semi-product -Delastic.apm.service_node_name=backend-service-1 -Delastic.apm.server_urls=http://apm.dev.gbsolutions.io:8200 -Delastic.apm.application_packages=io.gbsolutions.project -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5555"
    NODE_2_JAVA_TOOL_OPTIONS="-Xms1g -Xmx1g -javaagent:/infrastructure/elastic-apm-agent-1.38.0.jar -Delastic.apm.environment=DEV -Delastic.apm.service_name=semi-product -Delastic.apm.service_node_name=backend-service-2 -Delastic.apm.server_urls=http://apm.dev.gbsolutions.io:8200 -Delastic.apm.application_packages=io.gbsolutions.project -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5555"
    

    Ezzel a beállítással adhatunk utasítást a JVM-nek arra, hogy az alkalmazást olyan módon kell futtatnia, hogy csatlakoztathassunk egy debuggert hozzá.

    Ha az alkalmazás már fut a szerveren, a konfiguráció életbe lépéséhez szükség lesz arra is, hogy újraindítsuk a konténereket

    Leállítás:docker compose -f docker-compose-services.yml down

    Újraindítás:docker compose -f docker-compose-services.yml up -d

  3. Ezt követően AWS-en módosítanunk kell a szerverhez tartozó Inbound security group szabályait.

    Vegyük fel a következő szabályt:

    Type: HTTP
    Protocol: TCP
    Port range: ${OUTER_TCP_PORT} <-- példa: 5555
    Source type: Anywhere (ha bárki számára engedélyezett a választott porton való kommunikáció)
    Source: 0.0.0.0/0
    
    Ha ennél szigorúbb szabályt szeretnénk ami csak meghatározott IP címekről engedi a kommunikációt:
    Type: HTTP
    Protocol: TCP
    Port range: ${OUTER_TCP_PORT} <-- példa: 5555
    Source type: Custom
    Source: ${CIDR_NOTATION} <-- példa 203.0.113.1/32
    

    A ${CIDR_NOTATION} segítségével nem csak egy IP cím, hanem egy egész IP cím tartományt is megadhatunk. Ha például egy darab IP címet szeretnénk engedélyezni akkor az IP cím után írjuk ki a /32 suffixet. Ez egy olyan IP cím tartományt deifiniál amiben csak az általunk megadott IP cím létezik.

    Ha viszont több IP címről is szeretnénk biztosítani a hozzáférést, például a 178.164.166.0 - 178.164.166.255 tartományon belül, akkor használjuk a 178.164.166.0/24 címet.

    Segítség a helyes CIDR megadásához: CIDR kalkulátor

  4. Ezt követően már debuggolhatjuk az alkalmazást távolról. Hozzunk létre egy Remote JVM DEBUG Run configuration-t IntelliJ-ben az alábbiak szerint: Remote Debug Config IntelliJ A host és port opciók természetesen alkalmazásonként eltérőek lesznek. A host a távoli szerver IP címe amin az alkalmazás fut, a port pedig amit debug portként konfiguráltunk

  5. Indítsuk el a létrehozott Run configuration-t, ha mindent jól csináltunk a consolon az alábbi üzenet fog megjelenni: Connected to the target VM, address: '${host}:${port}', transport: 'socket'

  6. Mostmár felvehetünk breakpointokat a kódban. A szerveren futó alkalmazás használatakor látni fogjuk, hogy a program megáll a kijelölt breakpointoknál.