我似乎找不到可以帮助我使用 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)}",
]
}
}
- 选项 2.1。您可以使用
file
和aws_s3_bucket_object
数据资源。
它可以完美地与文本文件配合使用。
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
}
}
- 选项 2.2。您可以使用
http
提供者也一样。
- 选项 3.1。使用
user_data_scripts
自cloud-init
。互联网上有很多问题和类似的帖子。(AWS 开发人员论坛;一个例子使用 Cloudformation 进行身份验证下载)
resource "aws_instance" "web" {
ami = "${data.aws_ami.ubuntu.id}"
instance_type = "t2.micro"
user_data = [...]
tags = {
Name = "HelloWorld"
}
}
记得举个例子IAM 角色具有适当的权限,如果您从实例执行命令,或者向角色授予适当的权限,则执行Terraform
。
笔记:话虽如此,我怀疑这Terraform
是否是实例配置的最佳选择。看看SaltStack,Ansible或者厨师。这些是专为与实例配置配合使用而设计的工具。
答案2
您的问题不清楚。
- 你想实现什么?(即为什么你需要 zip 文件?是配置、部署还是其他什么)
- 这是一个 Terraform 问题吗?(即,在 Terraform 运行期间您是否需要该 zip 文件?或者 Terraform 是您唯一的工具,而您正在寻找其他东西?)
- 你试过什么了?
假设您不需要 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
}