7

2 つの VPC セキュリティ グループを作成したいと考えています。

1 つは VPC の Bastion ホスト用で、もう 1 つはプライベート サブネット用です。

# BASTION # 
resource "aws_security_group" "VPC-BastionSG" {
  name        = "VPC-BastionSG"
  description = "The sec group for the Bastion instance"
  vpc_id      = "aws_vpc.VPC.id"

  ingress {
      from_port = 22
      to_port   = 22
      protocol  = "tcp"
      cidr_blocks = ["my.super.ip/32"]
  } 

  egress {
      # Access to the Private subnet from the bastion host[ssh]
      from_port = 22
      to_port   = 22
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-PrivateSG.id}"]
  }
  egress {
      # Access to the Private subnet from the bastion host[jenkins]
      from_port = 8686
      to_port   = 8686
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-PrivateSG.id}"]
  }

  tags = {
    Name = "VPC-BastionSG"
  }
}

# PRIVATE #
resource "aws_security_group" "VPC-PrivateSG" {
  name        = "VPC-PrivateSG"
  description = "The sec group for the private subnet"
  vpc_id      = "aws_vpc.VPC.id"

  ingress {
      from_port = 22
      to_port   = 22
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-BastionSG.id}"]
  }
  ingress {
      from_port = 80
      to_port   = 80
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-PublicSG.id}"]
  }
  ingress {
      from_port = 443
      to_port   = 443
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-PublicSG.id}"]
  }
  ingress {
      from_port = 3306
      to_port   = 3306
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-PublicSG.id}"]
  }
  ingress {
      from_port = 8686
      to_port   = 8686
      protocol  = "tcp"
      security_groups = ["${aws_security_group.VPC-BastionSG.id}"]
  }
  ingress {
      # ALL TRAFFIC from the same subnet
      from_port = 0
      to_port   = 0
      protocol  = "-1"
      self      = true
  }
  egress {
      # ALL TRAFFIC to outside world
      from_port = 0
      to_port   = 0
      protocol  = "-1"
      cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "VPC-PrivateSG"
  }
}

するとterraform plan、次のエラーが返されます。

**`Error configuring: 1 error(s) occurred:
* Cycle: aws_security_group.VPC-BastionSG, aws_security_group.VPC-PrivateSG`**

PrivateSG から BastionSG のイングレス ルールをコメント アウトすると、プランは正常に実行されます。

また、BastionSG から PrivateSG のエグレス ルールをコメント アウトすると、正常に実行されます。

パブリック/プライベート サブネットと Bastion ホストを使用して VPC を構築するためのAWS シナリオ 2 では、セットアップしようとしているアーキテクチャについて説明しています。

AWS コンソールを介して構成されたまったく同じ設定があり、正常に再生されます。

Terraform がそれを受け入れないのはなぜですか? Bastion セキュリティ グループを Private セキュリティ グループに接続する別の方法はありますか?

編集

私が理解しているように、2 つの秒グループの間に循環参照があり、AWS では有効であっても何らかの形で中断する必要があります。

そこで、Bastion sec グループからのすべてのアウトバウンド トラフィック (0.0.0.0/0) を許可し、個々のセキュリティ グループには指定しないことを考えました。

セキュリティに悪影響を与えるでしょうか?

4

1 に答える 1

27

Terraform は、作業中のフォルダーで定義されているすべてのリソースの依存関係チェーンを構築しようとします。これを行うことで、特定の順序でビルドする必要がある場合にうまく機能し、すべてがどのように機能するかのかなりの鍵となります。

各セキュリティグループが既に作成されている他のセキュリティグループに依存している循環依存関係があるため (Terraform が有益に指摘しているように)、この例は失敗します。

これらは解決するのが難しい場合があり、何をしようとしているのかを再考する必要があることを意味する場合があります (言及したように、1 つのオプションは、単純に踏み台ホストからのすべての送信トラフィックを許可し、プライベートの受信トラフィックのみを制限することです)。インスタンス) ですが、この場合、aws_security_group_ruleリソースをリソースと組み合わせて使用​​するオプションがありますaws_security_group

これは、最初にルールを含まない空のセキュリティ グループを定義して、グループ用に作成したセキュリティ グループ ルールのターゲットとして使用できることを意味します。

簡単な例は次のようになります。

resource "aws_security_group" "bastion" {
  name = "bastion"
  description = "Bastion security group"
}

resource "aws_security_group_rule" "bastion-to-private-ssh-egress" {
    type = "egress"
    from_port = 22
    to_port = 22
    protocol = "tcp"
    security_group_id = "${aws_security_group.bastion.id}"
    source_security_group_id = "${aws_security_group.private.id}"
}

resource "aws_security_group" "private" {
  name = "private"
  description = "Private security group"
}

resource "aws_security_group_rule" "private-from-bastion-ssh-ingress" {
    type = "ingress"
    from_port = 22
    to_port = 22
    protocol = "tcp"
    security_group_id = "${aws_security_group.private.id}"
    source_security_group_id = "${aws_security_group.bastion.id}"
}

これで、Terraform は、依存関係チェーンが、これらのセキュリティ グループ ルールのいずれかの前に両方のセキュリティ グループを作成する必要があることを示していることを確認できます。これは、両方のセキュリティ グループが既に作成されているグループに依存しているためです。

于 2016-07-07T21:12:17.513 に答える