【问题标题】:Downloading a file from s3 to local machine using boto3 (python)使用boto3(python)将文件从s3下载到本地机器
【发布时间】:2020-04-09 12:20:33
【问题描述】:

我正在尝试使用 python 脚本自动将文件从 AWS s3 下载到我的本地计算机。 python 脚本本身托管在 ubuntu(AWS ec2 实例)上,因此它无法识别我本地机器上的目录。

这是我的代码:

import os
import boto3
from boto3.session import Session
print("this script downloads the file from s3 to local machine")

s3 = boto3.resource('s3')

BUCKET_NAME = 'sfbucket.myBucket'
KEY = 'sf_events.json'

s3.Bucket(BUCKET_NAME).download_file(KEY, '/Users/Documents/my_file.json')

print('end')

但是,这给了我以下错误:

FileNotFoundError: [Errno 2] No such file or directory: '/Users/Documents/my_file.json.CDC5FEf4'

谁能告诉我我做错了什么?如果我将输出目录替换为/home/ubuntu/ 它可以正常工作,但我希望该文件在我的本地机器上。提前致谢。

【问题讨论】:

  • 您是否在路径为/Users/Documents 的本地计算机上运行此代码?
  • 我不确定我是否理解您的评论。你是说代码应该是: s3.Bucket(BUCKET_NAME).download_file(KEY, '/Users/Documents/ ?
  • 你在哪里运行整个 python 脚本?如果它与/home/ubuntu 一起工作,则表示一台 linux 机器,但不存在的路径是 Windows 一个
  • 正确 - 我用 ubuntu (linux) 运行它
  • 编辑问题以反映这一点。

标签: python amazon-s3 amazon-ec2 boto3


【解决方案1】:

当您尝试使用 EC2 实例下载文件时,这台机器不知道您的本地路径 /Users/Documents/my_file.json

你有两个选择:

  1. 直接在本地计算机上运行此脚本。 在这种情况下,您必须在本地机器上运行此脚本并确保您有权访问此存储桶。

  2. 在 EC2 实例中运行此脚本并复制。 在这种情况下,您必须将文件下载到某处/home/ubuntu/,然后在您的本地计算机上从 EC2 复制。 你可以使用 [SCP][1]

您可以在本地计算机上安装 SCP 服务器,但问题是您的本地计算机可能没有私有 IP,因此每次本地 IP 更改时,您都必须更新脚本。也许您应该考虑直接在 EC2 实例上对这个文件做任何您需要做的事情,或者如果它是一个真正的手动操作,也许可以通过电子邮件发送?

【讨论】:

  • 埃里克-谢谢。这里的整个目标是能够从云端运行一切;我在 EC2 实例上使用这个 python 脚本,并安排它使用 crontab 每天运行一次。理想情况下,我想找到某种方法将文件从 s3 输出到我的本地机器,而不必在本地运行 python 脚本。
  • 这里最大的问题是,本地机器通常没有私有 IP。如果您的本地机器有,您可以在本地机器上安装 SCP 服务器,然后自动执行脚本以运行 SCP 命令将文件发送到本地机器。
【解决方案2】:

脚本必须在您的本地 Windows 机器上运行而不是在 EC2 实例上。

或者,您可以简单地使用 aws cli

aws s3 cp s3://sfbucket.myBucket/sf_events.json /Users/Documents/my_file.json

【讨论】:

  • iTech - 谢谢,但我已经将这一切设置为从 EC2 实例运行 python 代码,然后使用 crontab 来安排作业。我希望能够在托管在 EC2 实例上的 python 脚本中执行此操作。看起来你已经在上面的命令行中提供了一个解决方案,你有一个可以从 EC2 实例上的 python 脚本运行的解决方案吗?
  • 脚本和命令的结果相同,在 EC2 实例上运行它们会将文件下载到 EC2 实例。
  • 如果您想将文件放在本地机器上,可以从 EC2 实例复制它,或者在本地 Windows 机器上运行命令/脚本。没有其他可能的解决方案。
  • 我是否使用 boto3 从 EC2 实例中复制它?我在哪里可以找到这方面的文档?
  • 如果您有 ssh 从本地机器到 EC2 实例的访问权限,则可以使用 scp 进行复制。老实说,最简单的方法是直接在本地机器上运行命令或脚本。
猜你喜欢
  • 1970-01-01
  • 2019-07-03
  • 2018-09-21
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多