Amazon Web Services ブログ

AWS Systems Manager の新しいオートメーション機能

本日、AWS Systems Manager 内で追加された自動化機能を発表します。Systems Manager をまだ使用していない方のために説明すると、本サービスは統合されたユーザーインターフェイスを提供するため、複数の AWS サービスから運用データを表示し、AWS リソース全体の運用タスクを自動化できます。

この新しいリリースで、さらに強力になりました。AWS Systems Manager に追加機能を追加しました。これにより、チーム内または組織内の他のユーザーと自動化を構築、実行、共有できるため、インフラストラクチャの管理を繰り返すのがより簡単になり、エラーが発生しにくくなります。

ナビゲーションメニューの AWS Systems Manager コンソール内には、オートメーションという項目があり、このメニュー項目をクリックするとオートメーションを実行ボタンが表示されます。

これをクリックすると、実行するドキュメントを尋ねられます。AWS では、選択可能なドキュメントのライブラリを提供しますが、今日は独自のドキュメントを作成するため、ドキュメントを作成ボタンをクリックします。

これにより、新しい画面が表示され、Python または PowerShell スクリプトを実行するドキュメント (オートメーションプレイブックとも呼ぶ) を作成できます。

コンソールには、ドキュメントを編集するための 2 つのオプションがあります。YAML エディタまたはガイド付きの段階的なユーザーインターフェイスを提供する「ビルダー」ツールで、各ワークフローステップのドキュメントを含めることができます。

それでは、簡単なオートメーションを構築して実行してみましょう。ビルダーツールを使用してドキュメントを作成する場合、最初に必要なのはドキュメント名です。

次に、説明を入力する必要があります。以下に示すように、Markdown を使用して説明の書式を設定できます。説明は、ドキュメントの機能を説明する絶好の機会です。ほとんどのユーザーは、これらのドキュメントをチームの他のユーザーと共有し、日常の問題を解決するためのドキュメントライブラリを構築したいと思っています。

オプションで、ドキュメントのパラメータを指定するように求められます。これらのパラメータは、後で作成するすべてのスクリプトで使用できます。この例では、3 つのパラメータ imageIdtagValueinstanceType を作成しました。このドキュメントを実行するときに、設定したデフォルトを上書きするこれらのパラメータの値を提供する機会があります。

誰かが私のドキュメントを実行すると、実行されるスクリプトは AWS サービスと対話します。ドキュメントは、Assume ロールを提供するオプションとともに、ほとんどのアクションに対するユーザー権限を使用して実行されます。ただし、スクリプトを実行する操作を含むドキュメントの場合、スクリプトが AWS API を呼び出すときにロールが必要です。

ビルダーツールで、Assume ロールをグローバルに設定できます。ただし、ドキュメントに assumeRole というパラメータを追加したいので、それを実行している人であれば誰でも別のパラメータを提供できます。

次に、Assume ロールプロパティのテキストボックスで {{assumeRole}} 構文を使用して、このパラメータをグローバルに assumeRole に結び付けます (パラメータ名 assumeRole を呼び出しましたが、好きな名前を付けることができます)。パラメータに付ける名前が二重括弧構文で指定されていることを確認してください (例: {{yourParamName}})。

ドキュメントを設定したら、ドキュメントの最初の手順を作成する必要があります。ドキュメントには手順を 1 つ以上含めることができます。パラメータやステップの失敗などに基づいて、分岐を使用した高度なワークフローを作成できます。それでも、この例では、次々に実行する 3 つの手順を作成します。繰り返しますが、手順には名前と説明を付ける必要があります。この説明にはマークダウンを含めることもできます。操作タイプを選択する必要があります。この例では、スクリプトを実行を選択します。

「スクリプトを実行」の操作タイプを使用すると、スクリプトを実行するためのインフラストラクチャを必要とせずに、Python または PowerShell でスクリプトを実行できます。このスクリプトが EC2 インスタンスの 1 つで実行されないことを認識してください。スクリプトはマネージドコンピューティング環境で実行されます。基本設定ページで Amazon CloudWatch ロググループを設定して、選択した CloudWatch ロググループに出力を送信できます。

このデモでは、EC2 インスタンスを作成する Python をいくつか作成します。このスクリプトが AWS SDK for Python を使用していることにお気付きになるでしょう。スクリプトにパラメータとして渡される image_idtag_valueinstance_type に基づいてインスタンスを作成します。

スクリプトにパラメータを渡すには、追加入力セクションで、入力タイプとして [InputPayload] を選択します。次に、[値を入力] テキストボックスで特定の YAML 形式を使用して、グローバルパラメータをスクリプトで使用するパラメータに結び付けます。繰り返しになりますが、二重括弧構文を使用してグローバルパラメータを参照していることがわかります。例: {{imageId}}

出力セクションでは、後続の手順で使用できる出力パラメータを接続します。

次に、ドキュメントに 2 番目の手順を追加します。今回は、インスタンスをポーリングして、そのステータスが ok に切り替わったかどうかを確認します。このコードの面白いところは InstanceId で、前の手順からスクリプトに渡されるということです。これは、以前の手順の出力を使用するために実行手順をチェーン化する方法の例です。

def poll_instance(events, context):
    import boto3
    import time

    ec2 = boto3.client('ec2')

    instance_id = events['InstanceId']

    print('[INFO] Waiting for instance to enter Status: Ok', instance_id)

    instance_status = "null"

    while True:
    res = ec2.describe_instance_status(InstanceIds=[instance_id])

    if len(res['InstanceStatuses']) == 0:
        print("Instance Status Info is not available yet")
        time.sleep(5)
        continue

    instance_status = res['InstanceStatuses'][0]['InstanceStatus']['Status']

    print('[INFO] Polling get status of the instance', instance_status)

    if instance_status == 'ok':
        break

    time.sleep(10)

    return {'Status': instance_status, 'InstanceId': instance_id}

パラメーターを 2 番目の手順に渡すには、二重括弧構文を使用して前の手順の出力を参照することにご注意ください。[値を入力] テキストボックス {{launchEc2Instance.payload}} の値は、手順 launchEc2Instance の名前であり、出力パラメータ payload の名前です。

最後に、最終手順を追加します。この手順では、PowerShell スクリプトを実行し、AWS Tools for PowerShell を使用します。純粋に Python の代わりに PowerShell を使用できることを示すために、この手順を追加しました。

最初の行で、AWSPowerShell.NetCore モジュールをインストールし、AWS サービスとの対話を開始する前に -Force スイッチを使用する必要があることにご注意ください。

この手順では、LaunchEc2Instance 手順から InstanceId 出力を取得し、それを使用して ECS インスタンスの InstanceType を返します。

以前に行ったのと同じ方法で追加入力を設定して、LaunchEc2Instance 手順からこの手順にパラメータを渡す必要があることにご注意ください。

ドキュメントが作成されたので、実行できるようになりました。メニューのアクションと変更セクションに移動し、オートメーションを選択します。この画面でオートメーションを実行ボタンをクリックします。次に、実行するドキュメントを選択します。これは私が作成したドキュメントであるため、自分の所有タブで見つけることができます。

前に作成した LaunchInstance ドキュメントをクリックすると、追加した説明を示すドキュメントの詳細画面が表示されます。このきちんとフォーマットされた説明により、ドキュメントのためのドキュメントを生成し、何を達成しようとしているのかを他の人が理解できるようになります。

次へをクリックすると、ドキュメントの入力パラメータを指定するよう求められます。このオートメーションを実行するときに使用するロールの imageId と ARN を追加します。このロールには、スクリプトによってリクエストされるサービスを呼び出すためのアクセス許可が必要であることにご注意ください。私の例では、EC2 インスタンスを作成できる必要があります。

ドキュメントが実行されると、ドキュメントの手順を示す画面が表示され、各手順にかかった時間と各手順の成功または失敗の詳細が表示されます。各手順にドリルダウンして、ログを調べることもできます。ご覧のとおり、ドキュメントの 3 つの手順はすべて完了し、Amazon Elastic Compute Cloud (EC2) コンソールに移動すると、タグ LaunchedBySsmAutomation で作成した EC2 インスタンスが作成されます。

これらの新しい機能は現在、AWS Systems Manager コンソール内のすべてのリージョンで利用できるため、すぐに使用できます。

オートメーションをお楽しみください!

— Martin;