はじめに
本記事では、CloudWatch Alarm からトリガーされたメトリクスのデータを Systems Manager Automation ランブック(ドキュメント)の入力として渡し、特定の AWS API を実行する手順を示します。
Systems Manager Automation は、Lambda の代替案として優秀であり、汎用性が高いです。
今回は、SageMaker Canvas のコスト最適化を目的として、Canvas の自動シャットダウンを対象とします。ただし、Canvas に限らず、他の多くのソリューションにも適用可能な手法です。
構成
CloudWatch Alarm → EventBridge → SSM Automation → SageMaker Canvas

SSM Automation ランブック
- コンソールにて、[AWS Systems Manager]→[ドキュメント]→[ドキュメントを作成]→[オートメーション]を選択
- [AWS API]から SageMaker の[DeleteApp]を選択

🌾 最初からコードを書くよりも、[デザイン]モードで型を作ってから、[{}コード]モードに切り替えるとコーディングが楽になります。
- [{}コード]を選択し、以下のように編集し、[ランブックを作成]を押下
- ランブックの名前は「ShutdownCanvas」
{
"schemaVersion": "0.3",
"description": "Shutdown Canvas",
"parameters": {
"domainid": {
"type": "String"
},
"userprofilename": {
"type": "String"
}
},
"mainSteps": [
{
"name": "DeleteApp_Canvas",
"action": "aws:executeAwsApi",
"maxAttempts": 2,
"timeoutSeconds": 300,
"isEnd": true,
"inputs": {
"Service": "sagemaker",
"Api": "DeleteApp",
"AppName": "default",
"AppType": "Canvas",
"DomainId": "{{domainid}}",
"UserProfileName": "{{userprofilename}}"
}
}
]
}
- ここで、以下の API 入力データの一部をパラメータとして設定しておきます。
- DomainId
- UserProfileName
🌾 ここで設定した parameters に EventBridge から値を渡す方法を後述します。
CloudWatch Alarm
- CloudWatch を開き、SageMaker Canvas のアイドル時間に対して、アラームを設定
- 名前空間:/aws/sagemaker/Canvas/AppActivity
- メトリクス名:TimeSinceLastActive
- DomainId:d-4tbpmqlp00h6
- UserProfileName:default-20250317T145464
- アクション:なし
- 条件:TimeSinceLastActive > 1000
🌾 Canvas が1000秒以上アイドル状態のとき、アラートがトリガーします。


EventBridge 用の IAM ロール
- IAM のコンソールから、EventBridge の実行ロールのために、SageMaker へのアクセスと SSM Automation へのアクセスを許可した IAM ロールを事前に作成します。
- ロールの名前は「EventBridge-SageMaker-Canvas-Role」

- ロールの名前は「EventBridge-SageMaker-Canvas-Role」
🌾 場合によって、iam:PassRole を[許可を追加]からインラインポリシーで追加する必要があります。今回の場合は追加せずに成功したため、このままにします。
- ロールの[信頼関係]を開き、Service の部分を編集して SSM がロールを引き受けられるように設定
参考:EventBridge イベントに基づくオートメーションを実行する
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"sagemaker.amazonaws.com",
"events.amazonaws.com",
"ssm.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
🌾 EventBridge のルールではなく、EventBridge Scheduler を使用する場合、「events.amazonaws.com」 ではなく、「scheduler.events.amazonaws.com」とする必要があります。
EventBridge ルールの作成
- EventBridge のコンソールからルールを作成します。
- イベントパターンを設定(カスタムパターン)
- CloudWatch Alarm を検知するように設定
{
"source": ["aws.cloudwatch"],
"detail-type": ["CloudWatch Alarm State Change"],
"detail": {
"alarmName": ["canvas-idle-shutdown-SM"],
"state": {
"value": ["ALARM"]
}
}
}
- ターゲットを設定
- 「Systems Manager オートメーション」を選択
- [ドキュメント]に「ShutdownCanvas」(事前作成済みのランブック)を選択
- [自動化パラメータを設定]に「入力トランスフォーマー」を選択

参考:
入力トランスフォーマーを使用したオートメーションへのデータの受け渡し
Amazon EventBridge 入力変換
iret.media:EventBridge入力トランスフォーマーを使ってメールをカスタマイズ
- 入力パスを以下に設定
[Input Path] (入力パス) は、変数を定義するために使用されます。JSON パスを使用してイベント内の項目を参照し、それらの値を変数に格納します。
{
"dmid": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.DomainId",
"upname": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.UserProfileName"
}
🌾 EventBridge が読み取っているイベント(JSON)のパスを指定して値を取得します。以下のドキュメントや EventBridge コンソールからサンプルイベントを確認できます。
参考:アラームイベントと EventBridge
- 入力テンプレートを以下に設定
- ここでは、入力パスで取得したデータを以下のように参照できます。
入力テンプレートは、ターゲットに渡す情報のテンプレートです。文字列または JSON をターゲットに渡すテンプレートを作成できます。
{
"domainid":[<dmid>],
"userprofilename":[<upname>]
}
🌾 半角スペースなど入れないように注意してください。 domainid や userprofilename は SSM のランブックで設定したパラメータ名と一致させなければなりません。
- [実行ロール]に事前に作成した IAM ロール「EventBridge-SageMaker-Canvas-Role」を選択し、最後まで進み、[ルールの作成]を押下
🌾 以上の設定により、EventBridge はトリガーされたアラートのメトリクス情報を取得し、その値を SSM Automation に入力しつつ実行することができます。
検証
- SageMaker AI で Canvas を起動して放置(アイドル状態にしておく)します。

- しばらく待つと、CloudWatch Alarm がトリガーします。

- Canvas のステータスが[Stopped]に変わります。

- Systems Manager Automation を開いて実行を確認します。

- Input parameters を開くと、EventBridge からメトリクスのデータを渡すことができています。

🌾 これにより、複数のドメイン名・ユーザプロファイルに対して、一つの EventBridge ルールと一つのランブックで自動シャットダウンができます。すなわち、ドメインやユーザが増減しても、CloudWatch Alarm だけを変更すれば良いです。ただし、イベントパターン(イベントのフィルタリング)に正規表現などを使って工夫が必要となります。
おわりに 〜SSM Automation のメリット〜
🌾 今回実施した SageMaker Canvas のシャットダウンは、CloudWatch Alarm アクション→ Lambda の方法でも同様に実現可能で、実際 AWS から推奨されています。
参考:自動シャットダウンソリューションを使ってAmazon SageMaker Canvas のコストを最適化する方法
ただし、以下のような理由から代替の選択肢として有用と考えています。
- Lambda には、言語依存(EOLなど)がある
- Lambda よりもランブックの方がコーディングが楽である
- 連続した AWS の操作・複雑なワークフローを簡単にランブックにできる
- Lambdaの実行時間の制限を回避できる