😽
Terraform × Security Groupでセキュリティグループを設定した
目的
- せっかくなのでクラウドインフラへの知見を深めたい。
- AWS Cognitoを活用しているので、インフラ構成はAWSを用いる。
- Terraformでの管理を前提とする。
目指すもの
- 個人で開発した「認証機能しかないアプリ」を本番環境で運用したい。
- まずはECRに登録したコンテナイメージをECS上にデプロイするところまでを目標とする。
- セキュリティグループを設定する。
セキュリティグループ
- 関連付けられたリソースに到達するトラフィックおよびリソースから離れるトラフィックを制御する。
- インスタンスやサブネット単位で設定できる。
- ステートフル。
- リクエスト方向の通信設定を許可すると、レスポンスの許可は明示しなくても良い。
Securty Group(ECS[Nginx])
- ECS[Nginx]に対して
- インバウンド通信元をALBのみに限定する。(ポート:
8080
→8080
) - アウトバウンドについては制限しない。
- インバウンド通信元をALBのみに限定する。(ポート:
- ECS[Nginx]に対するセキュリティグループとPrivate Subnetを紐づける。
### Nginx
resource "aws_security_group" "nginx" {
name = "nginx"
vpc_id = var.private_subnet_vpc_id
}
- インバウンド通信元をALBのみに限定する。(ポート:
8080
→8080
)
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]のみに限定する。(ポート:
3000
→3000
) - アウトバウンドについては制限しない。
- インバウンド通信元をECS[Nginx]のみに限定する。(ポート:
- ECS[App]に対するセキュリティグループとPrivate Subnetを紐づける。
resource "aws_security_group" "app" {
name = "app"
vpc_id = var.private_subnet_vpc_id
}
- インバウンド通信元をECS[Nginx]のみに限定する。(ポート:
3000
→3000
)
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
) - アウトバウンドについては制限しない。
- インバウンド通信元をECSのみに限定する。(ポート:
- 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