こんにちわ。Mr.Xです。
第4回目になったけども、この間いろいろと忙しくろくろく触れてませんでした(言い訳)。とりあえず今回は、いろいろとアップデートが進むAzure Functionsに関して少し補足をするのと、vulsもアップデートしたので、それについて書いていこうと思う。
Azure Functions の今
まだプレビュー。いろいろとブログが出てきたのでご紹介しておく。
正直、BlobUpdateとManualのバインディングしか触ってないので、それ以外が増えてるかどうかあまり気にしていない。
新機能についてはやはりここ
【Azureなう 9/8号】Azure Functionsプレビューのアップデート
http://japan.zdnet.com/article/35088630/
MSのCSAの人が書いているブログ。基本的な内容はここでわかるぞ。
真壁さんもすごいのかいてる。
http://torumakabe.github.io/post/azurefunctions_getusagedata/
この間分かったこと
BlobトリガーでPathを設定するときに、”hoge/{filename}”とかするとhogeの下に何がアップデートされてもトリガーが起動する。ただしこの {filename} 、ドキュメントではあたかも関数内でとれるように表現されているが、現実的に取れたことがない。
環境変数にも入ってない。注意が必要だ。
input バインディングの後に加工したものを出力するoutputを作ることもできるが、その際に利用できるものとして思ったほうがよさそうだ。
複数のファイルをアップロードした場合、個別のblobごとにFuncitonは起動する。
いわゆるglobのような動作はしない。またリニアでなく、わりとパラレルに動いている。
またUpdateイベントは、アップロードに限らずファイル名変更でも発火する。
テスト時に少し便利だ。
VMのタグ付けを行っていたが、既存のタグを残すには、まずそれを取得しなきゃいかん。前回のサンプルのまま動かすと、タグはvulsだけ残ることになってしまう。
Vulsのアップデートに伴って行ったこと
結果をAzureのblobアップロードに対応してくれたのて、その環境に合わせてコードも書き直した。
vulsの実行
vuls scan -lang=ja -ignore-unscored-cves -report-azure-blob --azure-container "コンテナ名"
事前にストレージアカウントと、接続キーを環境変数にセットしておくことができる。
AZURE_STORAGE_ACCESS_KEY, AZURE_STORAGE_ACCOUNT
の二つだ。
なお、せっかく作ってもらったOptionalパラメータもリソースグループ名欄として活用している。
Functionsのコード
module.exports = function (context, myBlob) { context.log('--- Start!'); var ServerInfo = String(myBlob.ServerName).split('_'); //Optionalパラメータは、KeyとValueに分けても面倒なので、 //とりあえず値だけ先頭に突っ込んだ形。 context.log('ResourceGroup: ', myBlob.Optional[0][0]); context.log('VMName: ', myBlob.ServerName); var HighestScore = myBlob.KnownCves[0].CveDetail.Nvd.Score; context.log('HighestScore: ', HighestScore); var Level = "unKnown"; if( 7 <= HighestScore ){ Level = "High"; }else if( 4 <= HighestScore ){ Level = "Middle"; }else if( 0 <= HighestScore ){ Level = "Low"; } context.log('Level: ', Level); // Azure API Config. var clientId = '[clientId]'; var clientSecret = '[clientSecret]'; var tenant = '[tenant].onmicrosoft.com'; var subscriptionId = '[subscriptionId]'; var vm_Location = 'japanwest'; var ms_restAzure = require('ms-rest-azure'); ms_restAzure.loginWithServicePrincipalSecret(clientId, clientSecret, tenant, function(err, credentials) { if (err){ context.log('Error: ', err); }else{ var az_computeClient = require('azure-arm-compute'); var client = new az_computeClient(credentials, subscriptionId); //今のtagをとって、追記する。なければ作られる。 client.virtualMachines.get(myBlob.Optional[0][0], myBlob.ServerName, function (err, result) { if(err){ context.log('getVm Error: ', err); }else{ context.log('getVm --Success'); result.tags.vuls = Level; var param = { location: vm_Location, tags : result.tags }; client.virtualMachines.createOrUpdate(myBlob.Optional[0][0], myBlob.ServerName, param, function (err, result) { if(err){ context.log('updateVm Error: ', err); }else{ context.log('updateVM --Success'); } }); } }); } context.log("--- function Done."); context.done(); }); };
前回は リソースグループ名 _ VM名だったが、リソースグループ名を追加したことで、config.tomlがややマシになった。