EC2 Run Command (Linux)をPython(boto3)から使ってみた。

過去記事たち

EC2 Run Command (Linux)を使ってみた。

EC2 Run Command (Linux)のRunRemoteScriptを使ってみた。

やりたいこと

・別サーバーにあるファイルの中身をのぞき見する。

単純にこれだけ。sftp使って転送とかでもいいけど、せっかくだしRunCommandを使って取ってみる。 Command部分を変更すればなんでもできるよ。

準備

boto3とか入っていると想定。

profileは実行したいサーバーの権限があるものをaws configureで設定済み。

のぞき見したいinstanceにはssmの権限のあるIAMロールを割り振り済み。わからなければ過去記事ミテネ

Pythonはこんなふうに書いてみた。

import boto3
import time
import sys
from logging import getLogger, StreamHandler, DEBUG, Formatter
from datetime import datetime

args = sys.argv
command = "cat /root/hogehoge.txt"
instance_id = args[1]
ssm = boto3.client('ssm')


##Command投入

r = ssm.send_command(
        InstanceIds = [instance_id],
        DocumentName = "AWS-RunShellScript",
        Parameters = {
            "commands": [
            command
            ]    
        }
    )
command_id = r['Command']['CommandId']

## 処理終了待ち
time.sleep(2)

res = ssm.list_command_invocations(
          CommandId = command_id,
          Details = True
      )
invocations = res['CommandInvocations']
status = invocations[0]['Status']

if status == "Failed":
    print("Command実行エラー")

## 結果格納

account = invocations[0]['CommandPlugins'][0]['Output']

使い方は引数にinstance idをあげる。

python3 hogehoge.py i-xxxxxxxxxxx

簡単な解説

r = ssm.send_command(
        InstanceIds = [instance_id],
        DocumentName = "AWS-RunShellScript",
        Parameters = {
            "commands": [
            command
            ]    
        }
    )

Commandを実行させる。 instanceIDで指定したinstanceにRunShellScriptで実行させますよってそのまま書いておけば大丈夫。 複数あるなら列挙すればおk。

command_id = r['Command']['CommandId']

返り値にはCommandIDが入っている。このCommandIDでコマンドが終了したかどうかチェックしたり、表示を確認するために使ったり出来る。

time.sleep(2)

即時で行うと、次で参照できずエラーになるので、とめている。

invocations = res['CommandInvocations']
status = invocations[0]['Status']

ステータス取ってきてる。終了したら「Success」か「Failed」が入る。それ意外だと処理中と思って良いのでループさせて再取得してもいい。 エラー処理はいろいろ書いてたけど、都合上消したのでしっかり変えてね。

account = invocations[0]['CommandPlugins'][0]['Output']

コマンドの実行結果がこれに返ってくる。今回だとhogehoge.txtの中身がでてくるよ。