このハンズオンでは、想定したメモリ使用率を超える仮想マシン (VM) のシェイプをOCI Functionsを利用して動的に変更する手順を記載します。

ハンズオン環境について
このハンズオンでは、動作確認のために意図的にVMのメモリ使用率を上昇させるコマンドを使用します。そのため、商用環境などでは絶対に行わないでください。 また、使用する仮想マシン (VM) についてもテスト用として用意したものを使用するようにしてください。

条件

このハンズオンが完了すると、以下のようなコンテンツが作成されます。

1.事前準備

このステップでは、OCI Functionsから仮想マシン (VM) を操作するための動的グループとポリシーの設定を行います。

動的グループおよびポリシーについて
動的グループを使用すると、Oracle Cloud Infrastructureコンピュータ・インスタンスを(ユーザー・グループと同様に)プリンシパルのアクターとしてグループ化し、ポリシーを作成できます。 そうすることで、インスタンスがOracle Cloud Infrastructureサービスに対してAPIコールを実行できるようにします。 詳細は動的グループの管理をご確認ください。

OCIコンソールのハンバーガーメニューをクリックして、アイデンティティとセキュリティドメインに移動します。

Default をクリックします。

画面左にあるアイデンティティ・ドメイン動的グループをクリックします。

動的グループの作成をクリックします。

以下項目を入力して、「作成」をクリックします。

  • 名前:動的グループの名前。今回は、func_dyn_grp
  • 説明:動的グループの説明。今回は、Function Dynamic Group
  • ルール1:ALL {resource.type = 'fnfunc', resource.compartment.id = '<compartment-ocid>'}(compartment.idは各自で使用するコンパートメントOCIDへ変更してください。)

OCIコンソールのハンバーガーメニューをクリックして、アイデンティティとセキュリティポリシーに移動します。

ポリシーの作成をクリックします。

以下項目を入力して、「作成」をクリックします。

  • 名前:ポリシーの名前。今回は、fn-policies

  • 説明:ポリシーの説明。今回は、たとえば、Function Policies

  • 手動エディタの表示:チェックを入れる

  • ポリシー・ビルダー:allow dynamic-group func_dyn_grp to use instances in compartment xxxxxx(compartment名は各自で使用するコンパートメント名へ変更してください。)

コンパートメントOCIDについて
[アイデンティティ]⇒[コンパートメント]に移動して、使用するコンパートメント(今回はルートコンパートメント)を開いて、該当OCIDを確認します。

これで、動的グループの作成とポリシーの作成は完了しました。

2.OCI Functionsの作成

このステップでは、仮想マシン (VM) のシェイプを変更するOCI Functionsのデプロイを行います。

OCIコンソールのハンバーガーメニューをクリックして、開発者サービスファンクションをクリックします。

アプリケーションの作成をクリックして、次を指定して、「作成」をクリックします。

  • 名前:アプリケーション名を指定。今回は、fn-resize-vm
  • VCN:Functionを実行するVCNを指定。今回は、OCI Functionsことはじめで作成したVCNを指定。
  • サブネット:Functionを実行するサブネット。今回は、OCI Functionsことはじめで作成したVCNのサブネットを指定。
  • Shape: FunctionsのCPUアーキテクチャを指定。今回は、GENERIC_X86

OCI Functionsことはじめで利用したCloud Shellにログインします。

ワークショップ用のコンテンツをクローニングします。

git clone https://github.com/oracle-japan/functions_resize_vmshape.git
cd functions_resize_vmshape/fn-resize-vm

次を入力して、fn-resize-vmというPython言語で作成されたFunctionをデプロイします。

fn -v deploy --app fn-resize-vm

これで、Function作成とデプロイは完了しました。

3.アラームの作成

このステップでは、OCIコンソールを使用してアラームを作成していきます。

OCIコンソールハンバーガーメニューを開きます。監視および管理で、アラーム定義をクリックします。

アラームの作成をクリックします。

以下のパラメータを入力します。

  • アラーム名:アラーム名を指定。今回はhigh-memory-utilization-alarm

  • メトリックの説明:

    • コンパートメント: ご自身のコンパートメントを指定。今回はルートコンパートメントを指定。

    • メトリック・ネームスペース: oci_computeagent

    • メトリック名:MemoryUtilization(メモリ使用率)

    • 間隔:1m

    • 統計:Max(最大)

    image-20200327155409280

  • トリガールール:

    • Operator:greater than

    • Value:90

    • Trigger delay minutes :1

image-20200327155521852

「Notifications」のDestinationにファンクションを選択します。

  • Destination service:「Notifications」

  • コンパートメント: ご自身のコンパートメントを指定。今回はルートコンパートメントを指定。

  • トピック: Create Topicをクリック

    トピックとファンクションを既に作成している場合は、新しいトピックを作成する代わりに、ここでそのトピックを選択できます。

  • トピック名: high-memory-utilization-topic

    • サブスクリプションプロトコル:ファンクション

    • ファンクション・コンパートメント: ルートコンパートメントを指定。

    • ファンクション・アプリケーション: fn-resize-vm

    • ファンクション: fn-resize-vm

Create topic and subscriptionをクリックします。

Define alarm notificationsから作成されたトピックを選択して、Save alarmをクリックします。

Notificationについて
Notificationサービスはファンクションや電子メールの他にもHTTPS(カスタムURL)/PagerDuty/Slackに対する通知を行うことができます。

これで、アラームの作成は完了です。

4.仮想マシン (VM) のメモリ使用率の延伸

このステップでは、Fn Projectハンズオンで作成したコンピュートインスタンスを利用して動作確認を行います。

現在VMのシェイプを確認します。例えば、以下の例では現状のスペックが1 OCPU/12GB RAMになっています。

image-20200327161440948

以下のコマンドをコンピュートインスタンス上で実行し、メモリ使用率を徐々にあげていきます。

/dev/null < $(yes) &

以下のように10プロセス程度をバックグランド実行で起動します。

[opc@instance]$ 
[opc@instance]$ /dev/null < $(yes) &
[1] 2370
[opc@instance]$ /dev/null < $(yes) &
[2] 2372
[opc@instance]$ /dev/null < $(yes) &
[3] 2374
[opc@instance]$ /dev/null < $(yes) &
[4] 2376
[opc@instance]$ /dev/null < $(yes) &
[5] 2378
[opc@instance]$ /dev/null < $(yes) &
[6] 2380
[opc@instance]$ /dev/null < $(yes) &
[7] 2382
[opc@instance]$ /dev/null < $(yes) &
[8] 2384
[opc@instance]$ /dev/null < $(yes) &
[9] 2387
[opc@instance]$ /dev/null < $(yes) &
[10] 2389
[opc@instance]$ 

以下のコマンドを実行し、メモリ使用率を確認しましょう。 3秒間隔で表示されますが、徐々に空きメモリが減っていくことが確認できます。

free -h -s 3 
              total        used        free      shared  buff/cache   available
Mem:            14G        5.5G        8.6G         16M        288M        8.7G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        5.6G        8.5G         16M        288M        8.5G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        5.7G        8.4G         16M        288M        8.5G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        5.8G        8.3G         16M        288M        8.3G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        5.9G        8.2G         16M        288M        8.2G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        6.0G        8.1G         16M        288M        8.1G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        6.1G        8.0G         16M        288M        8.0G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        6.3G        7.9G         16M        288M        7.9G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        6.4G        7.8G         16M        288M        7.8G
Swap:          8.0G          0B        8.0G

              total        used        free      shared  buff/cache   available
Mem:            14G        6.5G        7.6G         16M        288M        7.7G
Swap:          8.0G          0B        8.0G

5分~10分程度経つと、メモリ使用率が90%を超えるとFunctionが呼び出され、VMを再起動します。

その後、Functionにより1 OCPU/1GB RAMスケールアップされたVMが起動されます。(10程度かかります)

これで、OCI Functionsを使用して、VMシェイプの変更に成功しました!

お疲れ様でした!

更新日時: