🌊
【Terraform】セキュリティグループの作成
はじめに
Terraformで下記のセキュリティグループを作成していきます。
VCPなどは前回の続きです。
ファイル構成
.
├── main.tf
├── network.tf
├── security_group.tf
└── terraform.tfvars」
セキュリティグループの作成
下記2つを設定。
aws_security_group
- name : string : セキュリティグループ名
- descriptioon : string : 説明
- vpc_id : string : VPC ID
- tags : object : タグ
aws_security_group_rule
- security_group_id : string : セキュリティグループID
- type : enum : ingreee,egress
- protocol : enum : tcp,udp,icmpなど
- from_port : number : 開始ポート番号または開始ICMPタイプ番号
- to_port : number : 終了ポート番号または終了ICMPタイプ番号
- cidr_blocks : string[] : CIDRブロック
- source_security_group_id : string : アクセス許可したいセキュリティグループID
プレフィックスリスト
AWSが管理するIPアドレスレンジのリスト。
これにより、最新のIPアドレスレンジを手動で更新する必要が無くなる。
例えば、Amazon S3やCloudFront等のサービスに対しアクセスを制限する場合、プレフィックスリストを利用することで簡単に設定が可能になる。
今回S3のプレフィックスリストを使用するため、data.tfにその記述を書いていく。
nameはS3のマネジメントコンソール>マネージドプレフィックスリストで確認。
data.tf
data "aws_prefix_list" "s3_pl" {
name = "com.amazonaws.*.s3"
}
apply後にterraform.tfstateに追加されていることを確認。
security_group.tf
security_group.tf
#------------------
#Scurity Group
#------------------
#web security group
resource "aws_security_group" "web_sg" {
name = "${var.project}-${var.environment}-web-sg"
description = "web front role security group"
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.environment}-web-sg"
Project = var.project
Env = var.environment
}
}
resource "aws_security_group_rule" "web_in_http" {
security_group_id = aws_security_group.web_sg.id
type = "ingress"
protocol = "tcp"
from_port = 80
to_port = 80
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "web_in_https" {
security_group_id = aws_security_group.web_sg.id
type = "ingress"
protocol = "tcp"
from_port = 443
to_port = 443
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "web_in_tcp3000" {
security_group_id = aws_security_group.web_sg.id
type = "egress"
protocol = "tcp"
from_port = 3000
to_port = 3000
source_security_group_id = aws_security_group.app_sg.id
}
#app security group
resource "aws_security_group" "app_sg" {
name = "${var.project}-${var.environment}-app-sg"
description = "application server role security group"
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.environment}-app-sg"
Project = var.project
Env = var.environment
}
}
resource "aws_security_group_rule" "app_in_tcp3000" {
security_group_id = aws_security_group.app_sg.id
type = "ingress"
protocol = "tcp"
from_port = 3000
to_port = 3000
source_security_group_id = aws_security_group.web_sg.id
}
resource "aws_security_group_rule" "app_out_http" {
security_group_id = aws_security_group.app_sg.id
type = "egress"
protocol = "tcp"
from_port = 80
to_port = 80
prefix_list_ids = [data.aws_prefix_list.s3_pl.id]
}
resource "aws_security_group_rule" "app_out_https" {
security_group_id = aws_security_group.app_sg.id
type = "egress"
protocol = "tcp"
from_port = 443
to_port = 443
prefix_list_ids = [data.aws_prefix_list.s3_pl.id]
}
resource "aws_security_group_rule" "app_out_tcp3306" {
security_group_id = aws_security_group.app_sg.id
type = "egress"
protocol = "tcp"
from_port = 3306
to_port = 3306
source_security_group_id = aws_security_group.db_sg.id
}
#Database security group
resource "aws_security_group" "db_sg" {
name = "${var.project}-${var.environment}-db-sg"
description = "Database role security group"
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.environment}-db-sg"
Project = var.project
Env = var.environment
}
}
resource "aws_security_group_rule" "db_in_tcp3306" {
security_group_id = aws_security_group.db_sg.id
type = "ingress"
protocol = "tcp"
from_port = 3306
to_port = 3306
source_security_group_id = aws_security_group.app_sg.id
}
Discussion