【问题标题】:Running Hashicorp Vault server on AWS EC2 instance on "provisioner" block在“provisioner”块上的 AWS EC2 实例上运行 Hashicorp Vault 服务器
【发布时间】:2019-01-15 07:45:26
【问题描述】:

我正在创建一个 AWS 实例,并尝试在创建后运行一个 Vault 服务器。我的问题是创建过程永远不会完成,因为服务器没有在后台运行。这是我的配置:

resource "aws_instance" "web" {
  ami           = "ami-466768ac"
  instance_type = "t2.micro"
  key_name = "my_key"

  tags {
    Name = "Vault"
  }

  provisioner "remote-exec" {

    connection {
      type        = "ssh"
      agent       = false
      user        = "ec2-user"
      private_key = "${file("/path/to/my_key")}"
    }

    inline = [
      "curl -O https://releases.hashicorp.com/vault/0.10.4/vault_0.10.4_linux_amd64.zip",
      "unzip vault_0.10.4_linux_amd64.zip",
      "./vault server -dev -dev-listen-address=0.0.0.0:8200"
    ]
  }

}

基本上,我通过 curl 下载 Vault 并运行开发服务器。服务器实际运行(我在终端日志中看到),但实例创建(由 Terraform)从未完成:

aws_instance.web: Still creating... (40s elapsed)
aws_instance.web: Still creating... (50s elapsed)
aws_instance.web: Still creating... (1m0s elapsed)
aws_instance.web: Still creating... (1m10s elapsed)
aws_instance.web: Still creating... (1m20s elapsed)
aws_instance.web: Still creating... (1m30s elapsed)
...

我尝试在启动 Vault 服务器命令的末尾添加 &,以免阻塞 shell,但是当我这样做时,实例已创建但 Vault 服务器并未实际启动。

如何在创建实例时以后台模式启动服务器?

编辑

我也试过nohup:

nohup ./vault server -dev -dev-listen-address=0.0.0.0:8200

但是当 terraform 完成时服务器没有启动...

【问题讨论】:

  • 不确定是否要将此服务器保留在保管库中,但将其设置为服务并启动它可能是一个有效的选择;)

标签: amazon-web-services amazon-ec2 terraform hashicorp-vault


【解决方案1】:

最后,正如@StephenKing 在评论中告诉我的那样,我创建了一个 systemd 服务。这是我的配置:

resource "aws_instance" "web" {
  ami           = "ami-466768ac"
  instance_type = "t2.micro"
  key_name = "my_key"

  tags {
    Name = "Vault"
  }

  //upload vault.service file (systemd unit)
  provisioner "file" {
    connection {
      type        = "ssh"
      agent       = false
      user        = "ec2-user"
      private_key = "${file("/path/to/my/key")}"
    }
    source = "./vault.service"
    destination = "/home/ec2-user/vault.service"
  }

  //download vault and start service
  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      agent       = false
      user        = "ec2-user"
      private_key = "${file("/path/to/my/key")}"
    }
    inline = [
      "curl -O https://releases.hashicorp.com/vault/0.10.4/vault_0.10.4_linux_amd64.zip",
      "unzip vault_0.10.4_linux_amd64.zip",
      "sudo mv /home/ec2-user/vault.service /etc/systemd/system/",
      "sudo systemctl start vault.service"
    ]
  }

}

vault.service

[Unit]
Description=Vault dev server

[Service]
ExecStart=/home/ec2-user/vault server -dev -dev-listen-address=0.0.0.0:8200 

【讨论】:

    【解决方案2】:

    这真的不是 Terraform 特定的事情,如果您要通过 SSH 连接到一个实例并运行您的命令,您会看到它在进程处于前台时被阻塞,并且如果您通过将 & 添加到退出 SSH 会话后,您会看到命令结束。

    这里的解决方案是使用nohup,这样Vault 服务器进程将忽略您的会话存在时触发的HUP(或挂断)信号。

    所以你应该把你的命令改成:

    ...
        inline = [
          "curl -O https://releases.hashicorp.com/vault/0.10.4/vault_0.10.4_linux_amd64.zip",
          "unzip vault_0.10.4_linux_amd64.zip",
          "nohup ./vault server -dev -dev-listen-address=0.0.0.0:8200 &"
        ]
    ...
    

    【讨论】:

    • 谢谢。这说得通。但它仍然无法正常工作......当我通过 ssh “手动”进行操作时,它可以工作。但是当我使用 terraform 时它不会。进程正在被杀死。
    • 答案的第一部分是有道理的,但创建一个 systemd 服务是更好的选择。从 HashiCorp apt repo 安装 Vault 将提供一个合适的单元文件,因此您可以使用几个命令启用和启动 systemd 服务。
    • @RichVel 是的,当然。这个答案是一个更简单的选项,它解决了当前的问题(他们正在尝试运行远程命令并且不希望它在配置程序完成时退出)。我没有考虑在 systemd 服务周围添加任何内容,因为它专门在 dev move 中运行 Vault,但是是的,这里功能齐全的答案将指定一种更好的方式来安装和运行 Vault。我显然也赞成建议使用一项服务的评论,该服务似乎促使 OP 为运行 Vault 发布更完整的答案。
    • 显然我有一个答案建议在stackoverflow.com/a/62388157/2291321 中使用这种方法。我们可能应该选择其中一个作为规范问题,并同时显示 nohup 快速选项和创建服务的更长、更稳定的选项。
    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2018-12-08
    • 2022-10-09
    • 1970-01-01
    • 2020-08-27
    • 2020-10-21
    相关资源
    最近更新 更多