【Google Cloud 】GKE 上のアプリケーションへCloud CDN の 署名付きURL を使ってアクセスしてみた

2022年10月25日掲載

キービジュアル

Google Cloudで、Google Kubernetes Engine (GKE) と Cloud CDN を連携し、署名付きURLを発行してGKE上に構築したアプリケーションにアクセスする方法をまとめました。

目次

  • アカウントを持っていないユーザに一時的なアクセスを許可するための1つの方法となる、署名付きURLについて解説します
  • 具体的には、「GKE上のアプリケーションとCloud CDN の連携手順」、「署名付きURLの作成手順とアクセス確認」を解説します
  • 前提知識として基本的なGKEでのアプリケーション構築の流れを理解している方を対象としています。

1. はじめに

アプリケーションへのアクセスは通常アカウントを持っていれば Identity-Aware Proxy 等で認証ができますが、アカウントを持っていないユーザに対しても制限付きでアクセスを許可したいといったケースがあるかと思います。

そのような場合、署名付きURLを利用することにより、Googleアカウントを持っていないユーザでもCloud CDN のコンテンツへのアクセスを許可することができます。また、署名付きURLは有効期限が決められるので期間限定でのアクセス許可を実現可能です。

署名付きURLの詳細についてはこちらの公式ページをご覧ください。

<Google公式ドキュメント>

今回はGoogle公式ドキュメントのサンプルに基づき一連の手順とその実行結果を記載しています。なお、2022年9月時点での仕様となりますので最新情報についてはドキュメントをご覧ください。

<Google公式ドキュメント>

 

2. 事前準備

手順を実施する前に以下の準備を行います。

  1. 課金が有効になっているGoogle Cloud プロジェクト を作成する
  2. プロジェクトにアクセスし、Artifact Registry and Google Kubernetes Engine API を有効化する
  3. Cloud Shell を起動し、デフォルトのプロジェクトとゾーンを設定する  ※プロジェクトIDとゾーンはサンプルです。
    • gcloud config set project test-project-id
    • gcloud config set compute/zone asia-northeast1-a
  4. GKE クラスタ を作成する  ※クラスタ名はサンプルです。
    • gcloud container clusters create loadbalancedcluster
  5. NameSpace を作成する  ※NameSpace の名前はサンプルです。
    • kubectl create namespace cdn-how-to

3. GKE のBackendConfig でCloud CDN を有効にする

GKE で Cloud CDN を有効にするためにはBackendConfigの設定ファイル内で宣言する必要があります。

今回のサンプルで利用するBackendConfig用のファイルは以下の通りです。

太字部分のように spec:cdn:enabled: を true とすればCloud CDN が有効になります。

< my-backendconfig.yaml >

  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 の構築に必要な他の設定ファイルも事前に作成しておきます。

< my-deployment.yaml >

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

< my-service.yaml >

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

< my-ingress.yaml >

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の各リソースを作成していきます。

< Deployment リソースの作成 >
kubectl apply -f my-deployment.yaml
< BackendConfig リソースの作成 >
kubectl apply -f my-backendconfig.yaml
< Service リソースの作成 >
kubectl apply -f my-service.yaml

 

外部IPアドレスを予約し、Ingress リソース を作成します。

< 外部IPアドレスの作成 >
gcloud compute addresses create cdn-how-to-address --global
< Ingress リソースの作成 >
kubectl apply -f my-ingress.yaml

Kubernetes Ingress コントローラによるGoogle Cloud ロードバランサの構成が完了するまで約10分程度待ちます。

以下のコマンドでロードバランサが転送ルールで使用する外部IPアドレスを取得します。

※IPアドレスが空欄の場合はロードバランサの構成が完了していないため、少し時間を置いてから再実行します。

 

< IPアドレスの取得 >
kubectl describe ingress my-ingress --namespace=cdn-how-to | grep "Address"
[ 出力結果 ]
Address:         XX.XX.XXX.XX

 

出力された外部IPアドレスをコピーし、以下のコマンドを2回実行してCloud CDN のキャッシュされているか確認します。

出力結果に太字部分のようなAge ヘッダが存在し、キャッシュされた秒数が記載されていればOKです。

 

< CDN キャッシュの確認 >
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を作成していきます。

4. 署名付き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分に設定しました。

< 署名付きURLの作成 >
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からはアクセスできなくなりました。

5. さいごに

以上が署名付きURLを発行してGKE上に構築したアプリケーションにアクセスするために必要な手順です。

すでに構築されたGKE上のアプリケーションにおいても、BackendConfig のマニフェストを書き換えて署名付きURLを作成すればよいので簡単に構築することができます。

注意事項としては、URLを知っていれば誰でもアクセスができてしまうのでURLの共有は慎重に行うことです。期限を適切に設定したり、必要なリソースのみにアクセスさせる等の制限をかけておくことが推奨されています。

アカウントを持っていないユーザに一時的なアクセスを許可するための手段の一つとしてご検討ください。

関連サービス

Google Cloud

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません