Carpe Diem

備忘録

Terraform でセキュリティグループを管理

概要

セキュリティグループはAWS標準のファイアウォール機能です。 作成したセキュリティグループをEC2インスタンスやELBに設定することで反映されます。
今回はTerraformでそれを作成し、EC2に結びつけてみます。

環境

  • Ubuntu 14.04
  • Terraform 0.5.2

前提

TerraformでAWSのVPCを設定VPC、サブネット等の設定をしてあるものとします。

フォルダ構成

以下のようにします。

├── config.tf
├── security_group.tf
├── terraform.tfvars
├── variables.tf
└── vpc.tf

詳細は以下です。

ファイル名 役割
config.tf providerにアクセスするための設定
security_group.tf 今回設定するセキュリティグループ
terraform.tfvars アクセスキー、シークレットキーを書く。
バージョン管理には入れない
variables.tf 変数を定義
vpc.tf 前回の中身

各ファイルの内容

config.tf

provider "aws" {
    access_key = "${var.access_key}"
    secret_key = "${var.secret_key}"
    region = "${var.region}"
}

variables.tf

variable "access_key" {}
variable "secret_key" {}
variable "region" {
    default = "ap-northeast-1"
}

access_key, secret_keyは空っぽですが、terraform.tfvarsがあるとそれを読み込んでくれるので、変数として扱うことができます。

terraform.tfvars

access_key = "xxxxxxxxxxxxxxxxxxxxx"
secret_key = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"

security_group.tf

まずは全tcpアクセスを許可する設定を作ってみます。

resource "aws_security_group" "allow_all" {
  vpc_id = "${aws_vpc.vpc-1.id}"
  name = "allow-all"
  description = "Allow all inbound traffic"
  ingress {
    from_port = 0
    to_port = 65535
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags {
    Name = "allow-all"
  }
}

詳細は以下。

用語 役割
vpc_id VPC。書かなければdefaltVPCになる
name 名前
description 説明。任意
ingress inbound(外→内)の設定
egress outbound(内→外)の設定
from_port 開始ポート
to_port 終了ポート
protocol プロトコル-1にすると全トラフィック
その場合はfrom_portとto_portを両方0にする
cidr_blocks 許可するアドレスの範囲
tags タグ

AWSのデフォルトでは、アウトバウンド(egress)設定は明示的に設定しない限りデフォルトでは全て許可します。
しかしterraformではその設定を消すので、ちゃんと付けておいてください。

動作確認

それでは実行してみます。

$ terraform plan
$ terraform apply

Webコンソールで確認するとちゃんと追加されてます。

f:id:quoll00:20150521095232p:plain

応用

security_group.tf

応用でSSH、HTTPのみ許可する設定にします。
security_group.tfに以下の設定を追記します。

resource "aws_security_group" "allow_ssh_http" {
  vpc_id = "${aws_vpc.vpc-1.id}"
  name = "allow_ssh_http"
  description = "Allow ssh and http inbound traffic"
  ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["121.121.121.121/32"]
  }
  ingress {
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags {
    Name = "allow-ssh-http"
  }
}

sshはCIDRで自分のグローバルIP以外アクセスを禁止しています。WebコンソールではMyIPというやつですね。
(自分で直接調べたIPを入力したのですが、自動で入れる方法はないのかなぁ)
実行してみます。

$ terraform plan
$ terraform apply

f:id:quoll00:20150521105148p:plain

SSHは自分の環境からならアクセスでき、VPNでアメリカ等からアクセスすると弾かれます。
一方HTTPはどこからでもアクセスできました。

以上です。お疲れ様でした。

ソース