如何使用boto3通过ssm代理scp到ec2实例并发送文件



Hi需要通过ssm代理将文件传输到ec2机器。我已经成功地在ec2实例中安装了ssm代理,并且从UI我能够通过";会话管理器";并登录到ec2机器的外壳。

现在我尝试通过boto3并使用下面的代码实现自动化

ssm_client = boto3.client('ssm', 'us-west-2') 
resp = client.send_command(
DocumentName="AWS-RunShellScript", # One of AWS' preconfigured documents
Parameters={'commands': ['echo "hello world" >> /tmp/test.txt']},
InstanceIds=['i-xxxxx'],
)

上面的操作很好,我可以在远程机器中发送创建一个名为test.txt的文件,但他的是通过echo命令相反,我需要通过ssm代理将一个文件从我的本地机器发送到这个删除ec2的机器,因此我做了以下操作,

修改了"/etc/ssh/ssh_config";代理如下,

# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

然后在上面的代码中,我尝试用下面的代码启动一个会话,这也很成功。

response = ssm_client.start_session(Target='i-04843lr540028e96a')

现在我不知道如何使用这个会话响应或使用这个aws-ssm会话并发送文件

环境描述:来源:在EKS集群中运行的poddest:ec2计算机(已运行ssm代理(要传输的文件:ec2机器中的某些进程将使用的重要私钥,不同机器的会有所不同

尝试的解决方案:

  • 我可以将文件推送到源代码中的s3并执行ssm-boto3 libaray可以从s3中提取并存储在远程ec2机器中
  • 但是我不想做以上的事情,因为我不想存储私钥I s3。所以想直接将文件从内存发送到远程ec2机器

基本上我想实现这个aws文档中提到的scp:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-启动ssh

如果您有通过SSM的SSH设置,您可以使用普通的scp,如下所示:

scp file.txt ec2-user@i-04843lr540028e96a

如果它不起作用,请确保您有:

  • 本地安装的会话管理器插件
  • 您在实例和本地的密钥对(您需要在ssh配置中或通过-i开关定义它(
  • 实例上的SSM代理(默认安装在Amazon Linux 2上(
  • 连接到允许会话管理器的实例的实例角色(它需要在启动时存在,所以如果您刚刚连接,请重新启动(

参考:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

如果你需要更多的细节,请给我更多关于你的设置的信息,我会尽力提供帮助。

您可以使用S3存储桶作为代理。唯一需要的就是给予EC2访问S3的权限。这样,您就不必使用SSH协议在机器之间复制文件。

在此处解释了所有步骤

@Nathan Williams给出的答案令人困惑(scp file.txtec2-user@i-04843lr540028e96a)。当使用scp时,您使用SSH作为复制协议,因此您必须设置用户名/密码或用户名SSH密钥来复制文件。此scp文件.txtec2-user@i-04843lr540028e96a除非共享密钥,特别是区域和配置文件,否则无法工作。完整的命令是:scp-i密钥文件.txtec2-user@i-04843lr540028e96a--region xxx--profile myprofile(如果您配置了默认的profile和region,则不必将它们放在命令中(。我认为大多数人正在寻找的只是一种简单的方法,只使用ssm将文件传输到ec2实例,比如ssm-cp文件实例名,据我所知,它并不存在。@Matteo的说法是正确的,如果SSM的全部目的是消除它,为什么我需要ssh密钥?但基本上,你所做的是使用SSM作为一种代理,这样你就可以在不必指定实际IP地址的情况下访问EC2机器(可能是实例没有公共IP,也可能是它有,在这种情况下,你必须将源IP列入安全组的白名单(,所以你只需指定i-id,就可以通过SSM访问EC2实例的端口22,但你可以通过SSH(密钥和用户(进行身份验证。SCP通过SSH工作,所以你仍然需要一个KEY来使用它。我再次认为大多数人所期望的只是普通的ssm-cp文件实例。

最新更新