Help us understand the problem. What is going on with this article?

GCE エフェメラルIPを定期的に変える方法 (クローリング,キャプチャ対策)

直近関わった案件でGCP環境で
特定Webサイトに対して定期的にクローリングする際にキャプチャ回避策として、グローバルIP定期的に変更するやり方をしたので、一般化して備忘する。

構成イメージ

crawl.png

クローラーインスタンスとは別のインスタンスから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 に変わったことがわかる。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away