概要
セキュリティグループは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コンソールで確認するとちゃんと追加されてます。
応用
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
SSHは自分の環境からならアクセスでき、VPNでアメリカ等からアクセスすると弾かれます。
一方HTTPはどこからでもアクセスできました。
以上です。お疲れ様でした。