Terraform和S3-如何将文件上传到现有存储桶

时间:2019-04-24 20:17:12

标签: amazon-web-services amazon-s3 terraform terraform-provider-aws

如何在不破坏存储桶内容或重新创建存储桶的情况下将文件上传到现有的s3存储桶(从terraform基础结构创建)。

terraform {
  backend "s3" {
    bucket = "terraformtests"
    key    = "terraformstate.tf"
    region = "us-east-1"
  }
}


resource "aws_s3_bucket_object" "terraformtests" {
  bucket = "terraformtests"
  key    = "test/prod/1000/keys"
  source = "deploy"
  etag   = "${md5(file("keys"))}"

}

这就是我所拥有的。它在第一次运行时运行良好,并将其上传到键空间“ 1000”。当我对其进行编辑并以1001重新运行时,该脚本将尝试销毁test / prod / 1000 / keys中先前创建的文件。我要做的就是

  • 导入现有表状态而不重新创建
  • 在不触摸表的先前内容的情况下,将文件夹添加到键空间。

1 个答案:

答案 0 :(得分:0)

您得到的结果是Terraform预期的结果。

TF在 .tfstate 文件中维护基础结构的“状态”。它们是上次同步基础架构时的镜像。

.tf 文件中描述了所需的基础结构状态。

运行terraform planterraform apply命令比较 .tf .tfstate 文件。然后, .tfstate 中存在的而不是 .tf 中没有的所有资源都会被破坏

在您的情况下,它在上一次运行的 .tfstate 中具有 keyspace 1000 ,但在 .tf 中却没有,因为您已对其进行了编辑到 1001

解决方法

    根据Winston的评论
  1. 使用AWS CLI
  2. 为密钥空间1001添加另一种资源,而不是编辑已有的资源

另外,我注意到您有

source = "deploy"
etag = "${md5(file("keys"))}"

通常,它们应该引用相同的文件:

source = "readme.md"
etag = "${filemd5("readme.md")}"