GAEのファイアウォールでCron, Taskqueue用の設定方法!

  • このエントリーをはてなブックマークに追加

前回の記事「GAEのファイアウォール設定&検証まとめ」でも最後に取り上げましたが、GAE のファイアウォールルールで、default を拒否設定にした場合、適切に設定していないと、Cron や Taskqueue からのアクセスまで拒否されてしまいます。
「せっかくファイアウォールを設定したのに Cron や Taskqueue が処理されない…」なんてことにならないためにも、今回は Cron, Taskqueue 向けの設定を解説し、実際に検証します!

事前準備

  • Cloud SDK のインストール
  • gcloud beta コマンドの有効化
  • アプリケーション準備
  • ファイアウォール設定

Cloud SDK のインストール

今回はgcloudコマンドを使用するので、事前にCloud SDKのインストールが必須となります。インストール詳細はこちらの記事が参考になります。

gcloud beta コマンドの有効化

GAEのファイアウォールルールは2017年9月時点でベータ版のため、インストール直後のgcloud コマンドでは設定することができません。
有効化の手順はこちらの記事に記載があります。

アプリケーション準備

前回使用したアプリケーションを改修し、Cron, Taskqueue に対応させます。
改修内容を簡単に説明します。

Add:

  • cron.yaml
    Cron でアクセスする URL、実行頻度などを設定するファイルです。
  • queue.yaml
    Taskqueue のタスク名、処理速度、並行実行数などを設定するファイルです。

Update:

  • demo.go
    Cron でアクセスするハンドラの作成、アクセス時にログ出力する。
    ルートにアクセスすると Taskqueue にタスクを追加、アクセス時にログ出力する。

対応後アプリケーションソース (gist)

ファイアウォール設定

まずは Cron と Taskqueue からアクセスされる IP アドレスを確認してみます。
Cron は「0.1.0.1」、Taskqueueは「0.1.0.2」になっているはずです。
default の設定を許可にして、Cron, Taskqueue を実行し、ログを見てみます。
Cron の実行はクラウドコンソールから下記手順で行います。

  •  ①GAE設定画面から「タスクキュー」を選択
  •  ②「cron ジョブ」タブを選択
  •  ③「今すぐ実行」をクリック

Taskqueue の実行はアプリケーションのルートにアクセスして行います。

それでは結果を見てみましょう。

ルート、Taskqueue, Cron からそれぞれアクセスされています。

ルート:
Taskqueue:
Cron:

また、IP アドレスも Cron が「0.1.0.1」、Taskqueue が「0.1.0.2」になっていることが確認できました。

それでは default の設定を拒否にします。
また、今回のアプリケーションでは Taskqueue に処理を追加するためにルートにアクセスする必要があるので、アクセスするための IP アドレスを許可設定にします。
前回使用した GCE インスタンスからアクセスするので「35.187.194.104」を許可します。

下記スクリプトを作成し、実行します。

setting-firewall.sh

#!/bin/sh

# Project set for Cloud SDK
PROJECT_ID=YOUR_PROJECT_ID
gcloud config set project $PROJECT_ID

# default update
gcloud beta app firewall-rules update default \
--action=deny

# instance-a allow
gcloud beta app firewall-rules create 10 \
--action=allow \
--source-range='35.187.194.104' \
--description='default -> deny, instance-a -> allow'

ファイアウォールルール適用後の結果です。

ルートへのアクセスは確認できましたが、Taskqueue, Cron からのアクセスはありませんでした。
これでファイアウォール設定が有効になっていることが確認できました!

GAEのFWでCron を許可

設定
Cron からは IP アドレス「0.1.0.1」でアクセスされます。
下記スクリプトを作成し、実行します。

update-cron-allow.sh

#!/bin/sh

# Project set for Cloud SDK
PROJECT_ID=YOUR_PROJECT_ID
gcloud config set project $PROJECT_ID

# cron allow
gcloud beta app firewall-rules create 1 \
--action=allow \
--source-range='0.1.0.1' \
--description='default -> deny, cron -> allow'

結果

ルートと Cron からのアクセスは確認できましたが、Taskqueue からのアクセスはありません。

また、Cron の詳細を見てみると、IP アドレス「0.1.0.1」からアクセスされていることが確認できました!

GAEのFWでTaskqueue を許可

設定
Taskqueue からは IP アドレス「0.1.0.2」でアクセスされます。
下記スクリプトを作成し、実行します。

update-tq-allow.sh

#!/bin/sh

# Project set for Cloud SDK
PROJECT_ID=YOUR_PROJECT_ID
gcloud config set project $PROJECT_ID

# taskqueue allow
gcloud beta app firewall-rules update 1 \
--action=allow \
--source-range='0.1.0.2' \
--description='default -> deny, taskqueue -> allow'

結果

ルートと Taskqueue からアクセスは確認できましたが、Cronからのアクセスはありませんでした。

Cron ジョブの実行画面のステータスでは「失敗しました」と表示されていることが確認できました。

また、Taskqueue の詳細を見てみると、IP アドレス「0.1.0.2」からアクセスされていることが確認できました!

まとめ

GAEでは、ファイアウォール設定で 0.1.0.1 を許可することで、Cron がアクセスできること、0.1.0.2 許可で Taskqueue がアクセスできるようになることが確認できました。
Cron や Taskqueue の設定を行う場合は優先度を1や2など、高めに設定しておくことがおすすめです!
そうすることで、うっかり他のルールの優先度が高くなり、競合して Cron ジョブや Taskqueue の処理が実行されない なんてことが防げます。

ちなみに、CIDR 表記を使用する関係上、Cron と Taskqueue の両方を設定する場合は下記のスクリプトのように異なる優先度のルールを2つ設定してあげる必要があります。

setting-cron-tq.sh

#!/bin/sh

# Project set for Cloud SDK
PROJECT_ID=YOUR_PROJECT_ID
gcloud config set project $PROJECT_ID

# cron allow
gcloud beta app firewall-rules create 1 \
--action=allow \
--source-range='0.1.0.1' \
--description='default -> deny, cron -> allow'

# taskqueue allow
gcloud beta app firewall-rules create 2 \
--action=allow \
--source-range='0.1.0.2' \
--description='default -> deny, taskqueue -> allow'

ぜひお試しください!!

※ 弊社ではクラウドエース(Cloud Ace)というGCPの導入・運用支援サービスを提供しておりますので、ご興味のある方はこちらまでお問い合わせください。GAEに限らず、あらゆるGCPサービスのサポートが可能です。

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら