EC2インスタンスにSSHで接続し、 this のようなシェルコマンドを実行できるようにしたいと思います。
Boto3でどうすればよいですか?
次のコードスニペットを使用してEC2インスタンスにsshし、boto3からコマンドを実行できます。
import boto3
import botocore
import paramiko
key = paramiko.RSAKey.from_private_key_file(path/to/mykey.pem)
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
# Connect/ssh to an instance
try:
# Here 'ubuntu' is user name and 'instance_ip' is public IP of EC2
client.connect(hostname=instance_ip, username="ubuntu", pkey=key)
# Execute a command(cmd) after connecting/ssh to an instance
stdin, stdout, stderr = client.exec_command(cmd)
print stdout.read()
# close the client connection once the job is done
client.close()
break
except Exception, e:
print e
このスレッドは少し古いですが、単純な解決策を見つけるのにイライラする午後を過ごしたので、共有することもできます。
NBこれは、sshを使用しないため、OPの質問に対するstrict回答ではありません。しかし、boto3の1つのポイントは、必要がないことです。したがって、既存のboto3構成を簡単に使用できるため、ほとんどの場合、これはOPの目標を達成するための好ましい方法だと思います。
AWSのRun Commandはbotocoreに組み込まれています(したがって、これは私の知る限りbotoとboto3の両方に適用されるはずです)免責事項:これはboto3でのみテストしました。
def execute_commands_on_linux_instances(client, commands, instance_ids):
"""Runs commands on remote linux instances
:param client: a boto/boto3 ssm client
:param commands: a list of strings, each one a command to execute on the instances
:param instance_ids: a list of instance_id strings, of the instances on which to execute the command
:return: the response from the send_command function (check the boto3 docs for ssm client.send_command() )
"""
resp = client.send_command(
DocumentName="AWS-RunShellScript", # One of AWS' preconfigured documents
Parameters={'commands': commands},
InstanceIds=instance_ids,
)
return resp
# Example use:
ssm_client = boto3.client('ssm') # Need your credentials here
commands = ['echo "hello world"']
instance_ids = ['an_instance_id_string']
execute_commands_on_linux_instances(ssm_client, commands, instance_ids)
Windowsインスタンスのpowershellコマンドには、代替オプションを使用します。
DocumentName="AWS-RunPowerShellScript",
boto3を使用してインスタンスを検出し、 fabric を使用してインスタンスでコマンドを実行します
PythonからSSHしません。 boto3
モジュールを使用して、EC2インスタンスと対話できます。
ここboto3
の完全なドキュメントと、それで実行できるコマンドがあります。
Botoは、Paramikoを使用してプログラムでEC2インスタンスにSSH接続し、コマンドを実行する方法を提供しました。 Boto3にはこの機能は含まれていません。おそらく、boto3で動作するようにbotoコードを変更するのに、多大な労力を費やす必要はありません。または、ファブリックやansibleなどを使用して、EC2インスタンスでコマンドをリモートで実行するはるかに強力な方法を検討することもできます。
ここに私がやった方法があります
import boto3
import botocore
import boto
import paramiko
ec2 = boto3.resource('ec2')
instances = ec2.instances.filter(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
i = 0
for instance in instances:
print(instance.id, instance.instance_type)
i+= 1
x = int(input("Enter your choice: "))
try:
ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
privkey = paramiko.RSAKey.from_private_key_file('address to .pem key')
ssh.connect(instance.public_dns_name,username='ec2-user',pkey=privkey)
stdin, stdout, stderr = ssh.exec_command('python input_x.py')
stdin.flush()
data = stdout.read().splitlines()
for line in data:
x = line.decode()
#print(line.decode())
print(x,i)
ssh.close()
資格については、AWSCLIパッケージを追加し、ターミナルで実行します
aws configure
資格情報を入力します。それらはすべて.awsフォルダーに保存されます。パスも変更できます。