[初心者向け] Terraform で default セキュリティグループをあつかう

すべての default セキュリティグループのルールを、生まれる前に消し去りたい。すべての宇宙、過去と未来のすべての default セキュリティグループのルールを、この手で。
2020.05.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近 Terraform に入門した西野です。

ひととおりチュートリアルを終え、いざ自分で .tf ファイルを書く段階になった途端、default セキュリティグループのルールを抹消したい欲求がフツフツとわき起こってきました。よくあることだと思います。 *1

Output Variables などを用いてこねくり回さないとだめなのだろうか…?と思いつつ公式ドキュメントを眺めていたところ、ちょうど良い Resource を見つけました。

aws_default_security_group

default セキュリティグループをあつかうための Resource は下記の aws_default_security_group です。

Resource: aws_default_security_group

通常の Resource の場合 Terraform は .tf ファイルにおける宣言によって対象の実体を 作成 します。
この aws_default_security_group の場合、既に存在する default セキュリティグループを 取り込む 動きをし、引数でわたされた設定で上書きするようです。

やってみた

新たな VPC を作成し、当該 VPC の dafault セキュリティグループからインバウンド/アウトバウンドルールを削除してみます。

main.tf

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "vpc"
  }
}

resource "aws_default_security_group" "default" {
  vpc_id = aws_vpc.vpc.id
}

output "default_security_group_id" {
  value = aws_default_security_group.default.id
}

8-10行目で書いたように、aws_default_security_group の引数に ingress および egress を指定しないだけでインバウンド/アウトバウンドルールが削除されます。

terraform apply後にAWS CLI から確認してみます。

$ terraform apply
(略)
Outputs:

default_security_group_id = sg-097c5d767ea81e9e6
$ aws ec2 describe-security-groups --group-ids sg-097c5d767ea81e9e6
{
    "SecurityGroups": [
        {
            "Description": "default VPC security group",
            "GroupName": "default",
            "IpPermissions": [],
            "OwnerId": "XXXXXXXXXXXX",
            "GroupId": "sg-097c5d767ea81e9e6",
            "IpPermissionsEgress": [],
            "VpcId": "vpc-03da122b6b0fbb94e"
        }
    ]
}

インバウンドルール/アウトバウンドルールをあらわすIpPermissionsおよびIpPermissionsEgressが空になっていることがわかります。これが私の祈り、私の願い。

モジュール化してみた

すべての default セキュリティグループのルールを消し去るため、練習がてらモジュールを作ってみました。

ディレクトリツリー

.
├── main.tf
└── modules
    └── vpc
        └── main.tf

.tf ファイル

./modules/vpc/main.tf

variable "vpc_cidr_block" {}
variable "vpc_name" {}

resource "aws_vpc" "vpc" {
  cidr_block = var.vpc_cidr_block

  tags = {
    Name = var.vpc_name
  }
}

resource "aws_default_security_group" "default_sg" {
  vpc_id = aws_vpc.vpc.id
}

./main.tf

module "vpc" {
  source         = "./modules/vpc"
  vpc_cidr_block = "10.0.0.0/16"
  vpc_name       = "vpc"
}

終わりに

このブログがほんの少しでも世界を良くできれば嬉しいです。
コンサルティング部の西野 (@xiyegen) がお送りしました。

参考ブログ

Terraform RegistryのModuleを使ってAWSリソースを作成してみた

脚注

  1. default セキュリティグループには固有の性質があるためです。詳しい理由についてはこちらをご参照ください。