使用 terraform 从 aws s3 下载 zip 文件

使用 terraform 从 aws s3 下载 zip 文件

我似乎找不到可以帮助我使用 terraform 将 zip 文件从 aws s3 下载到实例的文档,有人可以帮我找到解决方案吗?

谢谢。

答案1

根据您的需要,有多种方法可以从 S3 下载文件。


  • 选项 1.1。您可以使用remote-exec提供者。这个是MIME不可知论者。
resource "aws_instance" "web" {
  ## [...]

  provisioner "remote-exec" {
    command = "curl -XGET [...]"
  }
}
  • 选项 1.2。您可以使用null_resource使用适当的扳机。
resource "null_resource" "cluster" {
  # Changes to any instance of the cluster requires re-provisioning
  triggers = {
    cluster_instance_ids = "${join(",", aws_instance.cluster.*.id)}"
  }

  # Bootstrap script can run on any instance of the cluster
  # So we just choose the first in this case
  connection {
    host = "${element(aws_instance.cluster.*.public_ip, 0)}"
  }

  provisioner "remote-exec" {
    # Bootstrap script called with private_ip of each node in the cluster
    inline = [
      "bootstrap-cluster.sh ${join(" ", aws_instance.cluster.*.private_ip)}",
    ]
  }
}

它可以完美地与文本文件配合使用。

data "aws_s3_bucket_object" "secret_key" {
    bucket = "awesomecorp-secret-keys"
    key    = "awesomeapp-secret-key"
}

resource "aws_instance" "web" {
  ## [...]
  provisioner "file" {
    content     = data.aws_s3_bucket_object.secret_key.body
    destination = /tmp/file
  }
}

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  user_data     = [...]

  tags = {
    Name = "HelloWorld"
  }
}

记得举个例子IAM 角色具有适当的权限,如果您从实例执行命令,或者向角色授予适当的权限,则执行Terraform

笔记:话虽如此,我怀疑这Terraform是否是实例配置的最佳选择。看看SaltStackAnsible或者厨师。这些是专为与实例配置配合使用而设计的工具。

答案2

您的问题不清楚。

  1. 你想实现什么?(即为什么你需要 zip 文件?是配置、部署还是其他什么)
  2. 这是一个 Terraform 问题吗?(即,在 Terraform 运行期间您是否需要该 zip 文件?或者 Terraform 是您唯一的工具,而您正在寻找其他东西?)
  3. 你试过什么了?

假设您不需要 Terraform 中的文件,那么我建议编写一个cloud-init 脚本用于文件下载。使用 Terraform 配置所有 IAM 权限,并将脚本写入实例的用户数据。然后在启动时,服务器运行 cloud-init 并使用curl/ wget(来自公共 URL)或使用aws s3(通过实例配置文件进行身份验证)下载文件。

答案3

这不清楚,但我想您问的是如何将文件下载到您用 terraform 创建的实例?

这应该通过 user_data 脚本或实例映像上的配置管理软件来完成。terraform 中没有可以执行此操作的资源

答案4

万一其他人从 Google 来到这里,因为它在搜索结果中排名很高,我怀疑 OP 可能正在做我想做的事情 - 使用 Zip 文件作为 Lambda 函数的源。这是最简单的解决方案:

data "aws_s3_object" "source_code" {
  bucket        = "my-source-code-bucket"
  checksum_mode = "ENABLED"
  key           = "source-code.zip"
}

resource "aws_lambda_function" "lambda_function" {
  function_name    = "my-function"
  role             = "arn:aws:iam::012345678901:role/my-lambda-role"
  s3_bucket        = data.aws_s3_object.source_code.bucket
  s3_key           = data.aws_s3_object.source_code.key
  source_code_hash = data.aws_s3_object.source_code.checksum_sha256
}

相关内容