Edited at

3ヶ月使ってないWorkspacesを通知と自動削除をやろうとしてみた(失敗)


3ヶ月使ってないWorkspacesは、不要とみなして通知して削除する

(注意)やろうとしたけど出来なかった。。Alarmのデータポイントが24時間以内しか入らないです。

スクリーンショット 0030-09-12 18.32.10.png


  • 通知のためのSNSトピック作成

  • 監視のためのCloudWatch Alarm作成

  • 3ヶ月の監視について

  • Workspacesの自動削除のLambda作成

  • 通知と自動削除のテスト


通知のためのSNSトピック作成。

SNSの画面から、左メニューの"トピック"をクリックし[新しいトピックの作成]をクリックする

スクリーンショット 0030-09-12 11.20.27.png

任意のトピック名を入力する

ここでは、test-nonused-ws

スクリーンショット 0030-09-12 11.20.49.png

作成したトピック名をクリック

スクリーンショット 0030-09-12 11.21.12.png

[サブスクリプションの作成]をクリック

スクリーンショット 0030-09-12 11.21.22.png

通知のためのメールアドレスを入力する

プロトコル:Email

エンドポイント:任意のメアド

スクリーンショット 0030-09-12 11.21.38.png

Confirmedメールが送られてくるので、メール内のリンクをクリックしConfirmする。


監視のためのCloudWatch Alarm作成

Cloudwachの画面を開き、左側メニューの"メトリクス"をクリックし、対象のWorkspacesIDの"UserConnected"メトリクスにチェックを入れる。

(補足)

UserConnectedは、ユーザーが接続しているWorkspacesの数

WorkSpacesは定期的に接続ステータスのリクエストを WorkSpace に送信します。ユーザーは、能動的にセッションを使用している場合、接続済みとしてレポートされます。このメトリクスは WorkSpace の粒度で利用でき、組織のすべての WorkSpace で集計されます

https://docs.aws.amazon.com/workspaces/latest/adminguide/amazon-workspaces-monitoring.html

スクリーンショット 0030-09-12 11.23.45.png

グラフのオプションタブをクリック、userconnectedの右側のベルマークをクリック

スクリーンショット 0030-09-12 11.24.12.png

アラームの設定を行う

※ちょっと3ヶ月は試せないので15分で


  • アクションはSNSによるメール通知

  • UserConnectedは"1"だとConnected、"0"だとNonConnected

  • しきい値はUserConnected<1にする

  • 5分間隔で、3回連続でしきい値を下回ったらアクションを実施。つまりユーザーの接続が15分間なかった場合にアラームが通知される

スクリーンショット 0030-09-12 11.25.00.png

アラームがOKな時

つまりWorkspacesを使っている状態(15分以上NonUsedではない)

スクリーンショット 0030-09-12 11.25.31.png

アラームがNGな時

つまりWorkspacesを15分以上使ってない状態

スクリーンショット 0030-09-12 11.50.38.png

通知メール

スクリーンショット 0030-09-12 11.54.41.png


3ヶ月の監視について

アラームのデータポイントは最大9999です。3ヶ月間使われてない状態を検知するには5分インターバルではデータポイント数が足りません。

スクリーンショット 0030-09-12 11.57.05.png

最小で13分くらいにする必要があるので、15分間隔にします。

3ヶ月は、3ヶ月*30日*24時間*60分 = 129600分あるので、

これを15分で割ると、8640

データポイント 8640回連続でしきい値を下回ったらアラートを飛ばすという設定でよさそうです。

スクリーンショット 0030-09-12 12.02.54.png


Workspacesの自動削除のLambda作成


LambdaにアタッチするIAMロール作成

IAMの画面で、左側メニューのロールをクリックし、[ロールの作成]をクリックする

スクリーンショット 0030-09-12 13.47.41.png

"AWSサービス"をクリック、"Lambda"をクリック、[次のステップ]をクリックする

スクリーンショット 0030-09-12 13.47.54.png

以下のポリシーにチェックを入れ、[次のステップ]をクリックする


  • AmazonWorkSpacesAdmin

  • CloudWatchLogsFullAccess

スクリーンショット 0030-09-12 13.48.15.png

ロール名をつけて[ロールの作成]をクリックする

test-terminate-ws1(任意)

スクリーンショット 0030-09-12 16.47.47.png


Lambda関数作成

WorkspacesのTerminateWorkspacesのAPIを叩くコードを書く

https://docs.aws.amazon.com/ja_jp/workspaces/latest/api/API_TerminateWorkspaces.html

Lambdaの画面を開き、[関数の作成]をクリック

スクリーンショット 0030-09-12 13.48.56.png

"一から作成"をクリックし、以下を入力し、[関数の作成]をクリックする

名前:test-terminate-ws1

ランタイム:Python 2.7

既存のロール:test-terminate-ws1

スクリーンショット 0030-09-12 17.05.36.png

左側リストから"SNS"をクリック

スクリーンショット 0030-09-12 17.09.45.png

SNSトピック"test-nonused-ws"を選び、"トリガーの有効化"にチェックを入れ、[追加]をクリックする

スクリーンショット 0030-09-12 17.10.22.png

"test-terminate-ws1"のLambdaアイコンをクリック

スクリーンショット 0030-09-12 17.45.58.png

以下のコードを貼り付けて、右上の[保存]をクリック

(注)今回はテストとしてterminateではなく、stopにしています。アラームも1回しきい値を下回ったらにしてあります。

削除であれば、client.terminate_workspaces

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/workspaces.html#WorkSpaces.Client.terminate_workspaces

from __future__ import print_function

import json
import urllib
import boto3

print('Loading function')

client = boto3.client('workspaces')

def lambda_handler(event, context):
message = event['Records'][0]['Sns']['Message']
message = json.loads(message)

workspaceId = message['Trigger']['Dimensions'][0]['value']
stop = client.stop_workspaces(
StopWorkspaceRequests=[
{
'WorkspaceId': workspaceId
},
]
)
return stop

スクリーンショット 0030-09-12 17.46.22.png


通知と自動削除のテスト

Workspacesからログアウトします。Workspacesクライアントを閉じます。

数分するとアラームが上がります。

スクリーンショット 0030-09-12 17.56.45.png

対象のWorkspacesがStoppedになりました。

スクリーンショット 0030-09-12 17.57.36.png