ノート:

OCI Load BalancerのHTTPリクエストに基づくOracle Cloud Infrastructureインスタンス・プールの自動スケーリング

イントロダクション

このチュートリアルでは、OCI Load Balancerで受信したHTTPリクエストの数に基づいて、Oracle Cloud Infrastructure (OCI)インスタンス・プールを自動的にスケーリングする方法を説明します。3つの主なトピックについて説明します。

OCIモニタリング: OCIモニタリング・サービスを使用して、メトリックおよびアラーム機能を使用してクラウド・リソースをアクティブおよびパッシブにモニターします。OCIモニタリング・サービスは、メトリックを使用してリソースおよびアラームをモニターし、これらのメトリックがアラームで指定されたトリガーを満たしたときに通知します。

OCI通知: OCIのリソースで何かが発生した場合、アラーム、イベント・ルールおよびコネクタを使用して、サポートされているエンドポイント(電子メールやテキスト・メッセージ(SMS)を含む)を介して、判読可能なメッセージを取得できます。カスタムHTTPSエンドポイントおよびOCI関数を使用して、タスクを自動化することもできます。

OCI Functions: OCI Functionsは、完全なマネージド型、マルチテナントでスケーラビリティが高くオンデマンドのFunctions-as-a-Serviceプラットフォームです。エンタープライズグレードのOCI上に構築されており、Fn Projectオープン・ソース・エンジンによって強化されています。ビジネス・ニーズを満たすためのコードの作成に焦点を当てる場合は、OCI Functions (Functions、旧称Oracle Functions)を使用します。

高レベルのアーキテクチャ

T3_1

ノート:

目的

前提条件

タスク1: 動的グループの設定

ドメインに移動し、「動的グループ」をクリックして、次のグループを作成します。

動的グループ名: MyFunctions

ALL {resource.type = 'fnfunc', resource.compartment.id = 'pasteYourCompartmentOCID'}

タスク2: ポリシーの作成

「ポリシー」に移動して、次のポリシーを作成します。

ポリシー名: FunctionsPolicies

Allow dynamic-group MyFunctions to read repos in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to manage compute-management-family in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to manage load-balancers in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to read metrics in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to read alarms in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to manage instance-pools in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to manage instance-family in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to read app-catalog-listing in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to use volume-family in compartment YOUR-COMPARTMENT-NAME
Allow dynamic-group MyFunctions to use virtual-network-family in compartment YOUR-COMPARTMENT-NAME

タスク3: OCIコンテナ・レジストリの作成

  1. 「開発者サービス」に移動し、「コンテナ・レジストリ」をクリックして、Fnイメージのプライベート・リポジトリを作成します。

    リポジトリ名: lab/fn-autoscale-instance-pool

    T3_1

  2. リポジトリを確認し、ネームスペースをメモします。

    T3_1

  3. OCI CLIおよびDockerがインストールされているターミナル・シェルを開き、レジストリにログインします。リージョンの正しいURLを確認してください。このチュートリアルでは、レジストリURLがgru.ocir.ioであるブラジル東部(サンパウロ)リージョンを使用しています。

    docker login gru.ocir.io
    Username: <your container namespace>/youruser
    Password: YOUR_AUTH_TOKEN_CREATED_EARLIER
    

    T3_3

タスク4: インスタンス・プールを自動スケーリングするためのPython OCIファンクションの作成

ノート:ストリーム・プールの同じサブネットであるプライベート・サブネットを選択していることを確認してください。

  1. OCIコンソールに移動し、「開発者サービス」をクリックします。「ファンクション」で、「アプリケーション」および「アプリケーションの作成」をクリックします。

    T9_1

  2. いくつかの構成を作成して、スケーリング・サイズを設定します。

    ノート:これらの構成変数は、関数がインスタンス・プールのスケールインおよびスケールアウトに使用する値を決定するために使用されます。

    シークレット名 Value
    INSTANCE_POOL_TARGET_SIZE 新規インスタンス・プール・サイズの値の設定
    INSTANCE_POOL_DESIRED_SIZE インスタンス・プールの通常サイズの設定

    このチュートリアルでは、1つのインスタンスのインスタンス・プールを使用し、2にスケールアウトします。

    T4_2

  3. Docker、OCI CLI、Fn Project CLIがインストールされているターミナル・シェルに移動し、次のコマンドを実行してファンクションを初期化します。

    ノート:タスクに従った場合、Dockerログイン・コマンドは現在までにすでに実行されています。実行されていない場合は、タスク3.3でDockerログに進みます。

    mkdir lab
    cd lab
    fn create context oci-cloud --provider oracle
    fn use context oci-cloud
    fn update context oracle.compartment-id PASTE_YOUR_COMPARTMENT_OCID
    fn update context api-url https://functions.sa-saopaulo-1.oraclecloud.com
    fn update context registry gru.ocir.io/PASTE_YOUR_REGISTRY_NAMESPACE/lab
    fn init --runtime python fn-autoscale-instance-pool
    cd fn-autoscale-instance-pool
    ls -lrt
    

    ノート:このチュートリアルでは、ブラジル東部(サンパウロ)リージョンを使用しています。別のリージョンを使用している場合は、api-urlおよびregistryの場所を変更する必要があります。

    T4_3

    initコマンドは、func.pyにHello World関数を作成します。このコードは上書きします。

  4. func.pyからPython関数のサンプル・コードを取得し、関数initコマンド中に作成されたローカルfunc.pyを上書きします。

    # Copy the function code from this lab and save it on /tmp/func.py in your shell machine
    ls -lrt /tmp/func.py
    
    # Overwrite the func.py with tha lab's code
    cp /tmp/func.py func.py
    
    # Add the OCI package on the requirements.txt file, this will be needed to work with OCI.
    echo -e "\noci" >> requirements.txt
    
    # Check if requirements.txt has two lines
    cat requirements.txt
    

    T9_1

  5. 新しいコードを作成し、ファンクションをデプロイします。

    ls -lrt
    fn deploy --app MyApp
    

    T4_1

タスク5: OCI通知の作成

  1. OCIコンソールに移動し、「開発者サービス」をクリックします。「アプリケーション統合」で、「通知」を選択し、「トピックの作成」をクリックします。

    名前: AutoScaleTopic

    T5_1

  2. 「サブスクリプション」をクリックして新しいサブスクリプションを作成し、タスク4で作成したファンクションを選択します。

    T5_2

タスク6: スケールアウトするアラーム定義の作成(インスタンス・プール・サイズのターゲット値への調整)

  1. OCIコンソールに移動し、「監視および管理」をクリックします。「モニタリング」で、「アラーム定義」を選択し、「アラームの作成」をクリックします。

    ノート:このアラームのしきい値、間隔はチュートリアル用に定義されており、アプリケーションに応じて独自のニーズでカスタマイズできます。

    アラーム名: instance_pool_scale_OUT

  2. アラームを定義する次の情報を入力します。

    1. 「メトリックの説明」セクションで、次の情報を入力します。

      • メトリック・ネームスペース: oci_lbaas
      • メトリック名: HttpRequests
      • 間隔: 1 minute
      • 統計: Max
    2. 「メトリック・ディメンション」セクションで、次の情報を入力します。

      • 最初のメトリック・ディメンション:

        • ディメンション名: resourceID
        • ディメンション値:ロード・バランサOCIDを選択します。
      • 第2メトリック・ディメンション:

        • ディメンション名: backendSetName
        • ディメンション値: backendSet名を選択します。

      T6_1

    3. 「トリガー・ルール1」セクションで、次の情報を入力します。

      • 演算子: greater than
      • 値: 30
      • アラーム本体:接続数が予想よりも多く、スケーリング・プロセスを開始します。

      T6_1

  3. 次の情報を入力して、アラーム通知を定義します。

    1. 「宛先」セクションに、次の情報を入力します。

      • 宛先サービス: 「通知」を選択します。
      • コンパートメント:コンパートメントを選択します。
      • トピック:トピックを選択します。
    2. 「メッセージ・フォーマット」セクションで、「整形されたJSONメッセージの送信(改行を含むRAWテキスト)」を選択し、テストのために「通知頻度」の1分間の「通知の繰返し」を選択します。

    T6_1

  4. 「拡張オプション」をクリックし、新しいタグを追加します。

    ノート:これは、スケール・インまたはスケール・アウトのタイプを定義するために必須のタグ付けです。

    タグ・ネームスペース: 「None (apply a freeform tag)」を選択します。
    タグ・キー: autoscaling_type値: out

    T6_1

タスク7: スケールインするアラーム定義の作成(インスタンス・プール・サイズを必要なサイズに戻す)

  1. OCIコンソールに移動し、「監視および管理」をクリックします。「モニタリング」で、「アラーム定義」を選択し、「アラームの作成」をクリックします。

    ノート:このアラームのしきい値、間隔はチュートリアル用に定義されており、アプリケーションに応じて独自のニーズでカスタマイズできます。

    アラーム名: instance_pool_scale_IN

  2. アラームを定義する次の情報を入力します。

    1. 「メトリックの説明」セクションで、次の情報を入力します。

      • メトリック・ネームスペース: oci_lbaas
      • メトリック名: HttpRequests
      • 間隔: 1 minute
      • 統計: Max
    2. 「メトリック・ディメンション」セクションで、次の情報を入力します。

      • 最初のメトリック・ディメンション:

        • ディメンション名: resourceID
        • ディメンション値:ロード・バランサOCIDを選択します。
      • 第2メトリック・ディメンション:

        • ディメンション名: backendSetName
        • ディメンション値: backendSet名を選択します。
    3. 「トリガー・ルール1」セクションで、次の情報を入力します。

      • 演算子: less than
      • 値: 30
      • アラーム本体:接続数が許容値に戻り、スケールインをコールしてインスタンスの数を必要な値に戻します。

      T7_1

  3. 次の情報を入力して、アラーム通知を定義します。

    1. 「宛先」セクションに、次の情報を入力します。

      • 宛先サービス: 「通知」を選択します。
      • コンパートメント:コンパートメントを選択します。
      • トピック:トピックを選択します。
    2. 「メッセージ・フォーマット」セクションで、「整形されたJSONメッセージ(改行されたRAWテキスト)の送信」を選択します。

  4. 「拡張オプション」をクリックし、新しいタグを追加します。

    ノート:これは、スケール・インまたはスケール・アウトのタイプを定義するために必須のタグ付けです。

    タグ・ネームスペース: 「None (apply a freeform tag)」を選択します。
    タグ・キー: autoscaling_type値: in

    T7_1

タスク8: ロードの作成とアラームの動作の確認

  1. LoadBalancer IPを取得し、アプリケーションへの複数のコールをポート80で実行します。シェル・コンソールを開き、次のコードを実行してロード・バランサをコールします。

    i=1
    while true
    do
    echo "Request $i"
       curl http://your-ip-here
       ((i++))
       echo ""  # Prints a newline for better readability between requests
    done
    

    単純なアプリケーション・ロードの出力。

    T8_1

    ノート:これは、シナリオを示す単純なHTTP Apache Webサーバーです。

  2. インスタンス・プールの実際のサイズとステータスを確認します。このチュートリアルでは、サイズが1のインスタンス・プールを使用します。

    T8_1

  3. アラーム定義を開いてメトリックを表示し、アラームが起動するかどうかを確認します。

    T8_1

    T8_1

  4. メトリック間隔に応じて数分後、スケールアウト関数が起動します。

    インスタンス・プールを開き、「状態」(「スケーリング中」および「ターゲット・インスタンス数」)が2であることを確認します。

    T8_1

    スケーリング・プロセス後、インスタンス・プールのサイズが2であることがわかります。

    T8_1

  5. シェルスクリプトを停止し、スケールアウト遷移からのアラームが OKに戻るまで待ってから、スケールイン用のアラームを確認します。両方のアラームが更新されるまで数分待ってから、スケールイン用のアラームがいつ起動するかを確認します。

    T8_1

    現在、スケールインアラームは火災状態です。

    T8_1

    HttpRequests30のしきい値を下回ったことに注意します。

    T8_1

    インスタンス・プールのスケールインが開始されました。

    T8_1

    インスタンス・プール・サイズが1の値に戻っていることに注意してください。

    T8_1

承認

その他の学習リソース

docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。