🗺️

Cloud Runでリージョン情報を返却する

に公開

概要

メタデータサーバを使って、Cloud Runでデプロイされたアプリケーションのリージョン情報を動的に取得して返す方法をまとめました。

メタデータサーバとは

実行中のインスタンスに関する様々な情報を取得できるサーバです。Cloud Runの場合、プロジェクト ID、リージョン、インスタンスID、サービスアカウントなどの情報が提供されています。

詳細は下記をご参照ください。
https://cloud.google.com/run/docs/container-contract?hl=ja#metadata-server

サンプルコード

下記の流れで処理をするFlaskアプリケーションを作成しました。ビルド、デプロイ方法については省略します。

  1. リージョン情報を取得できるエンドポイントにアクセス
  2. レスポンスから実際のリージョン名を抽出(projects/PROJECT-NUMBER/regions/REGION形式で返ってくるため)
  3. リージョン情報をクライアントへのレスポンスに含めて返却
app.py
import os

import requests
from flask import Flask

app = Flask(__name__)

METADATA_URL_BASE = 'http://metadata.google.internal/computeMetadata/v1/'
METADATA_HEADERS = {'Metadata-Flavor': 'Google'}

def get_region_from_metadata():
    try:
        region_url = METADATA_URL_BASE + 'instance/region'
        response = requests.get(region_url, headers=METADATA_HEADERS)
        response.raise_for_status()

        full_region_path = response.text
        region = full_region_path.split('/')[-1]
        return region
    except Exception:
        return None

@app.route('/')
def handle_request():
    deployed_region = get_region_from_metadata()
    if deployed_region:
        return f'Hello from {deployed_region}!'
    else:
        return 'Hello! Could not determine the deployment region.'

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(host='0.0.0.0', port=port)
Dockerfile
FROM python:3.13-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

CMD ["gunicorn", "-b", "0.0.0.0:8080", "app:app"]
requirements.txt
Flask==3.1.0
gunicorn==23.0.0
requests==2.32.3

デプロイ先のリージョンによって、WebブラウザでCloud RunのURLにアクセスした際の表示が変化することを確認できます。

東京リージョンの場合

オレゴンリージョンの場合

レスキューナウテックブログ

Discussion