3ヶ月使ってないWorkspacesは、不要とみなして通知して削除する
(注意)やろうとしたけど出来なかった。。Alarmのデータポイントが24時間以内しか入らないです。

- 通知のためのSNSトピック作成
- 監視のためのCloudWatch Alarm作成
- 3ヶ月の監視について
- Workspacesの自動削除のLambda作成
- 通知と自動削除のテスト
通知のためのSNSトピック作成。
SNSの画面から、左メニューの"トピック"をクリックし[新しいトピックの作成]をクリックする

任意のトピック名を入力する
ここでは、test-nonused-ws

作成したトピック名をクリック
[サブスクリプションの作成]をクリック
通知のためのメールアドレスを入力する
プロトコル:Email
エンドポイント:任意のメアド
Confirmedメールが送られてくるので、メール内のリンクをクリックしConfirmする。
監視のためのCloudWatch Alarm作成
Cloudwachの画面を開き、左側メニューの"メトリクス"をクリックし、対象のWorkspacesIDの"UserConnected"メトリクスにチェックを入れる。
(補足)
UserConnectedは、ユーザーが接続しているWorkspacesの数
WorkSpacesは定期的に接続ステータスのリクエストを WorkSpace に送信します。ユーザーは、能動的にセッションを使用している場合、接続済みとしてレポートされます。このメトリクスは WorkSpace の粒度で利用でき、組織のすべての WorkSpace で集計されます
グラフのオプションタブをクリック、userconnectedの右側のベルマークをクリック
アラームの設定を行う
※ちょっと3ヶ月は試せないので15分で
- アクションはSNSによるメール通知
- UserConnectedは"1"だとConnected、"0"だとNonConnected
- しきい値はUserConnected<1にする
- 5分間隔で、3回連続でしきい値を下回ったらアクションを実施。つまりユーザーの接続が15分間なかった場合にアラームが通知される
アラームがOKな時
つまりWorkspacesを使っている状態(15分以上NonUsedではない)

アラームがNGな時
つまりWorkspacesを15分以上使ってない状態
通知メール
3ヶ月の監視について
アラームのデータポイントは最大9999です。3ヶ月間使われてない状態を検知するには5分インターバルではデータポイント数が足りません。

最小で13分くらいにする必要があるので、15分間隔にします。
3ヶ月は、3ヶ月30日24時間*60分 = 129600分あるので、
これを15分で割ると、8640
データポイント 8640回連続でしきい値を下回ったらアラートを飛ばすという設定でよさそうです。

Workspacesの自動削除のLambda作成
LambdaにアタッチするIAMロール作成
IAMの画面で、左側メニューのロールをクリックし、[ロールの作成]をクリックする
"AWSサービス"をクリック、"Lambda"をクリック、[次のステップ]をクリックする

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

ロール名をつけて[ロールの作成]をクリックする
test-terminate-ws1(任意)

Lambda関数作成
WorkspacesのTerminateWorkspacesのAPIを叩くコードを書く
Lambdaの画面を開き、[関数の作成]をクリック

"一から作成"をクリックし、以下を入力し、[関数の作成]をクリックする
名前:test-terminate-ws1
ランタイム:Python 2.7
既存のロール:test-terminate-ws1

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

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

以下のコードを貼り付けて、右上の[保存]をクリック
(注)今回はテストとして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

通知と自動削除のテスト
Workspacesからログアウトします。Workspacesクライアントを閉じます。
数分するとアラームが上がります。

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