AWSをコマンドラインから扱う方法についていろいろ勉強している。 最終的にはローカルマシンで実行している処理をAWSに流し込めるようになりたいが、そのためにはまずはPythonインタフェースであるboto3から、コマンドを流し込んで実行できなければならない。 boto3からAWSのLinuxを操作するための方法について調査した。
boto3経由でAWS EC2インスタンスのLinuxにコマンドを流し込むためには、ssmインタフェースというものを使用する。
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'であれば処理実行中。そうでなければ結果が格納されている。
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% /
ソースコードは以下。