비공개 IP 주소를 통해 Compute Engine의 MySQL에 대한 클라이언트 액세스 설정


이 튜토리얼에서는 Compute Engine을 사용하여 데이터베이스에 원격으로 안전하게 액세스할 수 있도록 Google Cloud의 비공개 네트워크에서 MySQL 데이터베이스를 실행하는 과정을 설명합니다.

Compute Engine에 자체 MySQL 데이터베이스를 설치하면서 Compute Engine에서 실행 중인 권한이 있는 MySQL 클라이언트로만 액세스를 제한하려면 이 튜토리얼을 사용하세요. 리전 간 인스턴스, 매개변수의 효율적인 사용, 특정 성능 요건 때문에 관리형 서비스를 사용하지 않고 직접 MySQL 인스턴스를 관리하는 것이 좋습니다.

이 튜토리얼에서는 MySQL 서버 앱을 구성하여 동일한 비공개 네트워크의 Compute Engine 인스턴스에 설치된 MySQL 클라이언트의 원격 트래픽을 허용하는 방법을 설명합니다.

적합한 MySQL 배포 옵션을 선택하는 방법은 Compute Engine에 MySQL 설치 방법을 참조하세요.

이 튜토리얼에서는 독자가 다음에 익숙하다고 가정합니다.

  • 기본 Linux 명령어
  • Ubuntu-서버 18.04
  • MySQL 5.7
  • Compute Engine

아키텍처

이 튜토리얼에서는 2개의 Compute Engine 인스턴스를 배포합니다. 다음 다이어그램과 같이 하나는 서버이고 다른 하나는 클라이언트입니다.

2개 배포 인스턴스의 아키텍처

목표

  • Compute Engine 인스턴스를 만들고 MySQL 서버를 설치합니다.
  • Compute Engine 인스턴스를 만들고 MySQL 클라이언트를 설치합니다.
  • 원격 액세스를 위해 MySQL 서버를 구성합니다.
  • MySQL 서버에 대한 공개 액세스를 삭제합니다.
  • MySQL에 원격으로 연결합니다.
  • VPC 서비스 제어 방화벽 규칙을 만듭니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine
  • Cloud Storage

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. Enable the Compute Engine API.

    Enable the API

이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

Creating Compute Engine 인스턴스

MySQL에 대한 두 개의 인스턴스, 즉 클라이언트 인스턴스와 서버 인스턴스를 만듭니다.

Compute Engine 클라이언트 인스턴스 만들기

  • Create a Compute Engine instance. Configure the instance as follows:
    • Name the instance my-client.
    • --zone 플래그를 인스턴스를 만들 영역으로 설정합니다.
    • --image-project 플래그를 ubuntu-os-cloud로 설정합니다.
    • --image-family 플래그를 ubuntu-1804-lts로 설정합니다.
    • --scopes 플래그를 https://www.googleapis.com/auth/cloud-platform로 설정합니다.
    • gcloud compute instances create my-client --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform

      Compute Engine 서버 인스턴스 만들기

    • Create a Compute Engine instance. Configure the instance as follows:
      • Name the instance my-server.
      • --zone 플래그를 인스턴스를 만들 영역으로 설정합니다.
      • --image-project 플래그를 ubuntu-os-cloud로 설정합니다.
      • --image-family 플래그를 ubuntu-1804-lts로 설정합니다.
      • --scopes 플래그를 https://www.googleapis.com/auth/cloud-platform로 설정합니다.
      • gcloud compute instances create my-server --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform

        MySQL 클라이언트 설치

        다음 단계에서는 Compute Engine 인스턴스에 MySQL을 설치하는 방법을 설명합니다.

        1. my-client 인스턴스에 연결하려면 ssh 명령어를 사용합니다.
        2. apt-get 패키지 관리자를 업데이트합니다.
          sudo apt-get update
          
        3. MySQL 클라이언트 패키지를 설치합니다.
          sudo apt-get -y install mysql-client-5.7

        MySQL 서버 설치

        다음 단계에서는 Compute Engine 인스턴스에 MySQL을 설치하는 방법을 설명합니다.

        1. my-server 인스턴스에 연결하려면 ssh 명령어를 사용합니다.
        2. apt-get 패키지 관리자를 업데이트합니다.
          sudo apt-get update
          
        3. MySQL 서버 패키지를 설치합니다.
          sudo apt-get -y install mysql-server-5.7

        MySQL 설치 보안 강화

        MySQL의 루트 비밀번호를 설정하고 MySQL 서버 구성에서 기본 보안 유지보수를 수행해야 합니다. 자세한 내용은 mysql_secure_installation 관련 MySQL 문서를 참조하세요.

        1. my-server 인스턴스에 대한 SSH 세션에서 다음 명령어를 사용하여 MySQL 설치 보안을 강화합니다.

          sudo mysql_secure_installation
          
        2. enter를 눌러 VALIDATE PASSWORD 플러그인 설정을 건너뜁니다.

        3. 새 루트 비밀번호를 두 번 입력합니다.

        4. 익명 사용자를 삭제하려면 Y를 입력하고 enter를 누릅니다.

        5. 원격 루트 로그인을 방지하려면 Y를 입력하고 enter를 누릅니다.

        6. 테스트 데이터베이스를 삭제하려면 Y를 입력하고 enter를 누릅니다.

        7. 권한 테이블을 다시 로드하려면 Y를 입력하고 enter를 누릅니다.

        MySQL 서버 구성

        MySQL 서버에 원격으로 연결하기 전에 내부 IP 주소를 리슨하도록 구성해야 합니다. 그런 다음 MySQL 클라이언트에 대한 루트가 아닌 사용자 계정을 만들어 서버에 연결합니다.

        모든 MySQL 클라이언트 명령어에는 인증 등을 위한 특정 명령줄 플래그가 포함되어야 합니다. 이 섹션의 MySQL 명령어에는 사용자 이름에 대한 --user, 비밀번호에 대한 -p, 해당 문을 실행하고 즉시 종료하기 위한 -e 등의 플래그가 있습니다. 자세한 내용은 MySQL 5.7 명령어 옵션 참조를 확인하세요.

        1. Cloud Shell에서 SSH를 사용하여 my-server 인스턴스에 연결합니다.

        2. 다음 정보를 사용하여 /etc/mysql/mysql.conf.d/mysqld.cnf 구성 파일을 업데이트합니다.

          LOCAL_IP=$(curl  http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \
              -H "Metadata-Flavor: Google")
          sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" /etc/mysql/mysql.conf.d/mysqld.cnf
          
        3. MySQL 서비스를 다시 시작하여 변경사항을 실행 중인 서버에 적용합니다.

          sudo service mysql restart
          
        4. 서버가 로컬로 실행 중인지 확인합니다. [ROOT_PASSWORD]를 이전 단계에서 설정한 MySQL 서버 루트 비밀번호로 바꿉니다.

          sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
          

          출력은 다음과 비슷하게 표시됩니다.

          +--------------------+
          | Database           |
          +--------------------+
          | information_schema |
          | mysql              |
          | performance_schema |
          | sys                |
          +--------------------+
          

        MySQL 사용자 만들기

        이전 mysql_secure_installation 명령어로는 루트 사용자로 원격 연결할 수 없습니다. 원격 연결을 허용하려면 필요한 권한이 있는 신규 사용자를 만들어야 합니다.

        1. Cloud Shell에서 my-client 내부 IP 주소의 환경 변수를 만듭니다.

          CLIENT_IP=$(gcloud compute instances describe my-client \
              --zone=ZONE \
              --format='value(networkInterfaces[0].networkIP)')
          
        2. 비밀번호를 사용하여 새 MySQL 사용자를 만듭니다. [MY_PASSWORD]를 자신의 비밀번호로, [ROOT_PASSWORD]를 MySQL 루트 사용자 비밀번호로 바꿉니다.

          sudo mysql -uroot -p[ROOT_PASSWORD] \
              -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
          
        3. my-client의 내부 IP 주소에서 서버에 로그인하도록 새 MySQL 사용자 권한을 부여합니다.

          sudo mysql -uroot -p[ROOT_PASSWORD] -e \
              "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \
              IDENTIFIED BY '[MY_PASSWORD]';"
          

        my-server의 외부 IP 주소 삭제

        클라이언트에서 내부 IP 주소를 통해 my-server에 액세스할 수 있으므로 my-server 인스턴스에는 외부 IP 주소가 필요하지 않습니다.

        • 외부 IP 주소를 삭제하려면 Cloud Shell에서 구성 설정을 업데이트합니다. [ZONE]을 Google Cloud 영역으로 바꿉니다.

          gcloud compute instances delete-access-config my-server \
              --access-config-name "external-nat" \
              --zone="ZONE"
          

        클라이언트에서 서버 인스턴스로의 원격 액세스 확인

        다음 단계는 my-client 인스턴스에서 my-server의 MySQL 서버에 연결하는 방법을 설명합니다.

        1. Cloud Shell에서 SSH를 사용하여 my-client 인스턴스에 연결합니다.
        2. 데이터베이스를 나열하여 연결을 테스트합니다.

          sudo mysql --host=my-server --user=TESTUSER \
              --password=[MY_PASSWORD] -e "SHOW DATABASES;"
          

          출력은 다음과 비슷하게 표시됩니다.

          +--------------------+
          | Database           |
          +--------------------+
          | information_schema |
          | mysql              |
          | performance_schema |
          | sys                |
          +--------------------+
          

        이 단계에서는 MySQL 클라이언트가 내부 IP 주소를 통해 MySQL 서버에 성공적으로 연결할 수 있는지 확인합니다.

        프로덕션 환경에서의 방화벽 고려사항

        Google Cloud의 기본 네트워크 구성에는 MySQL 포트 3306을 포함한 광범위한 포트에서 Compute Engine 인스턴스 간의 내부 트래픽을 허용하는 방화벽 규칙인 default-allow-internal이 포함됩니다. 보안 풋프린트가 설정된 기본이 아닌 환경에서는 my-client 인스턴스가 네트워크를 통해 my-server 인스턴스와 통신하도록 허용하는 방화벽 규칙을 만들어야 할 수 있습니다. 그렇지 않으면 두 인스턴스가 서로 통신할 수 없습니다.

        IP 주소 범위나 태그를 기반으로 방화벽 규칙을 만들 수 있습니다. IP 주소 범위는 광범위한 내부 IP 주소에 액세스 권한을 부여하려는 경우에 유용합니다. 반면, 네트워크의 특정 인스턴스에 액세스 권한을 부여하려는 경우 태그를 사용하는 방법이 더 편리합니다. 태그를 사용하면 광범위한 IP 주소에 액세스 권한을 부여하지 않고 손쉽게 새 클라이언트를 추가할 수 있습니다. 새 MySQL 클라이언트 인스턴스에 적절한 태그만 할당하면 됩니다. 예를 들어 mysql-client 태그가 있는 모든 클라이언트 인스턴스의 트래픽을 허용하는 새 방화벽 규칙을 만들 수 있습니다.

        태그를 사용하여 방화벽 규칙을 지원하려면 Cloud Shell에서 my-clientmy-server VM에 적절한 태그를 할당하면 됩니다.

        gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE
        
        gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONE
        

        새 방화벽 규칙 추가

        다음 단계에서는 3306 포트를 사용하여 my-client 태그가 있는 인스턴스가 my-server 태그가 있는 인스턴스와 통신할 수 있도록 하는 새 방화벽 규칙을 만드는 방법을 설명합니다.

        • Cloud Shell에서 mysql-clientmysql-server 간의 통신을 허용하도록 방화벽 규칙을 만듭니다.

          gcloud compute firewall-rules create "mysql-remote-access" \
              --allow tcp:3306 --source-tags "mysql-client" \
              --target-tags "mysql-server"
          

        이제 my-client에서 MySQL에 연결할 수 있습니다.

        외부 클라이언트의 액세스 고려사항

        이 튜토리얼에서는 Compute Engine에서 실행되는 MySQL 클라이언트에서 MySQL 서버로 액세스하는 방법을 설명합니다. Compute Engine에서 실행되지 않는 클라이언트에서의 액세스를 허용하는 것은 이 튜토리얼의 범위를 벗어납니다. 비 Compute Engine 액세스를 허용해야 하는 경우 다음을 수정하세요.

        • 외부 연결을 허용하려면 my-server에 외부 IP 주소를 추가합니다.
        • 외부 클라이언트의 소스 IP 주소를 방화벽 규칙에 추가합니다.
        • 외부 클라이언트의 소스 IP 주소에 결합되는 TESTUSER 계정을 수정하거나 사용자 계정을 만듭니다.
  • 삭제

    이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않게 하려면 프로젝트를 삭제하거나 인스턴스를 삭제하면 됩니다.

    프로젝트 삭제

    비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

    프로젝트를 삭제하려면 다음 안내를 따르세요.

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    인스턴스 삭제

    Compute Engine 인스턴스를 삭제하려면 다음 안내를 따르세요.

    1. In the Google Cloud console, go to the VM instances page.

      Go to VM instances

    2. Select the checkbox for your my-server instance.
    3. To delete the instance, click More actions, click Delete, and then follow the instructions.

    다음 단계