Systems Manager Automation ランブックから他の AWS のサービスを呼び出す - AWS Systems Manager

Systems Manager Automation ランブックから他の AWS のサービスを呼び出す

ランブックで次のオートメーションアクションを使用すると、他の AWS のサービスおよび他の Systems Manager の機能を呼び出すことができます。

  • aws:executeAwsApi: このオートメーションアクションは、AWS API オペレーションを呼び出して実行します。API 操作のほとんどはサポートされていますが、すべての API オペレーションがテストされているわけではありません。例えば、次の API オペレーションがサポートされています。CreateImageDelete bucketRebootDBInstance、および CreateGroupsGet Object アクションなどのストリーミング API オペレーションはサポートされていません。

  • aws:waitForAwsResourceProperty: このオートメーションアクションにより、続行する前にオートメーションが特定のリソース状態またはイベント状態を待てるようにします。例えば、Amazon Relational Database Service (Amazon RDS) DescribeDBInstances API オペレーションでこのアクションを使用すると、データベースインスタンスが起動するまでオートメーションを一時停止できます。

  • aws:assertAwsResourceProperty: このオートメーションアクションを使用すると、特定のステップの、特定のリソース状態またはイベント状態をアサートできます。たとえば、オートメーションのステップが EC2 インスタンスの起動を待つように指定することができます。次に、Amazon Elastic Compute Cloud (Amazon EC2) DescribeInstanceStatus API オペレーションを実行し、DesiredValue プロパティを running にします。これにより、オートメーションはインスタンスの実行を待機し、インスタンスが実際に実行されているときに続行されます。

次に、aws:executeAwsApi アクションを使用して S3 バケットの読み書きのアクセス許可をオフにする YAML のサンプルのランブックを示します。

--- description: Disable S3-Bucket's public WriteRead access via private ACL schemaVersion: "0.3" assumeRole: "{{ AutomationAssumeRole }}" parameters: S3BucketName: type: String description: (Required) S3 Bucket subject to access restriction AutomationAssumeRole: type: String description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf. default: "" mainSteps: - name: DisableS3BucketPublicReadWrite action: aws:executeAwsApi inputs: Service: s3 Api: PutBucketAcl Bucket: "{{S3BucketName}}" ACL: private isEnd: true ...

以下に、3つのアクションすべてを使用するYAMLのサンプルランブックがあります。オートメーションでは、次の処理が行われます。

  • aws:executeAwsApi アクションを使用して Amazon EC2 DescribeImages API オペレーションを呼び出し、特定の Windows Server 2016 AMI の名前を取得します。イメージ ID を ImageId として出力します。

  • aws:executeAwsApi アクションを使用して、Amazon EC2 RunInstances API オペレーションを呼び出し、前の手順の ImageId を使用するインスタンスを 1 つ起動します。インスタンス ID を InstanceId として出力します。

  • aws:waitForAwsResourceProperty アクションを使用して Amazon EC2 DescribeInstanceStatus API オペレーションをポーリングし、インスタンスが running 状態になるまで待機します。アクションは 60 秒でタイムアウトします。60 秒間のポーリング後にインスタンス状態が running にならなかった場合、このステップはタイムアウトします。

  • aws:assertAwsResourceProperty アクションを使用して Amazon EC2 DescribeInstanceStatus API オペレーションを呼び出し、インスタンスが running 状態であることをアサートします。インスタンス状態が running ではない場合、このステップは失敗します。

--- description: Sample runbook using AWS API operations schemaVersion: '0.3' assumeRole: "{{ AutomationAssumeRole }}" parameters: AutomationAssumeRole: type: String description: "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf." default: '' ImageName: type: String description: "(Optional) Image Name to launch EC2 instance with." default: "Windows_Server-2016-English-Full-Base-2018.07.11" mainSteps: - name: getImageId action: aws:executeAwsApi inputs: Service: ec2 Api: DescribeImages Filters: - Name: "name" Values: - "{{ ImageName }}" outputs: - Name: ImageId Selector: "$.Images[0].ImageId" Type: "String" - name: launchOneInstance action: aws:executeAwsApi inputs: Service: ec2 Api: RunInstances ImageId: "{{ getImageId.ImageId }}" MaxCount: 1 MinCount: 1 outputs: - Name: InstanceId Selector: "$.Instances[0].InstanceId" Type: "String" - name: waitUntilInstanceStateRunning action: aws:waitForAwsResourceProperty # timeout is strongly encouraged for action - aws:waitForAwsResourceProperty timeoutSeconds: 60 inputs: Service: ec2 Api: DescribeInstanceStatus InstanceIds: - "{{ launchOneInstance.InstanceId }}" PropertySelector: "$.InstanceStatuses[0].InstanceState.Name" DesiredValues: - running - name: assertInstanceStateRunning action: aws:assertAwsResourceProperty inputs: Service: ec2 Api: DescribeInstanceStatus InstanceIds: - "{{ launchOneInstance.InstanceId }}" PropertySelector: "$.InstanceStatuses[0].InstanceState.Name" DesiredValues: - running outputs: - "launchOneInstance.InstanceId" ...

入力と出力の使用

前述の各オートメーションアクションを使用すると、サービス名前空間、API オペレーション名、入力パラメータ、および出力パラメータを指定して、特定の API オペレーションを呼び出すことができます。入力は、選択した API オペレーションによって定義されます。API オペレーション (メソッド) は、以下の「サービスリファレンス」ページの左側のナビゲーションでサービスを選択することで表示できます。呼び出すサービスの [Client (クライアント)] セクションでメソッドを選択します。例えば、Amazon Relational Database Service (Amazon RDS) のすべての API オペレーション (メソッド) は、Amazon RDS メソッドのページに一覧表示されます。

各オートメーションアクションのスキーマは、次の場所で表示できます。

スキーマには、各アクションを使用するための必須フィールドの説明が含まれています。

Selector/PropertySelector フィールドの使用

各オートメーションアクションでは、出力 Selector (aws:executeAwsApi 用) または PropertySelector (aws:assertAwsResourceProperty および aws:waitForAwsResourceProperty 用) を指定する必要があります。これらのフィールドは、AWS API オペレーションから JSON 応答を処理するために使用されます。これらのフィールドは JSONPath 構文を使用します。

次に、aws:executeAwsAPi アクションのこの概念を説明する例を示します。

--- mainSteps: - name: getImageId action: aws:executeAwsApi inputs: Service: ec2 Api: DescribeImages Filters: - Name: "name" Values: - "{{ ImageName }}" outputs: - Name: ImageId Selector: "$.Images[0].ImageId" Type: "String" ...

aws:executeAwsApi ステップ getImageId で、オートメーションは DescribeImages API オペレーションを呼び出し、ec2 からレスポンスを受け取ります。次に、オートメーションは Selector - "$.Images[0].ImageId" を API レスポンスに適用し、選択した値を出力 ImageId 変数に割り当てます。同じ自動化の他のステップでは、ImageId を指定して "{{ getImageId.ImageId }}" の値を使用できます。

次に、aws:waitForAwsResourceProperty アクションのこの概念を説明する例を示します。

--- - name: waitUntilInstanceStateRunning action: aws:waitForAwsResourceProperty # timeout is strongly encouraged for action - aws:waitForAwsResourceProperty timeoutSeconds: 60 inputs: Service: ec2 Api: DescribeInstanceStatus InstanceIds: - "{{ launchOneInstance.InstanceId }}" PropertySelector: "$.InstanceStatuses[0].InstanceState.Name" DesiredValues: - running ...

aws:waitForAwsResourceProperty ステップ waitUntilInstanceStateRunning で、オートメーションは DescribeInstanceStatus API オペレーションを呼び出し、ec2 からレスポンスを受け取ります。次に、オートメーションは PropertySelector - "$.InstanceStatuses[0].InstanceState.Name" をレスポンスに適用し、指定された戻り値が DesiredValues リスト (この場合は running) の値と一致するかどうかを確認します。このステップは、レスポンスが running のインスタンスの状態を返すまでプロセスを繰り返します。

JSONPath をランブックで使用する

JSONPath 式は、「$.」で始まる文字列で、JSON 要素内の 1 つ以上のコンポーネントを選択するために使用されます。次のリストには、Systems Manager Automation でサポートされている JSONPath 演算子に関する情報が含まれています。

  • Dot-notated child (.): JSON オブジェクトで使用します。この演算子は、特定のキーの値を選択します。

  • Deep-scan (..): JSON 要素で使用します。この演算子は、レベル別に JSON 要素レベルをスキャンし、特定のキーで値のリストを選択します。この演算子の戻り型は、常に JSON 配列です。オートメーションアクションの出力タイプのコンテキストでは、演算子は StringList または MapList のいずれかになります。

  • Array-Index([ ]): JSON 配列で使用します。この演算子は、特定のインデックスの値を取得します。

JSONPath 演算子をよりよく理解するために、ec2 DescribeInstances API オペレーションの次の JSON 応答を確認してください。このレスポンスの下には、DescribeInstances API オペレーションからのレスポンスにさまざまな JSONPath 式を適用してさまざまな結果を示すいくつかの例があります。

{
    "NextToken": "abcdefg",
    "Reservations": [
        {
            "OwnerId": "123456789012",
            "ReservationId": "r-abcd12345678910",
            "Instances": [
                {
                    "ImageId": "ami-12345678",
                    "BlockDeviceMappings": [
                        {
                            "Ebs": {
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-000000000000"
                            },
                            "DeviceName": "/dev/xvda"
                        }
                    ],
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    }
                }
            ],
            "Groups": []
        },
        {
            "OwnerId": "123456789012",
            "ReservationId": "r-12345678910abcd",
            "Instances": [
                {
                    "ImageId": "ami-12345678",
                    "BlockDeviceMappings": [
                        {
                            "Ebs": {
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-111111111111"
                            },
                            "DeviceName": "/dev/xvda"
                        }
                    ],
                    "State": {
                        "Code": 80,
                        "Name": "stopped"
                    }
                }
            ],
            "Groups": []
        }
    ]
}

JSONPath 例 1: JSON レスポンスから特定の文字列を取得する

JSONPath: $.Reservations[0].Instances[0].ImageId Returns: "ami-12345678" Type: String

JSONPath 例 2: JSON レスポンスから特定のブーリアンを取得する

JSONPath: $.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.DeleteOnTermination Returns: true Type: Boolean

JSONPath 例 3: JSON レスポンスから特定の整数を取得する

JSONPath: $.Reservations[0].Instances[0].State.Code Returns: 16 Type: Integer

JSONPath 例 4: JSON レスポンスを詳細にスキャンし、VolumeId のすべての値を StringList として取得する

JSONPath: $.Reservations..BlockDeviceMappings..VolumeId Returns: [ "vol-000000000000", "vol-111111111111" ] Type: StringList

JSONPath 例 5: 特定の BlockDeviceMappings オブジェクトを StringMap として取得する

JSONPath: $.Reservations[0].Instances[0].BlockDeviceMappings[0] Returns: { "Ebs" : { "DeleteOnTermination" : true, "Status" : "attached", "VolumeId" : "vol-000000000000" }, "DeviceName" : "/dev/xvda" } Type: StringMap

JSONPath 例 6: JSON レスポンスを詳細にスキャンし、すべての State のオブジェクトを MapList として取得します

JSONPath: $.Reservations..Instances..State Returns: [ { "Code" : 16, "Name" : "running" }, { "Code" : 80, "Name" : "stopped" } ] Type: MapList
重要

AWS Identity and Access Management (IAM) サービスロールを使用して他のサービスを呼び出す自動化ワークフローを実行する場合は、それらのサービスを呼び出すためのアクセス許可をサービスロールに設定する必要がある点に注意してください。この要件は、AWS-ConfigureS3BucketLoggingAWS-CreateDynamoDBBackupAWS-RestartEC2Instance ランブックなど、すべての AWS オートメーションランブック (AWS-* ランブック) に適用されます。この要件は、他のサービスを呼び出すアクションを使用して他の AWS のサービスを呼び出すように作成したカスタムオートメーションランブックにも適用されます。例えば、aws:executeAwsApiaws:createStack、または aws:copyImage のアクションを使用する場合は、それらのサービスを呼び出すためのアクセス許可を持つサービスロールを設定します。ロールに IAM インラインポリシーを追加することで、他の AWS のサービスへのアクセス許可を有効にできます。詳細については、「」を参照してください(オプション) 他の AWS のサービスを呼び出すためのオートメーションインラインポリシーを追加する

サンプルチュートリアル: Systems Manager Automation のランブックから Amazon RDS インスタンスを起動する

このサンプルチュートリアルでは、Amazon Relational Database Service (Amazon RDS) データベースインスタンスが実行中かどうかを確認するために、3 つの API オペレーションをすべて使用する Systems Manager Automation ランブックを YAML で作成および実行する方法を示します。DB インスタンスが実行されていない場合は、オートメーションによって起動されます。

Amazon RDS API オペレーションをランブックから呼び出すには

  1. テキストエディタを開き、次のランブックの内容をファイルに貼り付けます。確認する自動化ロールとインスタンス ID を指定します。後で mainSteps アクションを追加します。

    --- description: Start RDS instance schemaVersion: "0.3" assumeRole: "The_Automation_role_to_use_when_running_the_runbook" parameters: InstanceId: The_instance_ID_to_start type: String description: (Required) RDS instance ID to start AutomationAssumeRole: type: String description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf. default: "" mainSteps:
  2. オートメーションの最初のステップでは、インスタンスがすでに実行されているかどうかを判断する必要があります。aws:assertAwsResourceProperty アクションを使用して、特定のインスタンスステータスを判断し、アサートできます。aws:assertAwsResourceProperty アクションをランブックに追加する前に、必要な入力を決定して指定する必要があります。以下のリストは、必要な入力を決定し、指定する方法を示しています。リストの後に、ランブックにこの情報を入力する方法の例を見ることができます。

    1. スキーマを表示し、aws:assertAwsResourceProperty – AWS リソースの状態またはイベントの状態をアサートする アクションで使用可能なすべての入力を表示します。

    2. 呼び出すサービスの名前空間を決定します。AWS のサービスの名前空間は、アマゾン ウェブ サービス全般のリファレンスの「Amazon リソースネーム (ARN) と AWS のサービスの名前空間」に一覧表示されています。Amazon RDS の名前空間は rds です。

    3. データベースインスタンスの状態を表示するためにどの Amazon RDS API オペレーションを使用するかを決定します。API オペレーション (メソッド) は、「Amazon RDS メソッド」ページで表示できます。

    4. DescribeDBInstances API オペレーションに 1 つ以上のリクエストパラメータを指定します。たとえば、このアクションは DBInstanceIdentifier リクエストパラメータを使用します。

    5. 1 つ以上の PropertySelector を決定します。PropertySelector は、この API オペレーションのリクエストによって返される応答オブジェクトです。例えば、Amazon RDS メソッドで。describe_db_instances メソッドを選択し、[Response Structure (レスポンス構造)] セクションまで下にスクロールします。[DBInstances] は応答オブジェクトとして表示されます。このチュートリアルでは、DBInstancesDBInstanceStatus を PropertySelectors として指定します。JSONPath を使用して PropertySelectors を入力することに注意してください。これは、ランブック内の情報を次のようにフォーマットすることを意味します。

      PropertySelector: "$.DBInstances[0].DBInstanceStatus".

    6. 1 つ以上の DesiredValues を指定します。指定する値がわからない場合は、DescribeDBInstances API オペレーションを実行して値を決定します。このチュートリアルでは、availablestarting を指定します。

    7. 次の例に示すように、収集した情報をランブックに入力します。

    --- description: Start RDS instance schemaVersion: "0.3" assumeRole: "The_Automation_role_to_use_when_running_the_runbook" parameters: InstanceId: The_instance_ID_to_start type: String description: (Required) RDS Instance Id to stop AutomationAssumeRole: type: String description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf. default: "" mainSteps: - name: AssertNotStartingOrAvailable action: aws:assertAwsResourceProperty isCritical: false onFailure: step:StartInstance nextStep: CheckStart inputs: Service: rds Api: DescribeDBInstances DBInstanceIdentifier: "{{InstanceId}}" PropertySelector: "$.DBInstances[0].DBInstanceStatus" DesiredValues: ["available", "starting"]
  3. 前のアクションによって開始されていないと判断された場合は、mainSteps セクションに aws:executeAwsApi アクションを指定してインスタンスを開始します。

    1. スキーマを表示して、aws:executeAwsApi — AWS API オペレーションの呼び出しと実行 の使用可能なすべての入力を表示します。

    2. Amazon RDS StartDBInstance API オペレーションを指定して、インスタンスを起動します。

    3. 次の例に示すように、収集した情報をランブックに入力します。

    --- description: Start RDS instance schemaVersion: "0.3" assumeRole: "{{ The_Automation_role_to_use_when_running_the_runbook }}" parameters: InstanceId: type: String description: (Required) RDS Instance Id to stop AutomationAssumeRole: type: String description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf. default: "" mainSteps: - name: AssertNotStartingOrAvailable action: aws:assertAwsResourceProperty isCritical: false onFailure: step:StartInstance nextStep: CheckStart inputs: Service: rds Api: DescribeDBInstances DBInstanceIdentifier: "{{InstanceId}}" PropertySelector: "$.DBInstances[0].DBInstanceStatus" DesiredValues: ["available", "starting"] - name: StartInstance action: aws:executeAwsApi inputs: Service: rds Api: StartDBInstance DBInstanceIdentifier: "{{InstanceId}}"
  4. mainSteps セクションの aws:waitForAwsResourceProperty アクションを指定して、オートメーションを終了する前にインスタンスが開始するのを待ちます。

    1. スキーマを表示して、aws:waitForAwsResourceProperty – AWS リソースプロパティを待つ の使用可能なすべての入力を表示します。

    2. Amazon RDS DescribeDBInstances API オペレーションを指定して、インスタンスの状態を判断します。

    3. $.DBInstances[0].DBInstanceStatusPropertySelector と指定します。

    4. availableDesiredValue と指定します。

    5. 次の例に示すように、収集した情報をランブックに入力します。

    --- description: Start RDS instance schemaVersion: "0.3" assumeRole: "{{ The_Automation_role_to_use_when_running_the_runbook }}" parameters: InstanceId: type: String description: (Required) RDS Instance Id to stop AutomationAssumeRole: type: String description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf. default: "" mainSteps: - name: AssertNotStartingOrAvailable action: aws:assertAwsResourceProperty isCritical: false onFailure: step:StartInstance nextStep: CheckStart inputs: Service: rds Api: DescribeDBInstances DBInstanceIdentifier: "{{InstanceId}}" PropertySelector: "$.DBInstances[0].DBInstanceStatus" DesiredValues: ["available", "starting"] - name: StartInstance action: aws:executeAwsApi inputs: Service: rds Api: StartDBInstance DBInstanceIdentifier: "{{InstanceId}}" - name: CheckStart action: aws:waitForAwsResourceProperty onFailure: Abort maxAttempts: 10 timeoutSeconds: 600 inputs: Service: rds Api: DescribeDBInstances DBInstanceIdentifier: "{{InstanceId}}" PropertySelector: "$.DBInstances[0].DBInstanceStatus" DesiredValues: ["available"] isEnd: true ...
  5. ファイルを sample.yaml として保存します。

  6. AWS CLI で次のコマンドを実行して、ランブックを AWS アカウント に追加します。

    aws ssm create-document --name sampleRunbook --document-type Automation --document-format YAML --content file://sample.yaml
  7. 次のコマンドを実行して、先ほど作成したランブックを使用してオートメーションを開始します。オートメーションを開始した後、Systems Manager によって返された実行 ID を記録します。

    aws ssm start-automation-execution --document-name sampleRunbook
  8. 以下のコマンドを実行して、実行のステータスを表示します。

    aws ssm get-automation-execution --automation-execution-id automation_execution_id

AWSAPI を呼び出す定義済みのランブック

Systems Manager Automation には、AWS API の呼び出しを行う以下の事前定義されたランブックが含まれています。

ランブック名 目的

AWS-StartRdsInstance

Amazon RDS インスタンスを起動します。

AWS-StopRdsInstance

Amazon RDS インスタンスを停止します。

AWS-RebootRdsInstance

Amazon RDS インスタンスを再起動します。

AWS-CreateSnapshot

Amazon Elastic Block Store (Amazon EBS) ボリュームスナップショットを作成します。

AWS-DeleteSnapshot

Amazon EBS ボリュームスナップショットを削除します。

AWS-ConfigureS3BucketLogging

Amazon Simple Storage Service (Amazon S3) バケットのログ記録を有効にします。

AWS-DisableS3BucketPublicReadWrite

プライベート ACL を使用して、S3 バケットに対する読み書きのアクセス許可をオフにします。

AWS-ConfigureS3BucketVersioning

S3 バケットのバージョニングを有効または停止します。

AWS-DeleteDynamoDbBackup

Amazon DynamoDB テーブルのバックアップを削除します。

前述の表のリンクを選択するか、次の手順を使用して、Systems Manager コンソールでこれらのランブックの詳細を表示します。

  1. AWS Systems Manager コンソール (https://console.aws.amazon.com/systems-manager/) を開きます。

  2. ナビゲーションペインで、[ドキュメント] を選択します。

    -または-

    AWS Systems Manager ホームページが最初に開く場合は、メニューアイコン ( ) を選択してナビゲーションペインを開き、[ドキュメント] を選択します。

  3. ランブックを選択し、[詳細を表示] を選択します。

  4. [Content] タブを選択します。