AWS ec2 使用 Terraform 创建具有 SSH 访问权限的 ec2 实例。 resource "aws_instance" "inst1" { instanc-6ren">
gpt4 book ai didi

amazon-web-services - 使用 Terraform 将文件传递给新创建的 ec2 实例而不共享 "connection"部分中的私钥

转载 作者:行者123 更新时间:2023-12-02 01:37:16 26 4
gpt4 key购买 nike

我的设置是:地形 --> AWS ec2

使用 Terraform 创建具有 SSH 访问权限的 ec2 实例。

resource "aws_instance" "inst1" {
instance_type = "t2.micro"
ami = data.aws_ami.ubuntu.id
key_name = "aws_key"
subnet_id = ...
user_data = file("./deploy/templates/user-data.sh")

vpc_security_group_ids = [
... ,
]
provisioner "file" {
source = "./deploy/templates/ec2-caller.sh"
destination = "/home/ubuntu/ec2-caller.sh"
}

provisioner "remote-exec" {
inline = [
"chmod +x /home/ubuntu/ec2-caller.sh",
]
}

connection {
type = "ssh"
host = self.public_ip
user = "ubuntu"
private_key = file("./keys/aws_key_enc")
timeout = "4m"
}
}

上面的位有效,我可以看到供应商正在复制和执行“ec2-caller.sh”。我不想将我的私钥以明文形式传递给 Terraform 供应商。无论如何我们可以将文件复制到新创建的 ec2 而无需使用配置器或不将私钥传递给配置器?

干杯。

最佳答案

Terraform 文档部分 Provisioners are a Last Resort提出了提供和传递凭据的必要性,作为提供者成为“最后手段”的理由之一,然后继续为 passing data into virtual machines and other compute resources 建议一些其他策略.

您似乎已经在使用 user_data 来指定要运行的其他一些脚本,因此要遵循该文档中的建议,需要将这些全部组合到一个 cloud-init 中。配置。 (我假设您的 AMI 已安装 cloud-init,因为这通常负责将 user_data 解释为要执行的 shell 脚本。)

Cloud-init 支持 several different user_data formats , 主要的是 cloud-init's own YAML configuration file format, "Cloud Config" .您还可以使用 multipart MIME message将多个不同的 user_data 有效负载打包到一个 user_data 主体中,只要有效负载的组合大小符合 EC2 的 user_data 上限大小,即 16kiB。

从您的配置来看,您似乎需要 cloud-init 处理两个步骤才能使用 cloud-init 完全解决此问题:

  • 运行 ./deploy/templates/user-data.sh 脚本。
  • /home/ubuntu/ec2-caller.sh 放在具有适当权限的磁盘上。

假设这两个步骤相互独立,您可以向 cloud-init 发送一个多部分 MIME 消息,其中包括您最初单独使用的用户数据脚本 一个 Cloud Config YAML 配置,用于将 ec2-caller.sh 文件放在磁盘上。 The Terraform provider hashicorp/cloudinit有数据源cloudinit_config它知道如何为 cloud-init 构建多部分 MIME 消息,您可以像这样使用它:

data "cloudinit_config" "example" {
part {
content_type = "text/x-shellscript"
content = file("${path.root}/deploy/templates/user-data.sh")
}

part {
content_type = "text/cloud-config"
content = yamlencode({
write_files = [
{
encoding = "b64"
content = filebase64("${path.root}/deploy/templates/ec2-caller.sh")
path = "/home/ubuntu/ec2-caller.sh"
owner = "ubuntu:ubuntu"
permissions = "0755"
},
]
})
}
}

resource "aws_instance" "inst1" {
instance_type = "t2.micro"
ami = data.aws_ami.ubuntu.id
key_name = "aws_key"
subnet_id = ...
user_data = data.cloudinit_config.example.rendered

vpc_security_group_ids = [
... ,
]
}

上面的第二个部分 block 包括基于云初始化示例的 YAML Writing out arbitrary files ,您可以引用它以了解其他可能的设置。 Terraform's yamlencode function无法生成该示例中某些文件中使用的特殊 !!binary 标记,但设置 encoding: b64 允许传递 base64 编码的文本作为一个普通的字符串。

关于amazon-web-services - 使用 Terraform 将文件传递给新创建的 ec2 实例而不共享 "connection"部分中的私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72159273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com