🕳
IAPでCloudBuildからGCEに接続する
モチベーション
- CloudBuildからComputeEngine(GCE)に認証を通して接続したい
- Identity-Aware Proxy(IAP)のTCP転送を利用する方法をメモしておきたい
背景
プライベートなGCE上のサービスに対して、CloudBuildからリクエストを送りたいケースがありました。
プライベートプールを利用する方法等もありますが、シンプルな構成にするためにCloudBuild内にIAPでGCEに接続するトンネルを掘る方法を試してみました。
ざっくり構成手順
接続先のGCEは建ってる前提です。
1. IAPの設定
CloudBuildからIAP経由でGCEに接続するにあたって、ファイアウォールとIAMの設定をします。
この辺はドキュメントに書いてある以下を2点を実施します。
- ファイアウォールルールの作成(ドキュメント中の
allow-ingress-from-iqp
) - CloudBuildで利用するサービスアカウントに「IAPで保護されたトンネルユーザー」を付与する
2. CloudBuildの作成
次のようなyamlのトリガーを作成しました。
($_INSTANCE_NAME
にはGCEのインスタンス名を、$_INSTANCE_REGION
にはus-central1-a
等のインスタンスのリージョンを代入変数として設定します)
steps:
- name: 'python:3.11-bookworm'
args:
- '-c'
- >
apt-get update -y && apt-get install apt-transport-https ca-certificates
gnupg curl -y \
&& curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg
--dearmor -o /usr/share/keyrings/cloud.google.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg]
https://packages.cloud.google.com/apt cloud-sdk main" | tee -a
/etc/apt/sources.list.d/google-cloud-sdk.list \
&& apt-get update -y && apt-get install google-cloud-cli -y && gcloud
init \
&& gcloud compute start-iap-tunnel $_INSTANCE_NAME 8080 \
--local-host-port=localhost:8080 --zone=$_INSTANCE_REGION \
& sleep 240 && curl localhost:8080
entrypoint: /bin/sh
options:
logging: CLOUD_LOGGING_ONLY
1ステップにすべてまとまってるのが要改善ですが、ざっくり以下のような処理になっています。
- gcloudのインストール(gcloudイメージを使う場合はスキップ可能)
- インストール後、CloudBuildを実行するサービスアカウントで自動的にログインしてくれます
-
gcloud compute start-iap-tunnel
で接続対象のインスタンスにポートフォワードします - 1,2をバックグラウンド実行にし、3分待ちます(実際は2分ぐらいで終わる)
- インスタンスへの接続確認としてcurlでアクセスしてみます(➔CloudBuildからGCEへのアクセス)
ベースイメージをgcloudにすれば、前半のgcloudインストールを省略できますが、GCEへのリクエストを伴うpythonスクリプトを実行する予定だったため、pythonイメージを利用しました。
問題点
- IAPのドキュメントでも触れられていますが、パフォーマンスが低いためデータ送信を伴うような重めな処理や実行時間がシビアなものには向かなさそうです
- この方法の問題点ではないですが、CloudBuildのコードがアレな点は気づいたら更新したいなと思いました
- 筆者のCloudBuildの永続化まわりの知見が足らず、gcloudまわりの永続化ができずに1ステップにまとまってしまっている
- バックグラウンドにしてsleepしてるのがアレ(start-iap-tunnelしたら即curlみたいにしたい)
Discussion