はじめに
SSM change calendarを紹介するついでに、定時を過ぎたら作業ユーザーのIAMロールをReadOnlyに更新し、物理的に仕事をできなくすることで定時退社を促進する仕組みを作成してみました。
SSM change calendar とは?
運用ルールをカレンダー上で指定して、SSMやその他サービスと連携できるサービスです。
例えば「毎月第三営業日にSNSでメールを送信する」「毎週金曜日にメンテナンスのためのバッチを実行する」といったスケジュールが設定でき、コンソール上からカレンダーでわかりやすく確認が行えます。
EventBridgeでも一日一回決められた時間に実行、というようなスケジュールは行えますが、曜日の指定や、逆に「作業をしてはいけない時間」を定めることができるのはSSM change calendarならではの機能です。
より詳しい説明は下記公式サイトを参照ください。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-change-calendar.html
作成手順
簡単な紹介も終わったので、ここからは決められた時刻に作業ユーザーのIAMロールをReadOnlyに更新し、物理的に仕事をできなくする仕組みを作成していきます。
カレンダー作成
AWS Systems Managerのコンソールへアクセスし[カレンダーの変更]→[カレンダーを作成]を選択します。
下記の設定でカレンダーを作成します。
名前等は任意ですが、カレンダータイプは「デフォルトで閉じる」を設定してください。
カレンダーが無事作成できたら[イベントを作成]を選択します。
下記の設定でイベントを作成します。
今回はテストなので手動で日付を入力をしていますが、実際に構築をする際はカレンダー作成時にサードパーティのカレンダーファイルをインポートするほうが早いのでお試しください。
これで、毎日9:00-18:00のみステータスがOPENになるカレンダーが完成しました。
EventBridge 作成
カレンダーの状態に合わせたルールを作成します。
EventBridgeのコンソールから[ルール]→[ルールの作成]を選択します。
下記のイベントパターンでルールを作成します。
|
1 2 3 4 5 6 7 8 |
{ "source": ["aws.ssm"], "detail-type": ["Calendar State Change"], "resources": ["作成したカレンダーのarn"], "detail": { "state": ["OPEN", "CLOSED"] } } |
ターゲットは後程作成するLambdaを設定するので、この時点では設定していません。
Lambda 作成
Lamnda関数を作成し、トリガーとして先ほど作成したEventBridgeのルールを選択します。
関数の内容は以下の通りです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import boto3 iam = boto3.client("iam") admin_arn = "arn:aws:iam::aws:policy/AdministratorAccess" readonly_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess" develop_user = "対象ユーザー名" def lambda_handler(event, context): state = event.get("detail", {}).get("state", []) if state == "OPEN": change_policy(develop_user, admin_arn) print("始業時間なのでAdmin権限を付与しました。今日も一日頑張ろう!") return {"statusCode": 200, "body": "OK"} elif state == "CLOSED": change_policy(develop_user, readonly_arn) print("定時なのでReadOnly権限を付与しました。早く帰ろう!") return {"statusCode": 200, "body": "OK"} else: print(f"Unknown state: {state}") return {"statusCode": 400, "body": "NG"} def change_policy(user_name, target_policy_arn): attached = iam.list_attached_user_policies(UserName=user_name) for policy in attached.get("AttachedPolicies", []): iam.detach_user_policy(UserName=user_name, PolicyArn=policy["PolicyArn"]) iam.attach_user_policy(UserName=user_name, PolicyArn=target_policy_arn) |
作成後、先ほどのEventBridgeのルールのターゲットにこのLambdaを設定します。
関数の実行ロールには、デフォルトの権限に加えユーザーのIAMを変更できるポリシーとEventBridge関連のポリシーを付与しています。
動作確認
時間になると以下のようなイベントがLambdaあてに送信され、ユーザーのロールが更新されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ 'version': '0', 'id': 'イベントID', 'detail-type': 'Calendar State Change', 'source': 'aws.ssm', 'account': 'xxxxxxxxxxxx', 'time': '2025-09-01T04:00:00Z', 'region': 'ap-northeast-1', 'resources': [ 'カレンダーのARN' ], 'detail': { 'state': 'OPEN', 'atTime': '2025-09-01T04:00:00Z', 'nextTransitionTime': '2025-09-01T04:30:00Z', 'event': 'test' } }<code class="language-json"> |
きちんと動作したかはLambdaのログから確認できます。
おわりに
SSM change calendarはとても便利な機能ですが、あまり知名度がないように感じたので今回記事にしてみました。
使い方次第ではルーチンワークを減らせるかもしれないので、要件に合わせてぜひご活用ください。
投稿者プロフィール
- AWS の諸々について、初学者目線から書いていけたらいいなと思っています!










