【问题标题】:How to create folder on S3 from Ec2 instance如何从 Ec2 实例在 S3 上创建文件夹
【发布时间】:2021-10-28 22:39:33
【问题描述】:

我想从 Ec2 instacne 在 S3 存储桶中创建文件夹。我尝试了 put 对象,但它不起作用。有什么方法可以使用 cli 从 ec2 instace 在 s3 上创建文件夹。

【问题讨论】:

标签: amazon-web-services amazon-s3 aws-cli


【解决方案1】:

您无需创建文件夹即可将项目放入其中。例如,只需运行以下命令,s3 将创建文件夹(如果它们不存在):

aws s3 cp ./testfile s3://yourBucketName/any/path/you/like

如果您想递归使用 cp,您可以指定 --recursive 选项,或使用“aws s3 sync”。

如果您的命令不起作用,那么您可能有权限问题。粘贴您的错误,以便我们为您提供帮助。

【讨论】:

  • 只是一个小的使用点:如果你像上面那样复制一个文件,你最终会得到一个名为 s3://yourBucketName/any/path/you/like 的文件如果你在路径中添加以下 / (在类似之后)你最终会在 s3://yourBucketName/any/path/you/like/ 中得到一个名为 testfile 的文件
  • 对某些人来说可能很明显,但是您必须在当前工作目录中有一个名为“testfile”的文件才能使答案中的命令起作用。通过执行 'touch testfile' 在类似 bash 的终端中快速创建这样的文件。
【解决方案2】:
aws s3api put-object --bucket bucketname --key foldername/  

这个命令就像一个魅力。 感谢 AWS 支持。

【讨论】:

    【解决方案3】:
    aws s3 sync <folder_name> s3://<you-prefix>/<some_other_folder>/<folder_name>
    

    【讨论】:

      【解决方案4】:

      请记住,S3 是一个对象存储。它不处理文件夹。

      如果您创建 /xyz/ 并上传文件调用 /xyz/foo.txt ,它们实际上是 2 个不同的对象。如果你删除 /xyz/ ,它不会删除 /xyz/foo.txt。

      S3 控制台允许您“创建文件夹”,但是在您玩过它之后,您会注意到,您不能重命名文件夹,或者做任何可以玩文件夹的事情(例如移动树结构,递归地指定访问权限)

      在 S3 中,有一个叫做“PREFIX”的东西,API 允许您列出/过滤带有特定“前缀”的文件,让您处理抽象。

      如上所述,由于您无法执行文件系统文件夹之类的操作,因此如果您想要执行诸如将一个文件夹移动到另一个文件夹之类的任务,您需要编写自己的代码来“重写”文件名(具体来说, 在 S3) 中为“Key”, 即复制到新的对象名并删除旧的对象。

      如果您想在 S3 上构建高级控制,您可以选择任何 AWS 开发工具包来执行此操作。 https://aws.amazon.com/tools/

      您可以使用 API 函数调用 put_object()(命名因 SDK 语言而异)并证明这些事实(大部分都可以在 AWS 文档中找到)

      更新:因为@Tom 提出了这些问题。

      您无法使用 AWS cli 创建虚拟文件夹(也许 @Tom 可以展示如何),唯一的方法是使用 AWS SDK put_object()

      让我们试试这个 首先我在 shell 中创建虚拟文件

      echo "dummy">test.txt
      

      那就试试用python aws sdk

      import boto3 
      s3=boto3.client("s3")
      s3.create_bucket(Bucket="dummy")
      # now create so call xyz/ "empty virtual folder"
      s3.put_object(Bucket="dummy", Key="xyz/")
      # now I put above file name to S3 , call xyz/test.txt
      # First I must open the file, because put_object only take bytes or file object
      myfile=open("test.txt")
      s3.put_object(Bucket="dummy", Key="xyz/test.txt")
      

      现在,转到您的命令外壳,启动您的 AWS CLI(或继续使用 boto3)

      # check everything
      aws s3 ls s3://dummy --recursive
      
      #now delete the so call "folder" 
      aws s3 rm s3://dummy/xyz/
      
      # And you see the file "xyz/test.txt" is still there 
      aws s3 s3://dummy --recursive
      

      【讨论】:

      • 这并不完全准确:如果您创建 /xyz/ 并上传一个名为 /xyz/foo.txt 的文件,则 /xyz/ 不被视为对象并且您无法删除它(您会得到一个 404 键“/xyz/”不存在)。真正的关键是 /xyz/foo.txt 而对象实际上是你的文件。
      • @Tom,我已经写了一个经过验证的脚本,请检查您是否可以使其无效。
      • 很奇怪,因为根据我的测试,我得到了 404。此外,基于 S3 的功能,“xyz”绝对不是键,因为它不对应于键/值存储的实际值.所以删除它实际上什么也没有。在 S3 中,文件夹不是密钥,而是密钥的一部分。这是我的测试的要点链接,也有可能我错过了某事(永远不要说“从不”:p)所以如果你发现我这边有问题,请告诉我:gist.github.com/anonymous/7ee3cf435cfd503a333478f9018ea2f6
      • @Tom ,这就是我所怀疑的,AWS CLI 不允许“空文件夹名称”。这就是我创建 boto3 代码以显示可以创建“任意文件夹”(AKA 空密钥对象)的原因;-D
      • 所以基本上我认为我们说的是同一件事。 boto3 可能会隐藏此 404,但 AWS 端实际上并没有发生任何事情,并且该对象仍然可用
      【解决方案5】:

      您可以在 AWS 官方博客中找到命令:

      http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html

      还有其他不同的工具可用于在 S3 中创建 Bucket/ 文件夹。已知工具之一是可用于 Windows 服务器的 S3Browser。将其安装在您的 EC2 实例上并提供您的 AWS 访问密钥和秘密密钥以访问 S3。这个工具提供了简单的用户界面来做到这一点。

      【讨论】:

      • 我知道很多 SO 用户不喜欢只有一个链接的答案,因为一旦链接失效,那么答案就不再有用了。所以也许这就是你被否决的原因
      • 好的,如果是这样的话,我已经更新了我的答案,现在应该自动从我的答案中删除反对票。
      • 请注意,否决票不是自动的。一个用户不喜欢你的答案,因为他没有具体说明,我对你投了反对票,我只是为此提出一个合理的解释。所以不幸的是,在您获得投票之前,您的分数将保持为“-1”
      • 这仍然不能真正回答所提出的问题。 “如何在 S3 上创建文件夹?”的答案不是“嘿,看看这些工具,然后自己弄清楚。”请查看此元讨论以获取指导:meta.stackexchange.com/questions/8231/…
      【解决方案6】:

      没有 cli 命令可让您简单地在 s3 存储桶中创建文件夹。要创建此文件夹,我将使用以下命令,该命令会创建一个空文件,其中没有任何内容。但是如果你删除文件,只要你之后没有添加任何其他内容,你就会删除该文件夹

      aws s3api put-object --bucket bucket_name --key folder_name/empty.csv
      

      【讨论】:

        猜你喜欢
        • 2012-05-14
        • 2012-08-09
        • 2017-03-26
        • 2023-03-07
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 2021-04-14
        相关资源
        最近更新 更多