GSP1116
개요
보안, 규정 준수, 성능 또는 개인 정보 보호를 위해 자체 블록체인 노드를 호스팅해야 할 수 있습니다. 복원력이 우수하며 지속 가능한 분산형 네트워크는 모든 블록체인 프로토콜의 중요한 기반입니다. 웹3 개발자는 웹3 개발을 위한 완전 관리형 노드 호스팅 솔루션인 Google Cloud의 블록체인 노드 엔진을 사용할 수 있습니다. 또한 조직은 Google Cloud에서 자체 노드를 구성하고 관리할 수도 있습니다. 웹3 인프라의 신뢰할 수 있는 파트너인 Google Cloud는 안전하고 안정적이며 확장 가능한 노드 호스팅 인프라를 제공합니다. Google Cloud에서 노드를 호스팅하는 방법을 자세히 알아보려면 블로그 게시물 블록체인 노드 엔진 소개: 웹3 개발을 위한 완전 관리형 노드 호스팅을 참조하세요.
자체 관리형 블록체인 노드를 클라우드에 배포할 때 고려해야 할 기술적 사항과 아키텍처 결정에 관해 자세히 알아보려면 블로그 게시물 웹3을 위한 Google Cloud를 확인하세요.
이 실습에서는 가상 머신(VM)을 만들어 Ethereum RPC 노드를 배포합니다. Ethereum RPC 노드는 네트워크에서 블록체인 업데이트를 수신하고 RPC API 요청을 처리할 수 있습니다. 부팅 디스크 20GB, 가상 CPU(vCPU) 4개, RAM 16GB가 포함된 e2-standard-4 머신 유형을 사용합니다. 블록체인 데이터를 위한 공간을 충분히 확보하기 위해 200GB의 SSD 디스크를 인스턴스에 연결합니다. Ubuntu 20.04를 사용하고, 두 가지 서비스 즉 '실행 계층'인 Geth와 '합의 계층'인 Lighthouse를 배포합니다. 이 두 서비스는 함께 작동하여 Ethereum RPC 노드를 구성합니다.
목표
이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.
- 영구 디스크가 있는 Compute Engine 인스턴스를 만듭니다.
- 고정 IP 주소 및 네트워크 방화벽 규칙을 구성합니다.
- 정기 백업을 예약합니다.
- Ethereum의 실행 계층인 Geth를 배포합니다.
- Ethereum의 합의 계층인 Lighthouse를 배포합니다.
- Ethereum RPC 호출을 수행합니다.
- Cloud Logging을 구성합니다.
- Cloud Monitoring을 구성합니다.
- 업타임 체크를 구성합니다.
설정 및 요건
실습 시작 버튼을 클릭하기 전에
다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지를 표시합니다.
실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.
이 실습을 완료하려면 다음을 준비해야 합니다.
- 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드(권장) 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학습자 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
- 실습을 완료하기에 충분한 시간(실습을 시작하고 나면 일시중지할 수 없음)
참고: 이 실습에는 학습자 계정만 사용하세요. 다른 Google Cloud 계정을 사용하는 경우 해당 계정에 비용이 청구될 수 있습니다.
실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법
-
실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 대화상자가 열립니다.
오른쪽에는 다음과 같은 항목이 포함된 실습 설정 및 액세스 패널이 있습니다.
-
Google Cloud 콘솔 열기 버튼
- 이 실습에 사용해야 하는 임시 사용자 인증 정보(사용자 이름 및 비밀번호)
- 필요한 경우 실습 진행을 위한 기타 정보
실습 타이머는 페이지 상단에 있으며 남은 시간을 표시합니다.
-
Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).
실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.
팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.
참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
-
필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.
{{{user_0.username | "Username"}}}
실습 설정 및 액세스 패널에서도 사용자 이름을 확인할 수 있습니다.
-
다음을 클릭합니다.
-
아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.
{{{user_0.password | "Password"}}}
실습 설정 및 액세스 패널에서도 비밀번호를 확인할 수 있습니다.
-
다음을 클릭합니다.
중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요.
참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
-
이후에 표시되는 페이지를 클릭하여 넘깁니다.
- 이용약관에 동의하세요.
- 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 마세요.
- 무료 체험판을 신청하지 마세요.
잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.
참고: Google Cloud 제품 및 서비스에 액세스하려면 탐색 메뉴를 클릭하거나 검색창에 제품 또는 서비스 이름을 입력합니다.
이 실습에서는 다음 도구를 사용합니다.
- Ubuntu 24.04
- Geth
- Lighthouse
- curl
- gcloud
작업 1. 가상 머신을 위한 인프라 만들기
공개 고정 IP 주소, 방화벽 규칙, 서비스 계정, 스냅샷 일정을 만들고 새 IP 주소로 가상 머신을 만듭니다. 이것이 Ethereum이 배포되는 인프라 환경입니다.
공개 고정 IP 주소 만들기
이 섹션에서는 가상 머신에 사용되는 공개 IP 주소를 설정합니다.
- Cloud 콘솔에서 탐색 메뉴(
) > VPC 네트워크 > IP 주소로 이동합니다.
-
IP 주소 카드에서 외부 예약을 클릭하여 고정 IP 주소를 만듭니다.
- 고정 주소 구성 시 다음을 사용합니다.
| 속성 |
값(입력 또는 선택) |
| 이름 |
eth-mainnet-rpc-ip |
| 네트워크 서비스 등급 |
프리미엄 |
| IP 버전 |
IPv4 |
| 유형 |
리전 |
| 리전 |
|
| 연결 대상 |
없음 |
-
예약을 클릭합니다.
방화벽 규칙 만들기
VM이 지정된 포트에서 통신할 수 있도록 방화벽 규칙을 만듭니다.
Geth는 P2P 통신에 TCP 및 UDP의 30303 포트를 사용합니다. Lighthouse는 P2P 통신에 TCP 및 UDP의 9000 포트를 사용합니다. Geth RPC는 TCP 8545 포트를 사용합니다.
- Cloud 콘솔에서 탐색 메뉴(
) > VPC 네트워크 > 방화벽으로 이동합니다.
- 방화벽 규칙을 만들려면 작업 모음에서 방화벽 규칙 만들기를 클릭합니다.
- 다음과 같이 방화벽을 구성합니다.
| 속성 |
값(입력 또는 선택) |
| 이름 |
eth-rpc-node-fw |
| 로그 |
사용 안함 |
| 네트워크 |
기본값 |
| 우선순위 |
1000 |
| 트래픽 방향 |
인그레스 |
| 일치 시 작업 |
허용 |
| 대상 |
지정된 대상 태그 |
| 대상 태그 |
eth-rpc-node(값을 입력한 후 Enter 키를 누름) |
| 소스 필터 |
IPv4 범위 |
| 소스 IPv4 범위 |
0.0.0.0/0(값을 입력한 후 Enter 키를 누름) |
| 지정된 프로토콜 및 포트 |
TCP: 30303, 9000, 8545 UDP: 30303, 9000 |
-
만들기를 클릭합니다.
서비스 계정 만들기
VM이 사용할 서비스 계정을 만듭니다.
- Cloud 콘솔에서 탐색 메뉴(
) > IAM 및 관리자 > 서비스 계정으로 이동합니다.
- 작업 모음에서 서비스 계정 만들기를 클릭하여 서비스 계정을 만듭니다.
- 다음과 같이 서비스 계정을 구성합니다.
| 속성 |
값(입력 또는 선택) |
| 서비스 계정 이름 |
eth-rpc-node-sa |
| 서비스 계정 ID |
eth-rpc-node-sa |
-
만들고 계속하기를 클릭합니다.
- 다음 역할을 추가합니다.
| 속성 |
값(입력 또는 선택) |
| 역할 |
Compute OS Login, Service Controller, Logs Writer, Monitoring Metric Writer, Cloud Trace Agent, Compute Network User
|
-
계속을 클릭합니다.
-
완료를 클릭합니다.
스냅샷 일정 만들기
이 섹션에서는 블록체인 데이터가 포함된 가상 머신의 연결된 디스크에 적용할 스냅샷 일정을 설정합니다. 이렇게 하면 체인 데이터를 백업할 수 있습니다.
- Cloud 콘솔에서 탐색 메뉴(
) > Compute Engine > 스냅샷으로 이동합니다.
-
스냅샷 일정 만들기를 클릭하여 스냅샷 일정을 만듭니다.
- 다음과 같이 스냅샷 일정을 구성합니다.
| 속성 |
값(입력 또는 선택) |
| 이름 |
eth-mainnet-rpc-node-disk-snapshot |
| 리전 |
|
| 리전 |
|
| 일정 옵션 |
주기: Daily, 시작 시간(UTC): 6:00 PM - 7:00 PM, 자동 삭제 전 스냅샷 보관 기간(일): 7
|
| 삭제 규칙 |
스냅샷 유지 |
-
만들기를 클릭합니다.
가상 머신 만들기
이 섹션에서는 Ethereum 배포에 사용되는 가상 머신을 설정합니다.
-
Cloud 콘솔에서 탐색 메뉴(
) > Compute Engine > VM 인스턴스로 이동합니다.
-
인스턴스 만들기를 클릭하여 VM을 만듭니다.
-
머신 구성에서
다음 필드에 값을 입력합니다.
| 속성 |
값(입력 또는 선택) |
| 이름 |
eth-mainnet-rpc-node |
| 리전 |
|
| 영역 |
|
| 시리즈 |
E2 |
| 머신 유형 |
e2-standard-4 |
-
OS 및 스토리지를 클릭합니다.
변경을 클릭하고 다음 값을 선택합니다.
| 속성 |
값(입력 또는 선택) |
| 운영체제 |
Ubuntu |
| 버전 |
Ubuntu 24.04 LTS(x86/64) |
| 부팅 디스크 유형 |
SSD 영구 디스크 |
| 크기 |
50GB |
선택을 클릭합니다.
추가 디스크에서 새 디스크 추가를 클릭합니다.
| 속성 |
값(입력 또는 선택) |
| 이름 |
eth-mainnet-rpc-node-disk |
| 디스크 소스 유형 |
빈 디스크 |
| 디스크 유형 |
SSD 영구 디스크 |
| 크기 |
200GB(대규모 설치의 경우 2,000GB) |
저장을 클릭합니다.
-
데이터 보호를 클릭합니다.
스냅샷 일정에서 eth-mainnet-rpc-node-disk-snapshot을 선택합니다.
-
네트워킹을 클릭합니다.
| 속성 |
값(입력 또는 선택) |
| 네트워크 태그 |
eth-rpc-node(값을 입력한 후 Enter 키를 누름 - 방화벽 설정과 일치) |
-
보안을 클릭합니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
가상 머신을 위한 인프라 만들기
작업 2. 가상 머신 설정 및 설치
이제 SSH를 통해 VM에 연결하고 명령어를 실행하여 소프트웨어를 설치합니다.
SSH를 통해 VM에 연결
- Cloud 콘솔에서 탐색 메뉴(
) > Compute Engine > VM 인스턴스로 이동합니다.
-
eth-mainnet-rpc-node와 같은 행에서 SSH를 클릭하여 SSH 창을 엽니다.
-
브라우저에서 SSH를 통해 VM에 연결하도록 허용하라는 메시지가 표시되면 승인을 클릭합니다.
VM에 스왑 파일 만들기
프로세스에 추가 RAM을 제공할 수 있도록 스왑 파일을 만듭니다. 스왑 파일은 필요에 따라 VM이 사용할 수 있는 RAM의 용량을 늘리는 데 사용됩니다.
- 다음 명령어를 실행하여 40GB 스왑 파일을 만듭니다.
sudo dd if=/dev/zero of=/swapfile bs=1MiB count=40KiB
첫 번째 명령어는 실행하는 데 시간이 조금 걸립니다.
- 스왑 파일의 권한을 업데이트합니다.
sudo chmod 0600 /swapfile
- 스왑 파티션으로 사용할 파일을 지정합니다.
sudo mkswap /swapfile
- 재부팅 시 마운트된 드라이브가 인식되도록 /etc/fstab에 스왑 파일 구성을 추가합니다.
echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab
- 스왑 파일을 사용 설정합니다.
sudo swapon -a
- 스왑이 인식되었는지 확인합니다.
free -g
다음과 유사한 줄이 포함된 메시지가 표시됩니다.
출력:
total used free shared buff/cache available
Mem: 15 0 0 0 15 15
Swap: 24 0 24
VM에 연결된 디스크 마운트
VM 설정 과정에서 연결된 디스크를 만들었습니다. 그러나 VM은 이를 자동으로 인식하지 않습니다. 그러므로 이 디스크를 사용하려면 먼저 포맷하고 '마운트'해야 합니다.
- 연결된 디스크를 확인합니다. 크기가 200GB인 sdb 항목이 표시됩니다.
sudo lsblk
- 연결된 디스크를 포맷합니다.
sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
- 폴더를 만들고 연결된 디스크를 마운트합니다.
sudo mkdir -p /mnt/disks/chaindata-disk
sudo mount -o discard,defaults /dev/sdb /mnt/disks/chaindata-disk
- 프로세스가 폴더를 읽고 쓸 수 있도록 폴더의 권한을 업데이트합니다.
sudo chmod a+w /mnt/disks/chaindata-disk
- 마운트된 드라이브의 디스크 ID를 검색하여 드라이브가 마운트되었는지 확인합니다.
sudo blkid /dev/sdb
아래 출력 상자에 표시된 것과 유사한 메시지가 표시됩니다.
출력:
/dev/sdb: UUID="7fa9c421-0054-4555-b0ca-b470a97a3d84" TYPE="ext4"
- 마운트된 디스크의 디스크 ID를 가져와 /etc/fstab 파일에 추가합니다. 이 파일은 VM이 다시 시작되더라도 드라이브가 계속 마운트되도록 보장합니다.
export DISK_UUID=$(findmnt -n -o UUID /dev/sdb)
echo "UUID=$DISK_UUID /mnt/disks/chaindata-disk ext4 discard,defaults,nofail 0 2" | sudo tee -a /etc/fstab
- df 명령어를 실행하여 디스크가 정상적으로 마운트 및 포맷되고 올바른 크기가 할당되었는지 확인합니다.
df -h
새로 마운트된 볼륨과 크기를 보여주는 다음과 유사한 메시지가 표시됩니다.
출력:
/dev/sdb 196G 28K 196G 1% /mnt/disks/chaindata-disk
나중에 디스크 크기를 조절해야 하는 경우 이 안내를 따르세요.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
VM에 스왑 파일 만들기 및 VM에 연결된 디스크 마운트
VM에 사용자 만들기
프로세스를 실행할 사용자를 만듭니다.
- 다음 명령어를 실행하여 ethereum이라는 이름의 사용자를 만듭니다.
sudo useradd -m ethereum
sudo usermod -aG sudo ethereum
sudo usermod -aG google-sudoers ethereum
- ethereum 사용자로 전환합니다.
sudo su ethereum
- Bash 명령줄을 시작합니다.
bash
- ethereum 사용자의 홈 폴더로 이동합니다.
cd ~
Ethereum 소프트웨어 설치
- 운영체제를 업데이트합니다.
sudo apt update -y
sudo apt-get update -y
- 공통 소프트웨어를 설치합니다.
sudo apt install -y dstat jq software-properties-common
- Google Cloud 운영 에이전트를 설치합니다.
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install
- 다운로드한 스크립트 파일을 삭제합니다.
rm add-google-cloud-ops-agent-repo.sh
- Geth 및 Lighthouse 클라이언트의 로그와 체인 데이터를 저장할 폴더를 만듭니다.
mkdir /mnt/disks/chaindata-disk/ethereum/
mkdir /mnt/disks/chaindata-disk/ethereum/geth
mkdir /mnt/disks/chaindata-disk/ethereum/geth/chaindata
mkdir /mnt/disks/chaindata-disk/ethereum/geth/logs
mkdir /mnt/disks/chaindata-disk/ethereum/lighthouse
mkdir /mnt/disks/chaindata-disk/ethereum/lighthouse/chaindata
mkdir /mnt/disks/chaindata-disk/ethereum/lighthouse/logs
- 패키지 관리자에서 Geth를 설치합니다.
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get -y install ethereum
- Geth가 최신 버전이며 사용 가능한 상태인지 확인합니다.
geth version
다음과 유사한 줄이 포함된 메시지가 표시됩니다.
출력:
Geth
Version: 1.14.11-stable
Git Commit: ea9e62ca3db5c33aa7438ebf39c189afd53c6bf8
Architecture: amd64
Go Version: go1.23.1
Operating System: linux
GOPATH=
GOROOT=
- Lighthouse 클라이언트를 다운로드합니다. 이 스크립트는 GitHub에서 최신 출시 버전을 다운로드합니다.
# Fetch the latest release information from GitHub API
RELEASE_URL="https://api.github.com/repos/sigp/lighthouse/releases/latest"
LATEST_VERSION=$(curl -s $RELEASE_URL | jq -r '.tag_name')
# Download the latest release using curl
DOWNLOAD_URL=$(curl -s $RELEASE_URL | jq -r '.assets[] | select(.name | endswith("x86_64-unknown-linux-gnu.tar.gz")) | .browser_download_url')
curl -L "$DOWNLOAD_URL" -o "lighthouse-${LATEST_VERSION}-x86_64-unknown-linux-gnu.tar.gz"
- Lighthouse tar 파일의 압축을 풀고 삭제합니다.
# Extract the tar file
tar -xvf "lighthouse-${LATEST_VERSION}-x86_64-unknown-linux-gnu.tar.gz"
# Remove the tar file
rm "lighthouse-${LATEST_VERSION}-x86_64-unknown-linux-gnu.tar.gz"
- Lighthouse 바이너리를 /usr/bin 폴더로 옮기고 권한을 업데이트합니다.
sudo mv lighthouse /usr/bin
- Lighthouse가 최신 버전이며 사용 가능한 상태인지 확인합니다.
lighthouse --version
다음과 유사한 줄이 포함된 메시지가 표시됩니다. 버전 번호는 다를 수 있습니다.
출력:
Lighthouse v5.3.0-d6ba8c3
BLS library: blst-portable
BLS hardware acceleration: true
SHA256 hardware acceleration: false
Allocator: jemalloc
Profile: maxperf
Specs: mainnet (true), minimal (false), gnosis (true)
- 공유 JWT 보안 비밀을 만듭니다. 이 JWT 보안 비밀은 실행 클라이언트의 RPC 엔드포인트를 호출할 수 있는 사용자를 제한하는 보안 메커니즘으로 사용됩니다.
cd ~
mkdir ~/.secret
openssl rand -hex 32 > ~/.secret/jwtsecret
chmod 440 ~/.secret/jwtsecret
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
VM에 사용자 만들기 및 Ethereum 소프트웨어 설치
작업 3. Ethereum 실행 및 합의 클라이언트 시작
Ethereum에는 두 개의 클라이언트가 있습니다. 실행 계층인 Geth와 합의 계층인 Lighthouse입니다. 이 두 개의 클라이언트는 서로 병렬로 실행되며 함께 작동합니다. Geth는 Lighthouse가 호출할 authrpc 엔드포인트와 포트를 설정합니다. 이 엔드포인트는 로컬에 저장된 공통 보안 토큰으로 보호됩니다. Lighthouse는 실행 엔드포인트와 보안 토큰을 사용하여 Geth에 연결합니다.
Geth가 합의 클라이언트에 연결하는 방법에 대한 자세한 내용은 Connecting to Consensus Clients 문서를 참조하세요. Lighthouse가 실행 클라이언트에 연결하는 방법에 대한 자세한 내용은 Merge Migration - Lighthouse Book 문서를 참조하세요.
Geth 시작
다음은 Geth 실행 클라이언트를 시작합니다.
- 먼저 gcloud에서 인증합니다. SSH 세션 내에서 다음을 실행합니다.
gcloud auth login
'계속하시겠어요(Y/n)?' 메시지가 표시되면 Enter 키를 누릅니다.
-
새 탭에 표시된 링크로 이동합니다.
-
활성 사용자 이름()을 클릭하고 '허용'을 클릭합니다.
-
로그인하려는 머신의 gcloud CLI에 다음 인증 코드를 입력합니다 메시지가 표시되면 복사 버튼을 클릭한 다음 SSH 세션으로 돌아가서 승인 코드 입력: 메시지에 코드를 붙여넣습니다.
-
외부 IP 주소 환경 변수를 설정합니다.
export CHAIN=eth
export NETWORK=mainnet
export EXT_IP_ADDRESS_NAME=$CHAIN-$NETWORK-rpc-ip
export EXT_IP_ADDRESS=$(gcloud compute addresses list --filter=$EXT_IP_ADDRESS_NAME --format="value(address_range())")
- 다음 명령어를 실행하여 Geth를 백그라운드 프로세스로 시작합니다. 이 실습에서는 라이트 노드인 'snap' 동기화 모드를 사용합니다. 풀 노드로 동기화하려면 동기화 모드로 'full'을 사용합니다. 명령줄에서 직접 실행하거나, 먼저 .sh 파일에 저장한 후 실행할 수 있습니다. systemd를 사용하여 서비스로 실행되도록 구성할 수도 있습니다.
nohup geth --datadir "/mnt/disks/chaindata-disk/ethereum/geth/chaindata" \
--http.corsdomain "*" \
--http \
--http.addr 0.0.0.0 \
--http.port 8545 \
--http.corsdomain "*" \
--http.api admin,debug,web3,eth,txpool,net \
--http.vhosts "*" \
--gcmode full \
--cache 2048 \
--mainnet \
--metrics \
--metrics.addr 127.0.0.1 \
--syncmode snap \
--authrpc.vhosts="localhost" \
--authrpc.port 8551 \
--authrpc.jwtsecret=/home/ethereum/.secret/jwtsecret \
--txpool.accountslots 32 \
--txpool.globalslots 8192 \
--txpool.accountqueue 128 \
--txpool.globalqueue 2048 \
--nat extip:$EXT_IP_ADDRESS \
&> "/mnt/disks/chaindata-disk/ethereum/geth/logs/geth.log" &
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
Geth를 백그라운드 프로세스로 시작하고 'snap' 동기화 모드 사용
- 다음 명령어를 실행하여 프로세스 ID를 확인합니다.
ps -A | grep geth
- 로그를 살펴보고 프로세스가 올바르게 시작되었는지 확인합니다.
tail -f /mnt/disks/chaindata-disk/ethereum/geth/logs/geth.log
아래 출력 상자에 표시된 것과 유사한 메시지가 표시됩니다. Geth 클라이언트는 합의 클라이언트와 페어링될 때까지 체인을 추적할 수 없습니다.
출력:
Looking for peers peercount=1 tried=27 static=0
Post-merge network, but no beacon client seen. Please launch one to follow the chain!
-
Ctrl+C를 입력하여 로그 모니터링을 중단합니다.
Lighthouse 시작
이제 Lighthouse 합의 클라이언트를 시작합니다.
- 다음 명령어를 실행하여 Lighthouse를 백그라운드 프로세스로 실행합니다. 명령줄에서 직접 실행하거나, 먼저 .sh 파일에 저장한 후 실행할 수 있습니다. systemd를 사용하여 서비스로 실행되도록 구성할 수도 있습니다.
nohup lighthouse bn \
--network mainnet \
--http \
--metrics \
--datadir /mnt/disks/chaindata-disk/ethereum/lighthouse/chaindata \
--execution-jwt /home/ethereum/.secret/jwtsecret \
--execution-endpoint http://localhost:8551 \
--checkpoint-sync-url https://sync-mainnet.beaconcha.in \
&> "/mnt/disks/chaindata-disk/ethereum/lighthouse/logs/lighthouse.log" &
- 다음 명령어를 실행하여 프로세스 ID를 확인합니다.
ps -A | grep lighthouse
- 로그 파일을 확인하여 프로세스가 올바르게 시작되었는지 확인합니다. 표시되는 데 몇 분 정도 걸릴 수 있습니다.
tail -f /mnt/disks/chaindata-disk/ethereum/lighthouse/logs/lighthouse.log
다음과 유사한 메시지가 표시됩니다.
출력:
INFO Syncing
INFO Synced
INFO New block received
-
Ctrl+C를 입력하여 로그 모니터링을 중단합니다.
-
Geth 로그를 다시 살펴보고 로그가 올바르게 생성되고 있는지 확인합니다.
tail -f /mnt/disks/chaindata-disk/ethereum/geth/logs/geth.log
아래 출력 상자에 표시된 것과 유사한 메시지가 표시됩니다.
출력:
Syncing beacon headers
노드가 블록체인과 동기화되었는지 확인
노드가 아직 동기화 중인지 확인합니다. 노드가 동기화되는 데 다소 시간이 걸립니다. (실습을 완료하기 위해 노드가 동기화될 때까지 기다릴 필요는 없습니다. 출력에 false 대신 동기화가 진행 중임을 나타내는 JSON이 표시되더라도 이는 정상입니다.) 동기화 상태를 확인하는 방법에는 Geth와 RPC 호출이라는 두 가지 방법이 있습니다.
- 다음 Geth 명령어를 실행하여 노드가 아직 동기화 중인지 확인합니다. 출력 결과가 'false'이면 네트워크와 완전히 동기화되었음을 의미합니다. 그러나 이 실습 중에는 계속 동기화가 진행 중인 상태일 가능성이 높습니다.
geth attach /mnt/disks/chaindata-disk/ethereum/geth/chaindata/geth.ipc
- Geth 콘솔에서 다음을 실행합니다.
eth.syncing
다음과 유사한 내용이 표시됩니다.
출력:
#If not synced:
{
currentBlock: 5186007,
healedBytecodeBytes: 0,
healedBytecodes: 0,
healedTrienodeBytes: 0,
healedTrienodes: 0,
healingBytecode: 0,
healingTrienodes: 0,
highestBlock: 16193909,
startingBlock: 0,
syncedAccountBytes: 2338698797,
syncedAccounts: 9417189,
syncedBytecodeBytes: 302598044,
syncedBytecodes: 58012,
syncedStorage: 42832820,
syncedStorageBytes: 9263550660
}
#If synced:
false
-
exit를 입력하여 Geth 콘솔을 종료합니다.
- 다음 curl 명령어를 실행하여 노드가 아직 동기화 중인지 확인합니다. 명령줄 도구 'jq'는 curl 명령어의 JSON 출력 형식을 지정합니다. 'false' 출력은 네트워크와 동기화되었음을 의미합니다.
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","id":67}' http://localhost:8545 | jq
출력:
#If not synced:
{
"jsonrpc": "2.0",
"id": 67,
"result": {
"currentBlock": "0x4d70e9",
"healedBytecodeBytes": "0x0",
"healedBytecodes": "0x0",
"healedTrienodeBytes": "0x0",
"healedTrienodes": "0x0",
"healingBytecode": "0x0",
"healingTrienodes": "0x0",
"highestBlock": "0xf71975",
"startingBlock": "0x0",
"syncedAccountBytes": "0x8b65b62d",
"syncedAccounts": "0x8fb1e5",
"syncedBytecodeBytes": "0x1209479c",
"syncedBytecodes": "0xe29c",
"syncedStorage": "0x28d93b4",
"syncedStorageBytes": "0x2282690c4"
}
}
#If synced:
{"jsonrpc":"2.0","id":67,"result":false}
- 다음 curl 명령어를 실행하여 외부 IP 주소를 통해 노드에 액세스할 수 있는지 확인합니다.
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","id":67}' http://$EXT_IP_ADDRESS:8545 | jq
출력:
#If not synced:
{
"jsonrpc": "2.0",
"id": 67,
"result": {
"currentBlock": "0x4d70e9",
"healedBytecodeBytes": "0x0",
"healedBytecodes": "0x0",
"healedTrienodeBytes": "0x0",
"healedTrienodes": "0x0",
"healingBytecode": "0x0",
"healingTrienodes": "0x0",
"highestBlock": "0xf71975",
"startingBlock": "0x0",
"syncedAccountBytes": "0x8b65b62d",
"syncedAccounts": "0x8fb1e5",
"syncedBytecodeBytes": "0x1209479c",
"syncedBytecodes": "0xe29c",
"syncedStorage": "0x28d93b4",
"syncedStorageBytes": "0x2282690c4"
}
}
#If synced:
{"jsonrpc":"2.0","id":67,"result":false}
작업 4. Cloud 운영 구성
Google Cloud에서는 Ethereum 노드를 관리할 수 있는 여러 운영 서비스를 제공합니다. 이 섹션에서는 Cloud Logging, Managed Prometheus, Cloud Monitoring, Cloud 알림을 구성하는 방법을 자세히 알아봅니다.
Cloud Logging 구성
기본적으로 Geth와 Lighthouse는 각각 선언된 로그 파일에 로깅합니다. 로그 데이터를 Cloud Logging으로 가져와야 합니다. Cloud Logging에는 강력한 검색 기능이 있으며 특정 로그 메시지에 대한 알림을 만들 수도 있습니다.
- Cloud 운영 구성 파일을 업데이트할 수 있도록 파일 권한을 업데이트합니다.
sudo chmod 666 /etc/google-cloud-ops-agent/config.yaml
- Cloud Logging에 로그 데이터를 전송하도록 Cloud 운영 에이전트를 구성합니다. 이 운영 에이전트 구성을 포함하도록 '/etc/google-cloud-ops-agent/config.yaml' 파일을 업데이트합니다. 이 구성 파일은 Cloud Logging으로 가져올 Geth 및 Lighthouse 로그 파일을 정의합니다.
sudo cat << EOF >> /etc/google-cloud-ops-agent/config.yaml
logging:
receivers:
syslog:
type: files
include_paths:
- /var/log/messages
- /var/log/syslog
ethGethLog:
type: files
include_paths: ["/mnt/disks/chaindata-disk/ethereum/geth/logs/geth.log"]
record_log_file_path: true
ethLighthouseLog:
type: files
include_paths: ["/mnt/disks/chaindata-disk/ethereum/lighthouse/logs/lighthouse.log"]
record_log_file_path: true
journalLog:
type: systemd_journald
service:
pipelines:
logging_pipeline:
receivers:
- syslog
- journalLog
- ethGethLog
- ethLighthouseLog
EOF
- 저장한 후 다음 명령어를 실행하여 에이전트를 다시 시작하고 변경사항을 적용합니다.
sudo systemctl stop google-cloud-ops-agent
sudo systemctl start google-cloud-ops-agent
sudo systemctl status google-cloud-ops-agent
-
Ctrl+C를 입력하여 상태 화면을 종료합니다.
- 상태에 오류가 있는 경우 다음 명령어를 사용하여 자세한 내용을 확인합니다.
sudo journalctl -xe | grep "google_cloud_ops_agent_engine"
- Cloud Logging을 살펴보고 콘솔에 로그 메시지가 표시되는지 확인합니다. Cloud 콘솔에서 탐색 메뉴(
)로 이동하여 모든 제품 보기를 클릭하고 모니터링 가능성에서 Logging을 클릭합니다. 왼쪽 메뉴에서 로그 탐색기를 클릭합니다. 다음과 유사한 메시지가 표시됩니다.
Managed Prometheus 구성
geth 및 lighthouse 클라이언트를 --metrics 플래그로 시작했으므로, 두 클라이언트 모두 http 포트를 통해 측정항목을 출력합니다. 이러한 측정항목은 Prometheus와 같은 시계열 데이터베이스에 저장할 수 있으며, 유용한 정보를 제공하는 Grafana 대시보드에 데이터를 제공하는 데 사용할 수 있습니다. 일반적으로는 VM에 Prometheus를 설치해야 하지만, Cloud 운영 에이전트에서 간단한 구성을 통해 측정항목을 캡처하고 Google Cloud의 Managed Prometheus 서비스에 저장할 수 있습니다.
- VM의 명령줄에서 Geth 측정항목 엔드포인트가 활성 상태인지 확인합니다.
curl http://localhost:6060/debug/metrics/prometheus
출력:
......
# TYPE vflux_server_clientEvent_deactivated gauge
vflux_server_clientEvent_deactivated 0
# TYPE vflux_server_clientEvent_disconnected gauge
vflux_server_clientEvent_disconnected 0
# TYPE vflux_server_inactive_count gauge
vflux_server_inactive_count 0
- VM의 명령줄에서 Lighthouse 측정항목 엔드포인트가 활성 상태인지 확인합니다.
curl http://localhost:5054/metrics
출력:
......
gossipsub_heartbeat_duration_bucket{le="300.0"} 5679573
gossipsub_heartbeat_duration_bucket{le="350.0"} 5679573
gossipsub_heartbeat_duration_bucket{le="400.0"} 5679573
gossipsub_heartbeat_duration_bucket{le="450.0"} 5679573
gossipsub_heartbeat_duration_bucket{le="+Inf"} 5679573
......
- 측정항목 데이터를 Managed Prometheus로 전송하도록 Cloud 운영 에이전트를 구성합니다. 이 운영 에이전트 구성을 포함하도록 '/etc/google-cloud-ops-agent/config.yaml' 파일을 업데이트합니다. 이 구성 파일은 Managed Prometheus로 가져올 Geth 및 Lighthouse 측정항목 엔드포인트를 정의합니다.
sudo cat << EOF >> /etc/google-cloud-ops-agent/config.yaml
metrics:
receivers:
prometheus:
type: prometheus
config:
scrape_configs:
- job_name: 'geth_exporter'
scrape_interval: 10s
metrics_path: /debug/metrics/prometheus
static_configs:
- targets: ['localhost:6060']
- job_name: 'lighthouse_exporter'
scrape_interval: 10s
metrics_path: /metrics
static_configs:
- targets: ['localhost:5054']
service:
pipelines:
prometheus_pipeline:
receivers:
- prometheus
EOF
- 저장한 후 다음 명령어를 실행하여 에이전트를 다시 시작하고 변경사항을 적용합니다.
sudo systemctl stop google-cloud-ops-agent
sudo systemctl start google-cloud-ops-agent
sudo systemctl status google-cloud-ops-agent
-
Ctrl+C를 입력하여 상태 화면을 종료합니다.
- 상태에 오류가 있는 경우 다음 명령어를 사용하여 자세한 내용을 확인합니다.
sudo journalctl -xe | grep "google_cloud_ops_agent_engine"
-
Cloud Logging을 확인하여 콘솔에 측정항목이 표시되는지 확인합니다. Cloud 콘솔에서 탐색 메뉴(
)로 이동하여 모든 제품 보기를 클릭하고 모니터링 가능성에서 Monitoring을 클릭합니다. 왼쪽 메뉴에서 측정항목 탐색기를 클릭합니다.
-
<> PromQL 옵션을 선택합니다. 쿼리 상자에 Lighthouse 측정항목 gossipsub_heartbeat_duration_bucket을 입력합니다. 쿼리 실행을 클릭합니다. 다음과 유사한 결과가 표시됩니다.
Geth 측정항목(예: rpc_duration_eth_blockNumber_success_count)에 대해서도 동일한 작업을 수행하여 Geth 측정항목이 표시되는지 확인할 수 있습니다.
Cloud Monitoring 보기
가상 머신에 Cloud Monitoring이 이미 활성화되어 있어야 합니다.
- Cloud 콘솔에서 탐색 메뉴(
) > Compute Engine > VM 인스턴스로 이동합니다.
- VM eth-mainnet-rpc-node를 클릭합니다.
-
모니터링 가능성 탭을 클릭합니다.
- 모든 섹션에 VM의 다양한 측정항목 그래프가 표시됩니다.
- 하위 메뉴와 기간을 다양하게 클릭하며 VM에서 바로 캡처되는 다양한 유형의 측정항목을 확인합니다.
알림 채널 구성
알림을 보낼 알림 채널을 구성합니다.
- Cloud 콘솔에서 탐색 메뉴(
)로 이동하여 모든 제품 보기를 클릭하고 모니터링 가능성에서 Monitoring을 클릭합니다. 왼쪽 메뉴에서 알림을 클릭합니다.
-
알림 채널 수정을 클릭합니다.
-
이메일 아래에서 새로 추가를 클릭합니다.
- 알림을 받을 사람의 이메일 주소와 표시 이름을 입력합니다.
-
저장을 클릭합니다.
측정항목 알림 구성
VM 측정항목을 기반으로 알림을 구성합니다.
- 왼쪽 메뉴의 감지 섹션에서 알림을 클릭합니다.
-
정책 만들기를 클릭합니다.
-
측정항목 선택을 클릭합니다.
-
VM 인스턴스 > 디스크 > 디스크 사용률을 클릭하고 적용을 클릭합니다.
- 필터를 추가합니다.
| 속성 |
값(입력 또는 선택) |
| 기기 |
/dev/sdb |
| 상태 |
사용됨 |
-
다음을 클릭합니다.
- 기준 값으로 90%를 입력합니다.
-
다음을 클릭하고 다음 값을 선택합니다.
| 속성 |
값 (입력 또는 선택) |
| 알림 채널 사용 |
선택 |
| 알림 채널 |
이전에 만든 알림 채널 선택 |
| 사고 종료 시 알림 |
확인 |
| 사고 자동 종료 기간 |
2일 |
| 문서 |
VM의 디스크 공간 확인 |
| 이름 |
VM - 디스크 공간 알림 - 사용률 90% |
-
다음을 클릭합니다.
-
정책 만들기를 클릭합니다.
업타임 체크 구성
HTTP 엔드포인트에 대한 업타임 체크를 구성합니다.
- 왼쪽 메뉴의 감지 섹션에서 업타임 체크를 클릭합니다.
-
업타임 체크 만들기를 클릭합니다.
- 다음 값을 사용하여 업타임 체크를 구성합니다.
| 속성 |
값 (입력 또는 선택) |
| 프로토콜 |
HTTP |
| 리소스 유형 |
URL |
| 호스트 이름 |
[인스턴스의 외부 IP] |
| 경로 |
/ |
| '대상 옵션 더보기' 펼치기 |
|
| 요청 메서드 |
GET |
| 포트 |
8545 |
| '계속' 클릭 |
기본값 수락 |
| '계속' 클릭 |
기본값 수락 |
| 알림 채널 선택 |
이전에 만든 알림 채널 선택 |
| 제목 |
eth-mainnet-rpc-node-uptime-check |
-
테스트를 클릭합니다(성공을 나타내는 200 OK가 표시되어야 함).
-
만들기를 클릭합니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
Cloud 운영 구성
수고하셨습니다
이 실습에서는 영구 디스크가 있는 Compute Engine 인스턴스를 만들고, 고정 IP 주소를 구성하고, 네트워크 방화벽 규칙을 구성하고, 백업을 예약하고, Geth 및 Lighthouse Ethereum 클라이언트를 배포하고, Ethereum RPC 호출로 설정을 테스트하고, Cloud Logging 및 Monitoring을 구성하고, 업타임 체크를 구성했습니다.
다음 단계/더 학습하기
Ethereum 여정을 계속하려면 다음 리소스를 확인하세요.
Google Cloud 교육 및 자격증
Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.
설명서 최종 업데이트: 2026년 7월 27일
실습 최종 테스트: 2026년 7월 27일
Copyright 2026 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.