Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services terraform能否复制s3存储桶的内容?_Amazon Web Services_Amazon S3_Terraform - Fatal编程技术网

Amazon web services terraform能否复制s3存储桶的内容?

Amazon web services terraform能否复制s3存储桶的内容?,amazon-web-services,amazon-s3,terraform,Amazon Web Services,Amazon S3,Terraform,我正在使用terraform为我们的应用程序管理aws环境。这些环境具有用于各种事情的s3存储桶。在设置新环境时,我只想从基本源bucket或现有环境复制bucket 但我找不到任何能提供副本的东西。AWS界面允许您在创建时复制设置(我不需要),但不复制对象,因此terraform可能无法直接执行 如果是这样的话,那么间接的呢?没有资源可以将对象从一个S3存储桶复制到另一个S3存储桶。如果您想在Terraform设置中包含此项,则需要使用provisioner 它需要执行下面的命令,并支持AWS

我正在使用terraform为我们的应用程序管理aws环境。这些环境具有用于各种事情的s3存储桶。在设置新环境时,我只想从基本源bucket或现有环境复制bucket

但我找不到任何能提供副本的东西。AWS界面允许您在创建时复制设置(我不需要),但不复制对象,因此terraform可能无法直接执行


如果是这样的话,那么间接的呢?

没有资源可以将对象从一个S3存储桶复制到另一个S3存储桶。如果您想在Terraform设置中包含此项,则需要使用provisioner

它需要执行下面的命令,并支持AWS CLI运行
AWS s3 cp

resource "null_resource" "s3_objects" {
  provisioner "local-exec" {
    command = "aws s3 cp s3://bucket1 s3://bucket2 --recursive"
  }
}

为此,要运行本地服务器,需要具有角色(或有效凭据)的来启用副本。

一般来说,Terraform提供程序反映底层API本机支持的操作,但在某些情况下,我们可以同时使用各种地形资源类型来实现底层提供者所缺乏的功能

我相信没有本机S3操作可以将对象从一个bucket大容量复制到另一个bucket,所以要用Terraform解决这个问题,需要将问题分解为更小的步骤,我认为在本例中应该是:

  • 声明一个新的bucket,目标
  • 列出源bucket中的所有对象
  • 在新bucket中为源bucket中的每个对象声明一个对象
AWS提供程序原则上可以执行这三个操作:它为bucket和bucket对象管理资源类型,并且它有一个可以枚举bucket中部分或全部对象的数据源

我们可以将这些部件组合在一个地形配置中,如下所示:

resource "aws_s3_bucket" "target" {
  bucket = "copy-example-target"
}

data "aws_s3_bucket_objects" "source" {
  bucket = "copy-example-source"
}

data "aws_s3_bucket_object" "source" {
  for_each = toset(data.aws_s3_bucket_objects.source.keys)

  bucket = data.aws_s3_bucket_objects.source.bucket
  key    = each.key
}

resource "aws_s3_bucket_object" "target" {
  for_each = aws_s3_bucket_object.source

  bucket  = aws_s3_bucket.target.bucket
  key     = each.key
  content = each.value.body
}
尽管如此,Terraform可能不是解决这种情况的最佳工具,原因如下:

  • 上述配置将导致Terraform将bucket中的所有对象读取到内存中,这将非常耗时,并且对于较大的bucket使用大量RAM,然后最终将所有对象存储在Terraform状态中,这将使状态本身非常大
  • 由于
    aws_s3_bucket_对象
    数据源主要用于检索基于文本的小对象,因此只有当bucket中的所有内容都满足中所述的限制时,上述操作才会起作用:对象必须全部具有指示MIME类型的文本,并且必须全部包含UTF-8编码的文本

在这种情况下,我更愿意使用一个专门的工具来完成这项工作,该工具旨在利用S3API的所有特性,使副本尽可能高效,例如流式传输对象列表,并将每个对象的内容分块流式传输,以避免需要一次将所有数据存储在内存中。AWS CLI本身就有一个这样的工具,它是以
AWS s3 cp
命令的形式,带有
--recursive
选项。

只是为了确认是否请求通过Terraform将s3 bucket的内容复制到新的s3 bucket?是的,总体上是为了创建一个新bucket,并且具有与现有bucket相同的内容。如果这意味着首先创建新的bucket,然后以某种方式将源bucket的内容复制到新bucket中,那就有趣了。我想我能做到。在当地,这将很容易。。。最困难的部分是让它在teamcity内部工作…:)但这完全是一个内部问题。谢谢。没问题,很高兴我能帮上忙:)谢谢你的信息。。。是的,我以为这样的事情是可能的。但担心这也会花很多钱,因为文件实际上必须移动到正在运行的机器上。我希望AWS cli命令到cp实际上不会将文件带到正在运行的主机。但我在谷歌搜索时找不到任何100%的证据。也就是说,我甚至没有考虑到文件内容最终会出现在statefile中。其中一个桶很大。。。cli复制花费了数小时。