Amazon CloudWatchとAWS Lambdaを使ってinsightwatchの定期セキュリティチェック実行環境を作ってみた
はじめに
こんにちは。shoitoです。
先日リリースされたinsightwatch v2.8からセキュリティチェックを外部から実行できるようになりました。
定期的にAWS環境のセキュリティチェックをしよう -insightwatch v2.8 リリースのお知らせ-
これで何が嬉しいのかと言うと、サービスにログインしてチェック実行ボタンを押下する必要がないので、スケジューラーと組み合わせれば、定期的にセキュリティチェックが実行できるようになります。
「あれ?前回のチェックっていつしたっけ?(実は2ヶ月前でした)」
「週明けに久しぶりにチェックしとこうかな(週末楽しくて忘れちゃう)」
と忘れてしまうのを防げます。
定期健康診断で病気の予防や発見ができるように、セキュリティチェックも定期的にして変化に気付けると安心です。
ユーザーガイドを参考に環境を構築してみた
今回構築した環境は、クラスメソッドメンバーズ限定に提供中のCloudFormationテンプレートで作成されるこちらの図を参考にしています。
ドキュメント > 定期的なチェック実行環境に関する設定(クラスメソッドメンバーズ限定) > CloudFormationテンプレートで作成されるAWSリソースより。 https://insightwatch.zendesk.com/hc/ja/articles/360026800971
AWSリソースは、チェック実行用URLへリクエストするAWS Lambdaと、そのLambdaを定期実行するAmazon CloudWatchイベントの2つで構成します。
1. インサイトウォッチのチェック実行用URLの発行
事前にチェック実行用URLをインサイトウォッチから発行します。
ドキュメント > ユーザーガイド > 外部連携設定 https://insightwatch.zendesk.com/hc/ja/articles/360026377992
ログイン後、ユーザーメニューにある「外部連携設定」を選択します。
設定画面からチェック実行対象にする「プロジェクト」を選択後、「URLを作成する」ボタンを選択し、URLを発行します。
なお、このURLは後で使います。
2. チェック実行用URLへリクエストするAWS Lambda
チェック実行用URLに対して、HTTTP POSTリクエストを送る必要があるため、まずは、AWSマネジメントコンソールからLambda関数の作成をします。
関数名は何でもかまいませんがここでは「InsightwatchCheckExecutor」とし、ランタイムに「Python 3.7」、アクセス権限はデフォルトとします。
最後に、チェック実行用URLにHTTP POSTリクエストを送るだけの手短なコードを準備します。
import urllib.request url = '1.で発行したURL' def lambda_handler(event, context): req = urllib.request.Request(url, headers={'Content-Type': 'application/json'}, method='POST') with urllib.request.urlopen(req) as res: print(res.read().decode('utf-8'))
3. Lambdaを定期実行するためのAmazon CloudWatchイベントルール
上記で作成したLambda関数をスケジュールに従って実行するために、Amazon CloudWatchからイベントルールを作成します。
今回は日本時間の毎週月曜9時30分にチェック実行をしたいため、イベントソースには「スケジュール」、Cron式は「30 0 ? * MON *」を指定し、ターゲットには作成したLambda関数を選択します(UTCのため0時30分と指定しています)。
次に、ルールの詳細として適当なルール名と説明を入力して、「ルールの作成」を選択します。
さいごに定期チェック実行を確認してみる
構築が終わったのでチェック実行を確認してみました。
確認のため、月曜9時30分までは待てないので、CloudWatchイベントルールのスケジュールは調整してあります。
インサイトウォッチの「チェック履歴」画面を開くと、確かにチェック実行待ち状態に1件履歴が追加されています。
これで、毎週月曜や月初のようなタイミングでチェック実行を定期的にできます。
人は忘れる生き物なので、こういう自動化は大事ですね。