フォーム読み込み中
2022年10月25日掲載
Google Cloudで、Google Kubernetes Engine (GKE) と Cloud CDN を連携し、署名付きURLを発行してGKE上に構築したアプリケーションにアクセスする方法をまとめました。
アプリケーションへのアクセスは通常アカウントを持っていれば Identity-Aware Proxy 等で認証ができますが、アカウントを持っていないユーザに対しても制限付きでアクセスを許可したいといったケースがあるかと思います。
そのような場合、署名付きURLを利用することにより、Googleアカウントを持っていないユーザでもCloud CDN のコンテンツへのアクセスを許可することができます。また、署名付きURLは有効期限が決められるので期間限定でのアクセス許可を実現可能です。
署名付きURLの詳細についてはこちらの公式ページをご覧ください。
今回はGoogle公式ドキュメントのサンプルに基づき一連の手順とその実行結果を記載しています。なお、2022年9月時点での仕様となりますので最新情報についてはドキュメントをご覧ください。
手順を実施する前に以下の準備を行います。
GKE で Cloud CDN を有効にするためにはBackendConfigの設定ファイル内で宣言する必要があります。
今回のサンプルで利用するBackendConfig用のファイルは以下の通りです。
太字部分のように spec:cdn:enabled: を true とすればCloud CDN が有効になります。
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
namespace: cdn-how-to
name: my-backendconfig
spec:
cdn:
enabled: true
cachePolicy:
includeHost: true
includeProtocol: true
includeQueryString: false
GKE の構築に必要な他の設定ファイルも事前に作成しておきます。
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: cdn-how-to
name: my-deployment
spec:
selector:
matchLabels:
purpose: demonstrate-cdn
replicas: 2
template:
metadata:
labels:
purpose: demonstrate-cdn
spec:
containers:
- name: echo-amd64
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app-cdn:1.0
apiVersion: v1
kind: Service
metadata:
namespace: cdn-how-to
name: my-service
labels:
purpose: demonstrate-cdn
annotations:
cloud.google.com/backend-config: '{"ports": {"80":"my-backendconfig"}}'
spec:
type: NodePort
selector:
purpose: demonstrate-cdn
ports:
- port: 80
protocol: TCP
targetPort: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: cdn-how-to
name: my-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: "cdn-how-to-address"
spec:
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: my-service
port:
number: 80
それぞれのファイルの準備ができたらGKEの各リソースを作成していきます。
kubectl apply -f my-deployment.yaml
kubectl apply -f my-backendconfig.yaml
kubectl apply -f my-service.yaml
外部IPアドレスを予約し、Ingress リソース を作成します。
gcloud compute addresses create cdn-how-to-address --global
kubectl apply -f my-ingress.yaml
Kubernetes Ingress コントローラによるGoogle Cloud ロードバランサの構成が完了するまで約10分程度待ちます。
以下のコマンドでロードバランサが転送ルールで使用する外部IPアドレスを取得します。
※IPアドレスが空欄の場合はロードバランサの構成が完了していないため、少し時間を置いてから再実行します。
kubectl describe ingress my-ingress --namespace=cdn-how-to | grep "Address"
Address: XX.XX.XXX.XX
出力された外部IPアドレスをコピーし、以下のコマンドを2回実行してCloud CDN のキャッシュされているか確認します。
出力結果に太字部分のようなAge ヘッダが存在し、キャッシュされた秒数が記載されていればOKです。
curl -v XX.XX.XXX.XX/?cache=true
> GET /?cache=true HTTP/1.1
> Host: XX.XX.XXX.XX
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 30 Sep 2022 07:55:24 GMT
< Content-Length: 70
< Content-Type: text/plain; charset=utf-8
< Via: 1.1 google
< Age: 114
< Cache-Control: max-age=3600,public
<
Hello, world!
Version: 1.0.0
Hostname: my-deployment-68bc8bf87d-wz7qt
これでGKE のアプリケーション と Cloud CDN が連携されていることを確認できました。
続いて署名付きURLを作成していきます。
署名付きURLを作成するためには、Cloud CDN が有効化されたバックエンド サービスで署名付きリクエストの鍵を作成する必要があります。
1つのバックエンドにつき、鍵は最大3つまで作成可能です。鍵は外部に漏れないよう注意し、定期的にローテーションすることが推奨されています。
鍵の作成は以下のコマンドで行います。
バックエンドサービスの名前を取得し、作成した鍵をバックエンドサービスに追加します。
head -c 16 /dev/urandom | base64 | tr +/ -_ > test-key-file-2
gcloud compute backend-services list
gcloud compute backend-services \
add-signed-url-key BACKEND_NAME \
--key-name test-key-name-2 \
--key-file test-key-file-2
鍵の作成が完了したら、それをもとに署名付きURLを作成します。
作成方法は gcloud compute sign-url コマンドを使用するほか、プログラムで作成することも可能です。
今回はコマンドを使用して作成します。URLの有効期限を60分に設定しました。
gcloud compute sign-url \
"http://XX.XX.XXX.XX/" \
--key-name test-key-name-2 \
--key-file test-key-file-2 \
--expires-in 60m
コマンドが成功すると、出力結果にURLが表示されます。
クリックするか別ブラウザに貼り付けて、アプリケーションにアクセスできることを確認します。
署名付きURLからアクセスできていることを確認できました。
期限の60分を過ぎるとこのURLからはアクセスできなくなりました。
以上が署名付きURLを発行してGKE上に構築したアプリケーションにアクセスするために必要な手順です。
すでに構築されたGKE上のアプリケーションにおいても、BackendConfig のマニフェストを書き換えて署名付きURLを作成すればよいので簡単に構築することができます。
注意事項としては、URLを知っていれば誰でもアクセスができてしまうのでURLの共有は慎重に行うことです。期限を適切に設定したり、必要なリソースのみにアクセスさせる等の制限をかけておくことが推奨されています。
アカウントを持っていないユーザに一時的なアクセスを許可するための手段の一つとしてご検討ください。
条件に該当するページがございません