2023年7月5日水曜日

AWS Lambda(2) : Lambdaを使ってRDSに情報を格納するDB準備

 Lambdaを使って処理した情報をRDSに格納していくために、AWS RDSにDBを立てて準備をしていきます。

(1) RDSにDBサーバを立てておく

AWS Academyの「データベース設定(モジュール中のデモ) : デモンストレーション [Demo] - Amazon RDS」を参考にDBサーバを立てます(MySQL互換性のAurora)。public アクセスを許可し、その後は基本的に指示通りに立てておきます。接続ができるように、セキュリティグループのインバウンドに入っているものを一旦削除して、改めて3306ポートが通るように設定しておくと良さそうです。

(2) AWS CloudShellで接続

ページ上の方から、AWS CloudShellを起動して、DBに接続していきます。接続には、以下のページを参考にします。ライターインスタンスに接続します。

MySQL データベースエンジンを実行している DB インスタンスへの接続

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html

エンドポイントを確認して、コマンドで接続していきます。
[cloudshell-user@ip-10-2-48-179 ~]$ mysql -h エンドポイント名 -P 3306 -u admin -p
無事ログインできると、次の画面になります。

(3) テーブルの作成
ログインしたら、起動時に作成した「database_1」というデータベースがあるかを確認します。

このデータベースの中に、「sumfunction」というテーブルを作成します。
CREATE TABLE sumfunction (
  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  data1 double NOT NULL,
  data2 double NOT NULL,
 result double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

テーブルも作成して、DBの準備ができました。

このテーブルにLambdaから処理した情報を入れていきます。その前に、SQL文でレコードを入れて確認をしてみます。

insert into sumfunction (data1, data2, result) values(2.0, 4.2, 6.2);



2023年6月15日木曜日

AWS Lambda(1) : Lambdaからの戻り値取得(辞書での受け取り)

 AWS Lambdaからの戻り値を取得して表示をしてみます。Lambdaからの戻り値はjsonなので、辞書で書いておくと便利なようです。Lambdaで作成した辞書を戻り値として、それをpythonで取得をしていきます。

(1) Lambdaで関数作成

Lambdaから関数の作成を図のように行います。関数名は任意ですが、ここでは「MyFunction001」、ランタイムは「Python3.9」、アクセス権限はデフォルトの実行ロールの変更から「既存のロールを使用する」「LabRole」(これはAWS Academyの場合なので、それ以外は任意です)とします。


さらに詳細設定から、「関数URLを有効化」にチェック、認証タイプは「None」とします。これで関数の作成をクリックします。
次のような画面が作成されます。

(2) Lambdaのソースコードを編集
デフォルトでできたコードは「Hello from Lambda!」と表示されるものです。今回関数URLを有効化してあるので、そのURLにアクセスしてみます。
bodyのところに、辞書を渡してあげると都合が良さそうなので、今回は簡単な辞書を渡します。
ソースコード

実行するには、Deployを押してからURLにアクセスします。

(3) 外部プログラムから、Lambdaの戻り値を取得
今度はGoogle Colabでもどのような環境でも良いので、Lambdaの関数URLにアクセスして、情報を取得・表示します。以下のコードを作成して、実行します。ここではGoogle Colabでやっています。
ソースコード

これで、Lambdaで処理したものを外部プログラムで取得できました。

2023年5月16日火曜日

ホストログの分析3 : 推移確率行列の算出

 第1回で求めた「wls_day-07_all.csv」に対して、推移確率行列を求めていきます。まず、状態空間を何にするかを検討する必要がありますが、第2回でEnvetIDに対して頻出回数を求めました。今回もEventIDを状態空間として、時系列にどのような推移があるかをカウントし、推移確率に直していきます。

・ライブラリの利用:mpi4py

今回のプログラムは利用者が数万人ですので、一人一人の推移を確認していくと、かなりの時間がかかってしまいます。そのため、並列計算を用いて、各プロセスに計算する利用者を割り振り、計算時間の短縮をはかります。注意として、並列計算をすると各プロセスでメモリを消費するので、今回プロセス数は8で実施しました。計算時間は約1時間ほどでした。

・工夫している点:状況をファイルに書き込み

並列計算をしていると、mpi4pyではターミナルへの標準出力が途中ではされなくなってしまいます。実行の状況を確認するために、プロセス0ではファイルの書き込みを行い、どのような段階にあるかをファイルを見ることで確認できます。Linux系OSでは、「tail -f ファイル名」で更新している様子が自動更新されわかりやすいです。

最後に、各プロセスでカウントした推移をプロセス0で集約して、行和を1にすることで正規化しています。これで推移確率行列ができています。

ソースコードリンク:https://github.com/smzn/CyberSecurity_MarkovChain/blob/main/HostEventsTransition.py

2023年5月8日月曜日

ネットワークログの分析3 : 同値類の算出

 デバイス間の推移確率が求められたので、次はこの推移確率から同値類とその同値類中の中心ノードを算出していきます。利用するファイルは以下のファイルです。transition_count_non0_rate.csv

このファイルを取り込んでいきます。

この推移確率行列から、デバイスを状態として、状態を同値類に分類していきます。同じ同値類であることは、相互到達可能であることを意味します。デバイス間で相互到達可能の集合がいくつあるかを調べていきます。次の関数を利用します。
getEquivalence4(th, roop, p)関数
この関数は3つの引数(th, roop, p)を持ちますが、thは推移しているとみなすことができる閾値です。つまり、この値より推移確率が大きいとき、推移があると考えます。roopは何回で到達可能かを示す値です。pは推移確率行列です。戻り値はmodify_equivalence, class_number, reachableがあります。modify_equivalenceは同値類ごとにデバイスが分類されています。class_numberは同値類の数、reachableは状態間で推移が可能かどうかを{0,1}で表した接続行列です。
もう一つ関数を作っていきます。
getDegreeMax(equivalence, reachable)関数
これは、同値類の中で中心性のノードがどれかを計算しています。次数中心性で求めています。
今回の計算結果では、
同値類数が6964個、
最大クラス数 : 18090、
最大クラスを持つindex : 0 
最大クラスの最大次数を持つノード番号 : 6947、
デバイス名 : Comp186884
となりました。ここまでの結果で同値類数、同値類の中の中心性デバイスの情報がわかるようになりました。