2016-11-17 13 views
0

インスタンスを起動してからコマンドを実行できるpythonスクリプトを実行しようとしています。私はuserdataの形式でインスタンスを作成しようとすると渡すことができることを知っています。私が理解しようとしているのは、すでに作成されたインスタンスを開始する場合に、それを渡す方法です。pythonスクリプトからインスタンスを起動した後、ec2にコマンドを渡す方法は?

import boto3 
userdata = """#cloud-config 

repo_update: true 
repo_upgrade: all 

packages: 
- s3cmd 

runcmd: 
- echo 'Hello S3!' > /tmp/hello.txt 
- aws --region YOUR_REGION s3 cp /tmp/hello.txt s3://YOUR_BUCKET/hello.txt 
""" 

ec2 = boto3.resource('ec2') 
instances = ec2.create_instances(
    ImageId='ami-f5f41398',   # default Amazon linux 
    InstanceType='t2.micro', 
    KeyName='YOUR_SSH_KEY_NAME', 
    MinCount=1, 
    MaxCount=1, 
    IamInstanceProfile={ 
     'Arn': 'YOUR_ARN_ID' 
    }, 
    SecurityGroupIds=['YOUR_SECURITY_GROUP_NAME'], 
    UserData=userdata 
) 

あなたはUserDataを設定し、インスタンスを起動して、変更ピックアップしますすることができます

i = ec2.Instance(id='i-5fea4d42') 
i.start('pass commands here: eg echo xx, mv a b/ etc') 
+0

あなたは毎回異なるコマンドを実行したいのですが、ユーザーデータに同じコマンドを実行したいですか? – helloV

+0

ec2シェルフでコマンドを実行しようとしています。彼らは異なるでしょう、私はboto3のリンクに引き継がれていないbotoとコマンドシェルを使用しようとしています。おそらく私はparamikoとboto3の組み合わせを使用します。 –

答えて

0

私は、boto3とawscliと一緒にparamikoを使用して、すべてのものを自動的にクラウド上で実行することができました。

import paramiko 
import boto3 
import time 
import subprocess 
import awscli 
import os 

# Starting instance, copying data to instance, running model, copying output to s3 
print ("\nCreating ssh session") 
session = boto3.Session() 
ec2 = session.resource('ec2', region_name='us-east-1') 
i = ec2.Instance(id='instance id') # instance id 


print('\nstarting deeplearning_ami instance') 
i.start() 
i.wait_until_running() 
i.load() 
print ("Waiting for the checks to finish..") 
time.sleep(45) 

k = paramiko.RSAKey.from_private_key_file(key_path) #your private key for ssh 
c = paramiko.SSHClient() 
c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
print ("\nConnecting to shell using ssh") 
c.connect(hostname = i.public_dns_name, username = "ec2-user", pkey = k) 

print ("\nExecuting commands on EC2 instance\n") 

stdin , stdout, stderr = c.exec_command(""" mkdir -p model; 
             printf 'Creating directory structure, if it does not exists \n'; 
             cd model; 
             mkdir -p data out cp; 
             printf '\nCopying code from s3 bucket to ec2 instance \n'; 
             aws s3 cp {0} .; 
             printf '\nDownloading data from s3 bucket to ec2 instance'; 
             aws s3 sync {1} data; 
             printf '\n Download complete, running model..\n\n'; 
             python theano_test.py; 
             echo 'Hello S3!' > out/hello.txt; 
             printf '\n Copying output to s3 bucket \n'; 
             aws s3 sync out {2} """.format(s3_code,s3_data,s3_out), get_pty=True) 

for line in iter(lambda: stdout.readline(2048), ""): print(line, end="") 
print ("\n \n Processingfinished") 

#print ('Stopping instance') 
i.stop() 


print ('Copying output from s3 bucket to local') 
os.system('aws s3 sync ' + s3_out + ' ' + local_out) 
0

ような何か: に続いて、インスタンスを作成しながら、ハローシンプルな世界を渡すためにboto3を使用してコードでありますhttp://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Client.modify_instance_attribute

ただし、UserDataのスクリプトは、通常、一度だけ実行するように設定されているので、あなたは、すべての起動時に実行するように変更する必要があります: How do I make cloud-init startup scripts run every time my EC2 instance boots?

もう1つの方法は、SSHを設定して起動後にスクリプトを実行することですが、これをUserDataにプッシュするのは私の意見ではよりクリーンです。

+0

私はboto3に渡されなかったbotoとコマンドシェルを使用しようとしています[リンク](http://stackoverflow.com/questions/34028219/how-to-execute-commands-on-aws-instance-using- boto3)。おそらく私はparamikoとboto3の組み合わせを使用します。 –

関連する問題