FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

AWSのPythonインタフェースboto3を使用してEC2インスタンスにコマンドを流し込む方法

f:id:msyksphinz:20190818215623p:plain

AWSコマンドラインから扱う方法についていろいろ勉強している。 最終的にはローカルマシンで実行している処理をAWSに流し込めるようになりたいが、そのためにはまずはPythonインタフェースであるboto3から、コマンドを流し込んで実行できなければならない。 boto3からAWSLinuxを操作するための方法について調査した。

boto3経由でAWS EC2インスタンスLinuxにコマンドを流し込むためには、ssmインタフェースというものを使用する。

boto3.amazonaws.com

SSMインタフェースを経由して、立ち上げているEC2インスタンスに対してコマンドを流し込む。インスタンスインスタンスIDを使用して識別する。

import boto3

def execute_command(instance_id, command):
    ssm_client = boto3.client('ssm')
    try:
        response = ssm_client.send_command(
        DocumentName="AWS-RunShellScript",
            Parameters={'commands': [command]},
            InstanceIds=[instance_id],
            TimeoutSeconds=3600,
        )
    except Exception as e:
        print("Error: During Executing EC2 Instance")
        print("message:{0}".format(e.message))

execute_command("インスタンスのID", "ls -lt /")

これでコマンドを発行できる。コマンドを発行すると、結果を回収しなければならない。そのためにはget_command_invocation()を使用する。 コマンドの状態を取得し、その状態output['Status']がまだ'InProgress'であれば処理実行中。そうでなければ結果が格納されている。

boto3.amazonaws.com

    command_id = response['Command']['CommandId']
    output = ssm_client.get_command_invocation(
        CommandId=command_id,
        InstanceId=instance_id,
    )
    while(output['Status'] == 'InProgress'):
        print("Time = {} : Status = {}".format(time_cnt * 5.0, output['Status']))

        time.sleep(5.0)
        output = ssm_client.get_command_invocation(
            CommandId=command_id,
            InstanceId=instance_id,
        )
        time_cnt += 1

例えば、以下のようなコードを実行してみよう。

command_list = ['ls -lt /',
                'df -h',
]
execute_command_list(instance.instance_id, command_list)

以下のように、実行結果を取得できる。

Executing ['ls -lt /', 'df -h'] ...
Output =
total 16
drwxrwxrwt   8 root root  172 Aug 23 10:58 tmp
drwxr-xr-x  27 root root  960 Aug 23 10:57 run
drwxr-xr-x  80 root root 8192 Aug 23 10:57 etc
drwxr-xr-x   4 root root   38 Aug 23 10:57 home
dr-xr-x---   3 root root  103 Aug 23 10:57 root
drwxr-xr-x  15 root root 2820 Aug 23 10:57 dev
drwxr-xr-x  19 root root  269 Aug 23 10:57 var
dr-xr-xr-x  13 root root    0 Aug 23 10:57 sys
dr-xr-xr-x 100 root root    0 Aug 23 10:57 proc
dr-xr-xr-x   4 root root 4096 Jun 18 22:24 boot
drwxr-xr-x   4 root root   27 Jun 18 22:24 opt
drwxr-xr-x  13 root root  155 Jun 18 22:23 usr
lrwxrwxrwx   1 root root    7 Jun 18 22:23 bin -> usr/bin
lrwxrwxrwx   1 root root    7 Jun 18 22:23 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Jun 18 22:23 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    8 Jun 18 22:23 sbin -> usr/sbin
drwxr-xr-x   2 root root    6 Jun 18 22:23 local
drwxr-xr-x   2 root root    6 Apr  9 19:57 media
drwxr-xr-x   2 root root    6 Apr  9 19:57 mnt
drwxr-xr-x   2 root root    6 Apr  9 19:57 srv
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        475M     0  475M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  332K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      100G  1.3G   99G   2% /

ソースコードは以下。

gist.github.com