AWS Systems Manager Automation ランブックをGUIで直感的に作成する #OpsJAWS
はじめに
こんにちは、YUJIです。
先日、初めてJAWS-UGのイベントにオフラインで参加してきました。
【会場開催】OpsJAWS Meetup#28 初級者向け AWS Systems Manager ハンズオン
https://opsjaws.doorkeeper.jp/events/171213※現在、OpsJAWSの運営はdoorkeeperからconnpassに移行されています。
https://opsjaws.connpass.com/
とても楽しかったです。
ハンズオンが主ということもあり、あっという間に時間が過ぎていました。
ハンズオン中、AWS Systems Manager AutomationのランブックをGUIで作成するチャプターがあり
とても興味深い内容だったので、自分の中での咀嚼も兼ねて
・GUIを用いてのランブックの作成
・Automationの実行
について、ハンズオン手順をなぞりながら、当日に覚えた事を再確認してみようと思います。
ハンズオン所要時間の目安:
20-30分
本記事にて引用するハンズオン手順
https://github.com/YoshiiRyo1/systemsmanager-handson/
※GitHub手順を参照しながらハンズオンを行う際は、mainブランチの内容が表示されていることを確認してください
概要
まず、Automationとは?
AWS Systems Manager Automation は、AWS Systems Manager の一部で
定常的な運用タスクの自動化を支援するサービスです。
インフラストラクチャの変更やアップデートの自動化、設定の適用、その他のルーチンタスクの実行を自動化するプロセスを構築できます。
これにより、ヒューマンエラーのリスクが低減され、効率が向上します。
AWS Systems Manager Automation
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-automation.html
要するに……?
単純作業って多いと疲弊しますし
人間が操作するものって、どうしても事故のリスクが発生しますよね。
AWS Systems Manager Automationを活用して、なるべく自動化してしまいましょう!
ハンズオン(事前準備)
本記事では、事前準備パートは簡易的に記載します。
もし詰まってしまう場合は、下記GitHubリンクの手順をなぞりながら
EC2とサービスロールを作成すると確実です。
Systems Manager ハンズオンセットアップ
https://github.com/YoshiiRyo1/systemsmanager-handson/blob/main/chapter01.md
Automation を使った運用自動化
https://github.com/YoshiiRyo1/systemsmanager-handson/blob/main/chapter05.md
EC2
AmazonSSMManagedInstanceCoreのIAMポリシーが付いたEC2用のIAMロールを用意し
そのロールがアタッチされたEC2を作成します。
インスタンスタイプは、t3.microにしておきます。
(Automationによって、t2.microに変更します。)
正常にSSMが動作しない方は下記に当てはまらないか確認してみてください。
・SSMエージェントが起動していない or バージョンが古い
・443ポートのアウトバウンド通信が制限されている
・(対象インスタンスをプライベートサブネットで建てている場合)NAT gateway もしくは VPCエンドポイントが存在していない
サービスロール
Automation側が使用するIAMロールを準備します。
カスタマー管理ポリシー名・ロール名は任意で問題ありません。
付与するポリシー
1.AWS管理ポリシー:AmazonSSMAutomationRole
2.下記のポリシーを記載したカスタマー管理ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": "*",
"Action": "ec2:ModifyInstanceAttribute"
}
]
}
■用意したロール

ハンズオン(Automation)
Systems Managerのコンソール画面から、[オートメーション]を開き
Create runbookをクリックします。

まずはランブック名を編集します。
デフォルトの『NewRunbook』でも問題はないですが、なるべく一意で分かりやすい名前をつけておきます。

変数の定義
右側ペインの ランブック属性 から パラメータ タブを開きます。
以下の4つのパラメータを追加します。
| パラメータ名 | タイプ | 必須 | デフォルト値(オプション) | 説明(オプション) |
|---|---|---|---|---|
| InstanceId | String | Yes | (※必須がNOのみの項目) | The Id of the instance |
| InstanceType | String | Yes | (※必須がNOのみの項目) | The desired instance type |
| AutomationAssumeRole | String | No | The ARN of the role that allows Automation to perform the actions on your behalf. | |
| SleepWait | String | No | PT5S | The desired wait time before starting instance |
↓こんな感じでコピペしていきます。

属性
[ランブック属性] から、属性タブを開き
Assume role 欄に {{AutomationAssumeRole}} と入力します。

Q.この{{AutomationAssumeRole}} の意図って何?
A.オートメーションが引き受けるIAMロールを変数にしておいて、後で指定できるようにしています。
ステップ1
左側ペインの アクション タブの リソース管理 欄にある プロパティをアサートします をマウスでキャンバスにドロップします。

ステップ名 を assertInstanceType に変更します。

インプット タブを開いて、以下のように入力します。
| 設定項目 | 入力値 |
|---|---|
| Service | EC2 |
| API | DescribeInstances |
| Property selector | $.Reservations[0].Instances[0].InstanceType |
| Desired values | - '{{InstanceType}}' |
| InstanceIds | - '{{InstanceId}}' |
InstanceIds は その他の入力 から追加してください。
Desired values、InstanceIds の value はドロップダウンリストから選択すると配列形式とならないので
必ず - を入れて配列形式で指定してください。
以降、青色でプルダウンの操作不要と書いている所も、同様の理由です。


ステップ2
アクション タブの リソース管理 欄にある インスタンスの状態を変更します を
前の手順の AssertAWSResourceProperty の下に繋げて

ステップ名 を stopInstance に変更し
インプット タブを開き、以下のように入力します。
| 設定項目 | 入力値 |
|---|---|
| InstanceIds | - '{{InstanceId}}' |
| DesiredState | stopped |

ステップ3
AWS APIs タブの Amazon EC2 欄にある Amazon EC2 ModifyInstanceAttribute を
前の手順の stopInstance の下に繋げて
ステップ名 を resizeInstance に変更し
インプット タブを開き、以下のように入力します。
| 設定項目 | 入力値 |
|---|---|
| InstanceId | {{InstanceId}} |
| InstanceType | Value: - '{{InstanceType}}' |

ステップ4
アクション タブの フロー 欄にある スリープ をマウスでキャンバスにドロップします。
前の手順の resizeInstance の下に繋げて
ステップ名 を wait に変更し
インプット タブを開き、以下のように入力します。
| 設定項目 | 入力値 |
|---|---|
| Duration | {{SleepWait}} |

余談:変数[SleepWait]のPT5S は何者か
この変数を使用したアクション、aws:sleep(今回のステップ名:wait)は
指定した時間だけディレイを設ける役割があります。[1]
インスタンスタイプの変更の直後、即時でインスタンスを起動する形にしてしまうと、整合性が保てない可能性があるので
リサイズ後のインスタンス起動までに、5秒間遅延を持たせるよう設定した。
と解釈しています。
PT5S自体が何かというと、ISO8601に準拠した時間の記法との事です。
P(period:期間を表す記号)T5S(5秒)
ここの値を変えることで、Automationがタイムアウトしない範囲であれば、何時間・何分 など指定することも可能です。
本記事では詳細な解説はいたしませんが、気になった方は 『ISO8601 継続時間』で調べてみると分かりやすいかと思います!
[1]aws:sleep – オートメーションを遅らせる
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-sleep.html
ステップ5
アクション タブの リソース管理 欄にある インスタンスの状態を変更します をマウスでキャンバスにドロップします。
前の手順の wait の下に繋げて
ステップ名 を startInstance に変更し
インプット タブを開き、以下のように入力します
| 設定項目 | 入力値 |
|---|---|
| InstanceIds | - '{{InstanceId}}' |
| DesiredState | running |

ステップ6
ステップ1の AssertAWSResourceProperty をクリックします。
設定 タブを開きます。
以下のように入力します。
| 設定項目 | 入力値 |
|---|---|
| 失敗した場合 | stopInstance |
| クリティカル | false |
| 次のステップ | 最後へ移動 |

完成形
デザイン画面の上部にある コード をクリックし
コード (yaml) が以下の通りかどうかを比べてみましょう。
誤りがある場合は、手順を見直して修正するか、下記のコードを直接ペーストしても問題ありません。
schemaVersion: '0.3'
description: '*このデフォルトのテキストをランブックに関する指示や他の情報に置き換えてください。* --- # Markdown とは何ですか? Markdown とは、プレーンテキスト形式のコンテンツを、構造的に有効なリッチテキストに変換する軽量のマークアップ言語です。## 見出しを追加できます *斜体*を追加したり、フォントを**太字**にしたりできます。1. 番号付きリストを作成する * 箇条書きを追加する > `コードサンプル`にインデントを設定する [別のウェブページへのリンク](https://aws.amazon.com) を作成できます。'
parameters:
InstanceId:
type: String
description: The Id of the instance
InstanceType:
type: String
description: The desired instance type
AutomationAssumeRole:
type: String
default: ''
description: The ARN of the role that allows Automation to perform the actions on your behalf.
SleepWait:
type: String
default: PT5S
description: The desired wait time before starting instance
assumeRole: '{{AutomationAssumeRole}}'
mainSteps:
- name: assertInstanceType
action: aws:assertAwsResourceProperty
isCritical: false
isEnd: true
onFailure: step:stopInstance
inputs:
Service: ec2
Api: DescribeInstances
PropertySelector: $.Reservations[0].Instances[0].InstanceType
DesiredValues:
- '{{InstanceType}}'
InstanceIds:
- '{{InstanceId}}'
- name: stopInstance
action: aws:changeInstanceState
nextStep: resizeInstance
isEnd: false
inputs:
InstanceIds:
- '{{InstanceId}}'
DesiredState: stopped
- name: resizeInstance
action: aws:executeAwsApi
nextStep: wait
isEnd: false
inputs:
Service: ec2
Api: ModifyInstanceAttribute
InstanceId: '{{InstanceId}}'
InstanceType:
Value: '{{InstanceType}}'
- name: wait
action: aws:sleep
nextStep: startInstance
isEnd: false
inputs:
Duration: '{{SleepWait}}'
- name: startInstance
action: aws:changeInstanceState
isEnd: true
inputs:
InstanceIds:
- '{{InstanceId}}'
DesiredState: running

保存と実行
右上にある ランブックを作成 をクリックします。

作成したドキュメントは、AWS Systems Manager の左ペインから ドキュメント を選択し、自己所有タブを開いたところに保存されています。

ドキュメントをクリックして
右上にある オートメーションを実行する をクリックします。

Input parameters に以下を入力します。
| 設定項目 | 入力値 |
|---|---|
| InstanceId | ハンズオン用EC2を選択 |
| InstanceType | t2.micro |
| AutomationAssumeRole | 事前準備で用意したサービスロールを選択 |
| SleepWait | PT5S |

Excute をクリックし、しばらく待ってAutomationの実行を確認します。
ステップ1の assertInstanceType は失敗します。それ以外のステップが成功したことを確認できればOKです。

失敗している場合は、個々のステップからエラー内容を確認できます。
自分はサービスロールを手で作った際、ポリシーのつけ忘れで権限エラーになるというのを2回やりました。
成功した場合は、対象のEC2がt2.microに変更された事を確認できると思います。

これでAutomationのハンズオンは完了です。
なぞった方はお疲れ様でした。
まとめ
OpsJAWSで学んだAWS Systems Managerハンズオンのうち、Automation部分のチャプターを自分なりに解釈しながらお伝えしてみました。
従来のYAMLによる設定も良いですが、GUIで直感的に作れるとよりイメージしやすいので助かりますね!
学習の余地として
例えばAWS基盤側のキャパシティ不足(InsufficientInstanceCapacity)で、変更後のインスタンスタイプのEC2が用意できなかった場合
どうステップと分岐を組めば、切り戻しや再試行を全自動で完結できるか?など
まだまだ学べる所は多そうなので、いろいろ試行してみようと思います。
今回の記事が参考になれば幸いです。
最後まで読んでいただき、ありがとうございました。 🙂
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter2025 AWS Community Builder / 2024 Japan AWS All Certifications Engineer
Recommends
こちらもおすすめ
-
「ちょっと知ってる営業」が語る、AWSの地味なアップデートが「一番怖い」という話
2018.12.24
-
JAWS FESTA 2018レポート 亀田さんの基調講演 #jft2018
2018.11.7
-
AWS CodePipelineのエラーを検知し、Backlog自動起票する手順
2023.12.20
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16
