AWS Systems Manager Automation ランブックをGUIで直感的に作成する #OpsJAWS

AWS

2024.5.15

Topics

はじめに

こんにちは、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 valuesInstanceIds の 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に関するお役立ち情報を配信中!

YUJI

2023年9月に入社 邦ロックとVtuber好き

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら