😽

Terraform × Security Groupでセキュリティグループを設定した

2024/03/25に公開

目的

  • せっかくなのでクラウドインフラへの知見を深めたい。
    • AWS Cognitoを活用しているので、インフラ構成はAWSを用いる。
    • Terraformでの管理を前提とする。

目指すもの

  • 個人で開発した「認証機能しかないアプリ」を本番環境で運用したい。
  • まずはECRに登録したコンテナイメージをECS上にデプロイするところまでを目標とする。
  • セキュリティグループを設定する。

セキュリティグループ

  • 関連付けられたリソースに到達するトラフィックおよびリソースから離れるトラフィックを制御する。
  • インスタンスやサブネット単位で設定できる。
  • ステートフル。
    • リクエスト方向の通信設定を許可すると、レスポンスの許可は明示しなくても良い。

Securty Group(ECS[Nginx])

  • ECS[Nginx]に対して
    • インバウンド通信元をALBのみに限定する。(ポート:80808080
    • アウトバウンドについては制限しない。
  • ECS[Nginx]に対するセキュリティグループとPrivate Subnetを紐づける。
### Nginx
resource "aws_security_group" "nginx" {
  name   = "nginx"
  vpc_id = var.private_subnet_vpc_id
}
  • インバウンド通信元をALBのみに限定する。(ポート:80808080
resource "aws_security_group_rule" "from_alb_to_nginx_ingress" {
  type                     = "ingress"
  security_group_id        = aws_security_group.nginx.id
  from_port                = var.nginx_port # 8080
  to_port                  = var.nginx_port # 8080
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.alb.id
}
  • アウトバウンドについては制限しない。
resource "aws_security_group_rule" "from_nginx_to_x_egress" {
  type              = "egress"
  security_group_id = aws_security_group.nginx.id
  from_port         = 0
  to_port           = 0
  protocol          = -1
  cidr_blocks       = ["0.0.0.0/0"]
}

Securty Group(ECS[App])

  • ECS[App]に対して
    • インバウンド通信元をECS[Nginx]のみに限定する。(ポート:30003000
    • アウトバウンドについては制限しない。
  • ECS[App]に対するセキュリティグループとPrivate Subnetを紐づける。
resource "aws_security_group" "app" {
  name   = "app"
  vpc_id = var.private_subnet_vpc_id
}
  • インバウンド通信元をECS[Nginx]のみに限定する。(ポート:30003000
resource "aws_security_group_rule" "from_nginx_to_app_ingress" {
  type                     = "ingress"
  security_group_id        = aws_security_group.app.id
  from_port                = var.app_port # 3000
  to_port                  = var.app_port # 3000
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.nginx.id
}
  • アウトバウンドについては制限しない。
resource "aws_security_group_rule" "from_app_to_x_egress" {
  type              = "egress"
  security_group_id = aws_security_group.app.id
  from_port         = 0
  to_port           = 0
  protocol          = -1
  cidr_blocks       = ["0.0.0.0/0"]
}

Securty Group(VPC Endpoint)

  • VPC Endpointに対して
    • インバウンド通信元をECSのみに限定する。(ポート:443
    • アウトバウンドについては制限しない。
  • VPC Endpointに対するセキュリティグループとPrivate Subnetを紐づける。
### VPC Endpoint
resource "aws_security_group" "vpc_endpoint" {
  name   = "vpc_endpoint"
  vpc_id = var.private_subnet_vpc_id
}
  • インバウンド通信元をECS[Nginx & App]のみに限定する。(ポート:443
resource "aws_security_group_rule" "from_nginx_to_vpce_ingress" {
  type                     = "ingress"
  security_group_id        = aws_security_group.vpc_endpoint.id
  from_port                = 443
  to_port                  = 443
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.nginx.id
}

resource "aws_security_group_rule" "from_app_to_vpce_ingress" {
  type                     = "ingress"
  security_group_id        = aws_security_group.vpc_endpoint.id
  from_port                = 443
  to_port                  = 443
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.app.id
}
  • アウトバウンドについては制限しない。
resource "aws_security_group_rule" "from_vpce_to_x_egress" {
  type              = "egress"
  security_group_id = aws_security_group.vpc_endpoint.id
  from_port         = 0
  to_port           = 0
  protocol          = -1
  cidr_blocks       = ["0.0.0.0/0"]
}

ここまでの構成図

Discussion