0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Colab 簡易的にAPI公開 メモ

Posted at

Google Colab 使って簡易的にJSON返すAPIを公開してみる
テストとかで一時的に使うには楽して公開できそう
ngrok を使って公開してます
Flask, FastAPI を使ってやってみる(両方とも大枠のやることは同じ)

ngrok よりアクセストークン、ドメインを取得

  1. ngrok のアカウントを作る
  2. アクセストークンを取得する
    image.png
  3. ドメインを取得する
    image.png

Google Colab (Flask を使って公開)

  1. ngrok のアクセストークン、ドメインをシークレットに追加する
    アクセストークン : NGROK_AUTH_TOKEN
    ドメイン : NGROK_DOMAIN
    image.png
  2. ノートブックに以下のコードを記入
    ノートブック
    # =================================================================
    # 1. 必要なライブラリのインストールとngrok認証
    # =================================================================
    !pip install pyngrok flask flask-cors -q
    
    from flask import Flask, jsonify
    from pyngrok import ngrok, conf
    from flask_cors import CORS
    import os
    import time
    from google.colab import userdata
    
    # シークレットから認証トークンとドメインを取得
    try:
        NGROK_AUTH_TOKEN = userdata.get("NGROK_AUTH_TOKEN")
        NGROK_DOMAIN = userdata.get("NGROK_DOMAIN")
        
        if not NGROK_AUTH_TOKEN:
            raise ValueError("NGROK_AUTH_TOKEN がシークレットにない")
        if not NGROK_DOMAIN:
            print("NGROK_DOMAIN がシークレットにない")
    
        # 取得したトークンでngrokに認証
        !ngrok authtoken $NGROK_AUTH_TOKEN
    
    except Exception as e:
        print(f"シークレットの取得またはngrok認証に失敗しました: {e}")
    
    # Flaskサーバーが使用するポート番号
    FLASK_PORT = 5000
    
    # =================================================================
    # 2. Flaskアプリケーションの定義
    # =================================================================
    
    app = Flask(__name__)
    # CORS設定: 開発中は全てのオリジンからのアクセスを許可
    CORS(app)
    
    # JSONを返すAPIエンドポイント
    @app.route("/api/sample", methods=["GET"])
    def get_sample():
        data = {
            "status": "success",
            "message": "Hello from Google Colab Flask API via ngrok!",
            "version": 1.5,
            "timestamp": time.time()
        }
        return jsonify(data)
    
    # =================================================================
    # 3. ngrokトンネルの開始とURLの取得
    # =================================================================
    
    # 既存のngrokプロセスを終了(クリーンアップ)
    try:
        ngrok.kill()
    except Exception:
        pass
    
    # トンネル接続の確立
    try:
        # ngrok設定に認証トークン、ドメインを適用
        conf.get_default().auth_token = NGROK_AUTH_TOKEN
        public_tunnel = ngrok.connect(FLASK_PORT, domain=NGROK_DOMAIN)
        public_url = public_tunnel.public_url
    
        print("="*60)
        print("API公開に成功しました")
        print(f" * Public URL (ngrok): {public_url}")
        print(f" * Access the API endpoint: {public_url}/api/sample")
        print("="*60)
    
    except Exception as e:
        print("ngrokトンネルの開始中にエラーが発生しました")
        print(f"エラー内容: {e}")
        # ngrok認証が失敗している可能性があるため、処理を中断
        public_url = None
    
    # =================================================================
    # 4. Flaskアプリケーションの実行
    # =================================================================
    
    if __name__ == '__main__':
        if public_url:
            print(f"Flaskサーバーをポート {FLASK_PORT} で実行中")
            # Flaskサーバーを起動。これは前のprint文が出た後に動作し続けます。
            app.run(port=FLASK_PORT, debug=False, use_reloader=False)
        else:
            print("Flaskサーバーは起動されませんでした。(ngrokエラーのため)")
    
  3. ブラウザなどで以下のURLにアクセス(NGROK_DOMAINは各自の値)
    https://NGROK_DOMAIN/api/sample
  4. JSONが取得できればOK!

Google Colab (FastAPI を使って公開)

  1. ngrok のアクセストークン、ドメインをシークレットに追加する
    アクセストークン : NGROK_AUTH_TOKEN
    ドメイン : NGROK_DOMAIN
    image.png
  2. ノートブックにコードを記入
    ノートブック
    # =================================================================
    # 1. 必要なライブラリのインストールとngrok認証
    # =================================================================
    !pip install -q fastapi nest-asyncio uvicorn pyngrok
    
    from fastapi import FastAPI
    from fastapi.middleware.cors import CORSMiddleware
    from pyngrok import ngrok, conf
    import uvicorn
    import nest_asyncio
    import asyncio
    import time
    from google.colab import userdata
    
    
    # シークレットから認証トークンとドメインを取得
    try:
        NGROK_AUTH_TOKEN = userdata.get("NGROK_AUTH_TOKEN")
        NGROK_DOMAIN = userdata.get("NGROK_DOMAIN")
    
        if not NGROK_AUTH_TOKEN:
            raise ValueError("NGROK_AUTH_TOKEN がシークレットにない")
        if not NGROK_DOMAIN:
            print("NGROK_DOMAIN がシークレットにない")
    
        # 取得したトークンでngrokに認証
        !ngrok authtoken $NGROK_AUTH_TOKEN
    
    except Exception as e:
        print(f"シークレットの取得またはngrok認証に失敗しました: {e}")
    
    # FastAPIサーバーが使用するポート番号
    FASTAPI_PORT = 8000
    
    # =================================================================
    # 2. FastAPIアプリケーションの定義
    # =================================================================
    
    app = FastAPI()
    # CORS設定: 開発中は全てのオリジンからのアクセスを許可
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )
    
    # JSONを返すAPIエンドポイント
    @app.get("/api/sample")
    async def get_sample():
        data = {
            "status": "success",
            "message": "Hello from Google Colab Flask API via ngrok!",
            "version": 1.5,
            "timestamp": time.time()
        }
        return data
    
    # =================================================================
    # 3. ngrokトンネルの開始とURLの取得
    # =================================================================
    
    # 既存のngrokプロセスを終了(クリーンアップ)
    try:
        ngrok.kill()
    except Exception:
        pass
    
    # トンネル接続の確立
    try:
        # ngrok設定に認証トークンを適用
        conf.get_default().auth_token = NGROK_AUTH_TOKEN
        public_tunnel = ngrok.connect(FASTAPI_PORT, domain=NGROK_DOMAIN)
        public_url = public_tunnel.public_url
    
        print("="*60)
        print("API公開に成功しました")
        print(f" * Public URL (ngrok): {public_url}")
        print(f" * Access the API endpoint: {public_url}/api/sample")
        print("="*60)
    
    except Exception as e:
        print("ngrokトンネルの開始中にエラーが発生しました")
        print(f"エラー内容: {e}")
        # ngrok認証が失敗している可能性があるため、処理を中断
        public_url = None
    
    # =================================================================
    # 4. FastAPIアプリケーションの実行
    # =================================================================
    
    # Colabで非同期処理を正しく実行するための設定
    nest_asyncio.apply()
    
    # uvicornサーバーの設定
    config = uvicorn.Config(app, port=FASTAPI_PORT, host="0.0.0.0")
    server = uvicorn.Server(config=config)
    
    # サーバーを非同期で起動(**このセルを実行するとサーバーが実行状態になります**)
    await server.serve()
    
  3. ブラウザなどで以下のURLにアクセス(NGROK_DOMAINは各自の値)
    https://NGROK_DOMAIN/api/sample
  4. JSONが取得できればOK!
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?