【Terraform】踏み台経由でプライベートサブネットのEC2にミドルウェアをインストールする

こんばんは、表題の件、terraformのprovisionerを使ってプライベートサブネットのEC2に踏み台インスタンス経由でミドルウェアをインストールする方法を記載しています。
なかなか参考になる記事が見つからず苦労したので、メモしておきます。

プライベートサブネットのInstance BにTerraformでInstance A(踏み台)経由でミドルウェアインストールする方法を書いておきます。
下の例ではnginxをInstance BにInstance A経由でインストールしています。

一番重要なところのコードを書いておきます。
Instance B (target)のconnectionに踏み台(bastion)接続関連の情報を記載しております。
Officalでも解説はありますが、これだけではきついわー。
同じ悩みを抱えている人の参考になれば幸いです。

resource "aws_instance" "bastion" {
  ami                         = "ami-0318ecd6d05daa212"
  instance_type               = "t2.micro"
  vpc_security_group_ids      = [aws_security_group.ec2pub.id]
  subnet_id                   = aws_subnet.public1.id
  associate_public_ip_address = true
  key_name                    = aws_key_pair.bastion.id

  tags = {
    Name = "Bastion"
  }
}

resource "aws_eip" "bastion" {
  instance   = aws_instance.bastion.id
  vpc        = true
  depends_on = [aws_internet_gateway.main]
}

resource "aws_instance" "target" {
  ami                    = "ami-0318ecd6d05daa212"
  instance_type          = "t2.micro"
  vpc_security_group_ids = [aws_security_group.ec2pri.id]
  subnet_id              = aws_subnet.private1.id
  key_name               = aws_key_pair.target.id
  depends_on             = [aws_eip.bastion]

  tags = {
    Name = "Target"
  }

  connection {
    type        = "ssh"
    user        = "ec2-user"
    private_key = file("~/.ssh/hoge.pem")
    host        = self.private_ip

    bastion_host        = aws_eip.bastion.public_ip
    bastion_host_key    = aws_key_pair.bastion.id
    bastion_port        = 22
    bastion_user        = "ec2-user"
    bastion_private_key = file("~/.ssh/hoge.pem")
  }

  provisioner "remote-exec" {
    inline = [
      "sudo yum update -y",
      "sudo yum install nginx -y",
      "sudo service nginx start",
    ]
  }
}

大事なポイントはdepends_onでeip作成されるまでtargetインスタンスを作成開始させないようにしたところです

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))

Please share this page:

コメントを残す