前回はGAE/ファイアウォール ルールをクラウドコンソールから非常に簡易に設定できることを確認しました。
しかし、実際の運用では検証環境で動作確認をしてから、本番環境にも適用したいですよね!
というわけで今回は gcloud コマンドを使用してコマンドラインからの操作を行います。
gcloud コマンドであればスクリプト化することで検証環境で動作確認したファイルをコピー、設定周りを少し編集するだけで簡単に流用することができ、バッチ化も容易に行えます。
また、今回の検証では下図のように GCE インスタンス2台(AとB)を作成し、GAE アプリケーションのインスタンスの挙動や Stackdriver Logging から結果を確認していきます!!
検証1: default を許可、A の IP アドレスを拒否
検証2: default を拒否、A の IP アドレスを許可
事前準備
- Cloud SDK のインストール
- gcloud beta コマンドの有効化
- GCEインスタンス作成(2台)
- GAEアプリケーション作成
Cloud SDK のインストール
今回はgcloudコマンドを使用するので、事前にCloud SDKのインストールが必須となります。
インストール詳細はこちらの記事が参考になります。
gcloud beta コマンドの有効化
GAEのファイアウォールルールは2017年9月時点でベータ版のため、インストール直後のgcloud コマンドでは設定することができません。
ベータ版の機能を使う場合、gcloud beta コマンドを有効にしておく必要があります。
# beta 機能の有効化
$ gcloud components install beta
# Cloud SDK のアップデート
$ gcloud components update
下記6つのコマンドがファイアウォール ルール用のコマンドとして提供されています。
- gcloud beta app firewall-rules create
- gcloud beta app firewall-rules describe
- gcloud beta app firewall-rules list
- gcloud beta app firewall-rules test-ip
- gcloud beta app firewall-rules update
- gcloud beta app firewall-rules delete
サブコマンド名 | 概要 |
---|---|
create | 優先度、アクション、IP 範囲、概要を指定してルールを作成します。 |
describe | 優先度を指定して設定されたルールの詳細を表示します。 |
list | ルール設定の一覧を表示します。 |
test-ip | IP アドレスのテストを行います。 |
update | 優先度を指定して、既存のルールのアクション、IP 範囲、概要などを更新します。 default に関してはアクションの更新のみです。 |
delete | 優先度を指定して、既存のルールを削除します。(default 除く) |
GCEインスタンス作成
gcloud compute instances create コマンドからインスタンスを作成しました。
curl コマンドを叩くためだけに使用するのでマシンタイプは最小の f1-micro にしました。
IP アドレスはインスタンス作成時にコマンドラインに出力されます。
今回作成したインスタンスの情報はこちらです。
インスタンス名 | IP アドレス |
---|---|
instance-a | 35.187.194.104 |
instance-b | 35.189.136.246 |
作成時に使用したスクリプト (gistのページを開きます)
GAEアプリケーション作成
今回はGAE/goでルートにアクセスした場合に hello と返し、Stackdriver Logging にアクセス元の IP アドレスを出力するアプリを作成しました。GAE/go 初心者の方にはこちらの記事がおすすめです!
現在はファイアウォール ルールの設定は行っていないため、全てのアクセスが許可となっています。
先ほど作成した GCE インスタンス2台からアクセスしてログを確認してみます。
アクセスされていることが確認できました。
アプリケーションのソース (gistのページを開きます)
GAEのファイアウォールを実際に検証!
準備が終わったので検証を行います!検証内容は以下のとおりです。
検証1: default を許可、instance-a の IP アドレスを拒否
結果予想
- instance-a からアクセス
ログ: IP アドレスの記録なし
GAEインスタンス: 立ち上がらない - instance-b からアクセス
ログ: IP アドレスの記録あり
GAEインスタンス: 立ち上がる
検証2: default を拒否、instance-a の IP アドレスを許可
結果予想
- instance-a からアクセス
ログ: IP アドレスの記録あり
GAEインスタンス: 立ち上がる - instance-b からアクセス
ログ: IP アドレスの記録なし
GAEインスタンス: 立ち上がらない
検証1
firewall-rule を設定します。下記スクリプトを作成し、実行します。
default-allow_instance-a-deny.sh (gistのページを開きます)
#!/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=allow
# instance-a deny
gcloud beta app firewall-rules create 1 \
--action=deny \
--source-range='35.187.194.104' \
--description='default -> allow, instance-a -> deny'
$ sh default-allow_instance-a-deny.sh
Updated property [core/project].
Updated [2147483647].
Created [1].
list コマンドを実行し、正しく設定されているか確認します。
$ gcloud beta app firewall-rules list
PRIORITY ACTION SOURCE_RANGE DESCRIPTION
1 DENY 35.187.194.104 default -> allow, instance-a -> deny
2147483647 ALLOW * The default action.
今回はインスタンスの立ち上がりの挙動も確認したいので、curl コマンドを実行する前に下記コマンドで立ち上がっているインスタンスを削除しておきます。
インスタンスの削除
※ID, SERVICE, VERSION はgcloud app instances list コマンドから確認出来ます。
$ gcloud app instances delete INSTANCE_ID \
--service=INSTANCE_SERVICE --version=INSTANCE_VERSION
それでは実際にアクセスしてみます!
instance-a, instance-b にそれぞれ SSH接続し、
”curl -i https://YOUR_PROJECT_ID.appspot.com/”を実行します。
※-i オプションを付与することでヘッダ情報が出力され、HTTPステータスコードを確認できます。
結果
- instance-a
ステータスコード: 403 Forbidden (アクセス禁止)
インスタンス: 立ち上がらない
ログ: 記録なし - instance-b
ステータスコード: 200 OK (リクエスト成功)
インスタンス: 立ち上がる
ログ: 記録あり
予想どおりの結果となりました!
検証2
下記スクリプトを実行し、ファイアウォールルールを更新します。
default-deny_instance-a-allow.sh (gistのページを開きます)
#!/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 update 1 \
--action=allow \
--source-range='35.187.194.104' \
--description='default -> deny, instance-a -> allow'
$ sh default-deny_instance-a-allow.sh
Updated property [core/project].
Updated [2147483647].
Updated [1].
$ gcloud beta app firewall-rules list
PRIORITY ACTION SOURCE_RANGE DESCRIPTION
1 ALLOW 35.187.194.104 default -> deny, instance-a -> allow
2147483647 DENY * The default action.
それではインスタンスを削除してアクセスしてみます!
結果
- instance-a
ステータスコード: 200 OK (リクエスト成功)
インスタンス: 立ち上がる
ログ: 記録あり
- instance-b
ステータスコード: 403 Forbidden (アクセス禁止)
インスタンス: 立ち上がらない
ログ: 記録なし
こちらも予想どおりの結果となりました!
まとめ
コマンドラインから gcloud コマンドでファイアウォール ルールを設定することができました!
gcloud コマンドで設定する利点としては、開発環境で設定、検証やチューニングなどを行った状態のものをスクリプトファイルにまとめることで、本番環境の設定を行う際にはスクリプトファイルをコピーし、プロジェクトIDなど本番向けに修正するだけで設定ができてしまいます。
また、クラウドコンソール画面ではクリックミスなどの可能性が考えられますが、スクリプトで実行してしまえばそのような心配もありません!
GAE の料金はインスタンスの起動時間で課金されるため、拒否した IP アドレスからのアクセスでインスタンスが立ち上がらないのは、かなりありがたいですね!
ぜひお試しください!!
ちなみに、default が拒否設定の場合、適切な設定がされていないと GAE アプリケーションで Cron や Taskqueue からアクセスを行いたい場合に弾かれてしまいます。
その場合は、0.1.0.1 (Cron), 0.1.0.2 (Taskqueue) を許可設定にする必要があります。
次回は Cron, Taskqueue からのアクセス時の設定&検証を行います!!
※ 弊社ではクラウドエース(Cloud Ace)というGCPの導入・運用支援サービスを提供しておりますので、ご興味のある方はこちらまでお問い合わせください。
GAEに限らず、あらゆるGCPサービスのサポートが可能です。