技術課の山本です。こんにちは。
機会があったので触りました。
Terraform で Resorces や Modules を使用して、セキュリティグループを作成してみる
Resources とは
Resources Overview - Configuration Language | Terraform | HashiCorp Developer
Resources are the most important element in the Terraform language. Each resource block describes one or more infrastructure objects, such as virtual networks, compute instances, or higher-level components such as DNS records.
Resources を使用すると、VPC や セキュリティグループといったインフラのリソースを作成できます。
Modules とは
Modules Overview - Configuration Language | Terraform | HashiCorp Developer
Modules are containers for multiple resources that are used together.
Module を使用すると、複数のリソース (Resources) ををまとめて作成できます。
セキュリティグループを Resources (resource ブロック)を利用して作成する
resource ブロックを利用して、front 用、rds 用 の 2 つのセキュリティグループを作成しています。
resource ブロックは以下の 2 つがあります。
- セキュリティグループを作成する resource ブロック
- セキュリティグループのインバウンドルールを作成する resource ブロック
securitygroup.tf
# front 用のセキュリティグループを作成 resource "aws_security_group" "front" { name = "front-sg1" vpc_id = module.vpc.vpc_id tags = { Name = "front-sg1" } } # front 用のセキュリティグループのインバウンドルール (80 ポート)を作成 resource "aws_vpc_security_group_ingress_rule" "front1" { from_port = 80 to_port = 80 ip_protocol = "tcp" security_group_id = aws_security_group.front.id cidr_ipv4 = "0.0.0.0/0" } # front 用のセキュリティグループのインバウンドルール (443 ポート)を作成 resource "aws_vpc_security_group_ingress_rule" "front2" { from_port = 443 to_port = 443 ip_protocol = "tcp" security_group_id = aws_security_group.front.id cidr_ipv4 = "0.0.0.0/0" } # rds 用のセキュリティグループを作成 resource "aws_security_group" "rds" { name = "rds-sg1" vpc_id = module.vpc.vpc_id tags = { Name = "rds-sg1" } } # rds 用のセキュリティグループのインバウンドルール (5432 ポート)を作成 resource "aws_vpc_security_group_ingress_rule" "rds1" { from_port = 5432 to_port = 5432 ip_protocol = "tcp" security_group_id = aws_security_group.rds.id cidr_ipv4 = "10.0.0.0/16" }
Resources (resource ブロック)を利用して作成したセキュリティグループ
front のセキュリティグループは以下のようになりました。省略したセキュリティグループの説明は「Managed by Terraform」となっていました。
アウトバウンドルールは作成していないのでありません。
rds 用のセキュリティグループも同様でした。
セキュリティグループを Modules (module ブロック) を利用して作成する
terraform-aws-modules にある security-group の module を利用して front 用、rds 用 の 2 つのセキュリティグループを作成しています。
Module は自分で作成してもいいです。本記事ではコミュニティが提供しているものを利用します。
ソースコードは右のリンクにあります。GitHub - terraform-aws-modules/terraform-aws-security-group: Terraform module which creates EC2-VPC security groups on AWS 🇺🇦
securitygroup.tf
# front 用のセキュリティグループを作成 module "front-security_group" { source = "terraform-aws-modules/security-group/aws" name = "front-sg1" #description = "front-sg1" vpc_id = module.vpc.vpc_id ingress_cidr_blocks = ["0.0.0.0/0"] ingress_rules = ["http-80-tcp","https-443-tcp"] } # rds 用のセキュリティグループを作成 module "rds-security_group" { source = "terraform-aws-modules/security-group/aws" name = "rds-sg1" #description = "rds-sg1" vpc_id = module.vpc.vpc_id ingress_with_cidr_blocks = [ { rule = "postgresql-tcp" cidr_blocks = "10.0.0.0/16" }, ] }
補足
auto_groups には、よく使うルールがエイリアスで定義されているため、例えば 0.0.0.0/0 から http (80) 通信を許可する場合は以下の記述をします。
ingress_cidr_blocks = ["0.0.0.0/0"] ingress_rules = ["http-80-tcp"]
また、送信元が同じ CIDR ブロックの場合、リスト形式で記述可能です。 0.0.0.0/0 に http (80) , https (443) を許可する例です。
ingress_cidr_blocks = ["0.0.0.0/0"] ingress_rules = ["http-80-tcp","https-443-tcp"]
auto_groups に定義していないポートについてはユーザー定義として記述可能です。 AWS EC2-VPC Security Group Terraform module にある例から抜粋します。
ingress_with_cidr_blocks = [ { from_port = 8080 to_port = 8090 protocol = "tcp" description = "User-service ports" cidr_blocks = "10.10.0.0/16" },
Modules (module ブロック) を利用して作成したセキュリティグループ
front のセキュリティグループは以下のようになりました。省略したセキュリティグループの説明は「Security Group managed by Terraform」となっていました。
セキュリティグループ名の後ろに日付時刻の文字列が入っていました。
省略したインバウンドのルールの説明には HTTP , HTTPS と入っています。
アウトバウンドルールは作成していないのでありません。
rds 用のセキュリティグループも同様でした。省略したインバウンドのルールの説明には Ingress Rule と入っています。
まとめ
Resource を利用して記述する場合は、セキュリティグループとルールのそれぞれを resource ブロックで定義し、対応付けをする必要があります。
Modules を利用して記述する場合は、セキュリティグループ 1 つに対し module を 1 つ作成する形式になります。そのため、コード量が少なくなり 1 つのセキュリティグループにどのようなルールがあるか分かりやすいと感じました。
コードを直感的に理解できる記述 (メンタルモデルがある状態 ) になっており、良いなと感じました。
コミュニティの提供している Module を使用するときは将来性だったり、仕様面 (名前に識別子が自動付与されるなど)に注意すると良さそうです。
余談
朝晩寒くなってきました。
お身体にお気をつけてお過ごし下さい。🐱
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。残すは OSJ koumi 100 で 100 mile 走ります。実際には 175 km らしいです。「草 100 km / mile」 もたまに企画します。
基本的にのんびりした性格です。座右の銘は「いつか着く」