如何使用boto3在EC2实例上执行命令

21

请问我是否可以在AWS实例上使用boto3执行shell命令?

我在一些地方读到了boto.manage.cmdshell,但它在boto3中已被弃用。

6个回答

27
ssm_client = boto3.client('ssm')
response = ssm_client.send_command(
            InstanceIds=['i-03#####'],
            DocumentName="AWS-RunShellScript",
            Parameters={'commands': ['start ecs']}, )

command_id = response['Command']['CommandId']
output = ssm_client.get_command_invocation(
      CommandId=command_id,
      InstanceId='i-03######',
    )
print(output)

22
请提供一些上下文,以便读者能够理解代码,而不是复制粘贴。 - James Wierzba

9
ssm = boto3.client('ssm' )    
testCommand = ssm.send_command( InstanceIds=[ 'i-123123123123' ], DocumentName='AWS-RunShellScript', Comment='la la la', OutputS3BucketName='myOutputS3Bucket', OutputS3KeyPrefix='i-123123123123', Parameters={ "commands":[ "ip config" ]  } )

i-123123123123是一个虚构的EC2实例ID。我将它放在OutputS3KeyPrefix中,以获取存储桶中唯一的日志存储位置。

您可以按照以下步骤安装SSM Agent:

ec2r = boto3.resource('ec2' )
userdata = """#cloud-config
    runcmd:
     - /home/ec2-user/sudo npm run prod
     - cd /tmp
     - curl https://amazon-ssm-%s.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
     - yum install -y amazon-ssm-agent.rpm
""" % region   

if ssm == "on":
    instance = ec2r.create_instances( ImageId=ami, MinCount=1, MaxCount=1, KeyName=keyname, InstanceType=instancetype, 
        NetworkInterfaces=[{
        'DeviceIndex': 0,
        'AssociatePublicIpAddress': False,
        'SubnetId': mySub,
        'Groups': secGroupList,
        'AssociatePublicIpAddress': AssociatePublicIpAddress
    }],
        Monitoring={ 'Enabled': False },

        UserData=userdata,
        IamInstanceProfile={
            'Name': rolename
        },
        EbsOptimized=False
    )

感谢您发布这个解决方案。作为一个有经验的人,您是否主张使用paramiko而不是SSM,因为它更简单易用?在这里的github问题中,开发人员似乎更喜欢使用它来执行shell脚本。https://github.com/boto/boto3/issues/328 - Chris Conlan
我已经开始使用CloudFormation模板进行部署。这有助于在CF控制台中清楚地了解您已经部署的内容。 - ddtraveller

8

我知道我在回答一个有点老的帖子。我甚至不确定在那个时候SSM是否存在。但现在你可以使用boto3中的SSM send_command直接在EC2实例上运行命令。

这里是在EC2实例上运行PowerShell命令的示例:

import boto3
ssm_client = boto3.client('ssm', region_name="us-west-2") # use region code in which you are working
response = ssm_client.send_command(
             InstanceIds=[
                "i-03########" # use instance id on which you want to execute, even multiple is allowd
                     ],
             DocumentName="AWS-RunPowerShellScript",
             Parameters={
                'commands':[
                     'ipconfig'
                       ]
                   },
             })
command_id = response['Command']['CommandId']
output = ssm_client.get_command_invocation(
      CommandId=command_id,
      InstanceId='i-03######',
    )
print(output)

更多信息,请阅读Boto3 SSM文档。有关SSM本身的信息,请参考AWS文档。


我应该如何使用AWS-RunPowerShellScript创建用户名和密码?有人可以帮我吗? - Lakshminarayanan S

2
不可以。在boto中,boto.manage.cmdshell的功能没有迁移到boto3。原始的boto.manage.cmdshell功能使用了Paramiko,如果您想在boto3中使用SSH功能,可以直接使用Paramiko。
这是关于此主题的一个boto3 github问题
正如@jarmod所指出的,在2015年10月有新的AWS功能,使您能够使用AWS EC2 SSM在Windows系统上运行命令。从botocore版本1.3.1开始,您可以使用boto3 SSM客户端访问此功能。
这是一个关于支持“EC2 Run Command”的boto3 github问题

非常感谢。我将尝试使用Paramiko。 - sdeshpande
3
请查看最近宣布的EC2 Run Command:https://aws.amazon.com/blogs/aws/new-ec2-run-command-remote-instance-management-at-scale/。博客建议此功能受到boto3和awscli的支持,但我尚未找到它。这是常见问题解答:https://aws.amazon.com/ec2/run-command/faqs/。 - jarmod
@Gil 你能提供更多细节吗?有什么问题出现了吗? - gene_wood

1

修改

command_id = response['Command']['CommandId']

command_id = context.aws_request_id

0

文档中提到:

aws_request_id

与请求相关联的AWS请求ID。这是返回给调用调用方法的客户端的ID。

更改为:

command_id = response['Command']['CommandId']

for:

command_id = context.aws_request_id

2
为什么要发两次相同的答案? - 0xc0de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接