GCE 임시 IP를 정기적으로 변경하는 방법 (클롤링, 캡처 방지)

7211 단어 gcpgce
최근 관련된 문제로 GCP 환경에서
특정 웹사이트에 대해 정기적으로 크롤링할 때 캡처 회피책으로서 글로벌 IP 정기적으로 변경하는 방법을 했으므로, 일반화해 비망한다.

구성 이미지





크롤러 인스턴스와는 다른 인스턴스에서 GCE 인스턴스에서 cron으로 gcloud 명령의 IP 변경하는 명령을 두드리는 형태로 한 OK. gcloud의 실행 사용자는 서비스 사용자를 이용했다.

crontab에서 실행할 쉘



$HOME/scripts/change-crawler-global-ip.sh
#!/bin/sh

logDir=/var/tmp/change-ip-log/`date +"%Y%m%d"`
logFile=${logDir}/`date +"%Y%m%d_%H%M%S"`.log
mkdir -p $logDir

PROJECT="<GCP-PROJECT-ID>"
ZONE="<ZONE>" # 例: asia-northeast1-b

INSTANCE="<INSTANCE-NAME>" # 例: instance-1
NETWORK_INTERFACE="External NAT" # デフォルトではこの名前だった。

# STEP1: 変更前にインスタンス構成情報を出力
echo -e "----- BEFORE -----\n" >> $logFile
gcloud compute instances describe --project="$PROJECT" --zone="$ZONE" "$INSTANCE" >> $logFile

# STEP2: ネットワークインターフェースを削除する。
gcloud compute instances delete-access-config  --project="$PROJECT" --zone="$ZONE" $INSTANCE --access-config-name="$NETWORK_INTERFACE" >> $logFile

# STEP3: ネットワークインターフェースを新規作成する。
gcloud compute instances add-access-config   --project="$PROJECT" --zone="$ZONE" "$INSTANCE" --access-config-name="$NETWORK_INTERFACE" >> $logFile

echo -e "----- AFTER -----\n" >> $logFile
# STEP4: 変更前にインスタンス構成情報を出力
gcloud compute instances describe --project="$PROJECT" --zone="$ZONE" "$INSTANCE" >> $logFile

STEP2의 네트워크 인터페이스 삭제 처리 실행 중 ~ STEP3의 새로운 네트워크 인터페이스 추가 처리 완료까지
해당 인스턴스는 인터넷에 연결되지 않으므로 주의.

crontab 예


$ crontab -l
# 15分おきにIPを変更 (cron処理時間と被らないように要調整)
3-58/5 * * * * sh $HOME/scripts/change-crawler-global-ip.sh

실행 로그 예


$ less /var/tmp/change-ip-log/20190124/20190124_115201.log 
canIpForward: false
cpuPlatform: Intel Broadwell
creationTimestamp: '2019-01-18T05:51:59.021-08:00'
deletionProtection: false
description: ''
disks:
- autoDelete: true
  boot: true
  deviceName: instance-1
  index: 0
  interface: SCSI
  kind: compute#attachedDisk
  licenses:
  - https://www.googleapis.com/compute/v1/projects/centos-cloud/global/licenses/centos-7
  mode: READ_WRITE
  source: https://www.googleapis.com/compute/v1/projects/...
er1
  type: PERSISTENT
id: 'xxx'
kind: compute#instance
labelFingerprint: xxx
machineType: https://www.googleapis.com/compute/v1/projects/...
metadata:
  fingerprint: xxx
  kind: compute#metadata
name: instance-1
networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: 34.85.25.113
    networkTier: PREMIUM
    type: ONE_TO_ONE_NAT
  fingerprint: xxx

(略)
----- AFTER -----

canIpForward: false
cpuPlatform: Intel Broadwell
creationTimestamp: '2019-01-18T05:51:59.021-08:00'
deletionProtection: false
description: ''
disks:
- autoDelete: true
  boot: true
  deviceName: instance-1
  index: 0
  interface: SCSI
  kind: compute#attachedDisk
  licenses:
  - https://www.googleapis.com/compute/v1/projects/centos-cloud/global/licenses/centos-7
  mode: READ_WRITE
  source: https://www.googleapis.com/compute/v1/projects/...
  type: PERSISTENT
id: 'xxx'
kind: compute#instance
labelFingerprint: xxx
machineType: https://www.googleapis.com/compute/v1/projects/...
metadata:
  fingerprint: xxx
  kind: compute#metadata
name: instance-1
networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: 34.85.46.233
    networkTier: PREMIUM
    type: ONE_TO_ONE_NAT
  fingerprint: xxx
(略)
34.85.25.113 에서 34.85.46.233 로 바뀐 것을 알 수 있다.

참고


  • 서비스 계정 관련
  • GitLab CI에서 Google App Engine 프로젝트 자동 배포

  • 공식 문서

  • 인스턴스의 IP 주소 설정

  • 좋은 웹페이지 즐겨찾기