![Terraform: EC2 インスタンスに複数のセキュリティ グループをアタッチする](https://rvso.com/image/756775/Terraform%3A%20EC2%20%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%20%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81%E3%81%99%E3%82%8B.png)
EC2 作成時に複数のセキュリティ グループをアタッチするにはどうすればよいでしょうか? 以下のようにモジュール化しました。
**networking/main.tf**
# Web Server Security Group
resource "aws_security_group" "web_sg" {
name = "web_sg"
description = "This security group will control the private Web Servers"
vpc_id = aws_vpc.perf_vpc.id
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
# Load Balancer Security Group
resource "aws_security_group" "alb_sg" {
name = "alb_sg"
description = " This secruity group is for Application Load Balancer"
vpc_id = aws_vpc.perf_vpc.id
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group" "perf_pvt_sg" {
name = "perf_pvt_sg"
description = "Aptean_Base-Perf_Pvt"
vpc_id = aws_vpc.perf_vpc.id
depends_on = [aws_security_group.bastion_sg]
ingress {
description = "kaspersky"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["10.176.0.35/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
**networking/outputs.tf**
output "perf_pvt_sg" {
value = aws_security_group.perf_pvt_sg.id
}
output "web_sg" {
value = aws_security_group.web_sg.id
}
output "alb_sg" {
value = aws_security_group.alb_sg.id
}
**root/main.tf**
# Deploy Web Servers
module "web_servers" {
source = "./web_servers"
keyname = module.domain_controllers.key_name
public_key_path = var.public_key_path
web_count = var.web_count
web_inst_type = var.web_inst_type
pvtsubnets = module.networking.private_subnets
webserver_sg = [
module.networking.web_sg,
module.networking.perf_pvt_sg,
module.networking.alb_sg
]
}
すべて正常に作成され、期待どおりに作成され、Terraform 出力にもリソースが表示されますが、すべての EC2 インスタンス (この場合は、Web サーバーを指定しているだけです) にはデフォルトのセキュリティ グループがアタッチされています。他のすべてのセキュリティ グループが作成されていますが、どれもアタッチされていません。web_sg を id および name 属性として切り替えてみました。
web_sg = [
module.networking.web_sg.id,
module.networking.perf_pvt_sg.id,
module.networking.alb_sg.id
]
これによりエラーが発生します (*.id と *.name で同じエラー)。
Error: Unsupported attribute
on main.tf line 46, in module "web_servers":
46: module.networking.web_sg.name,
|----------------
| module.networking.web_sg is "sg-008001301c71877a9"
This value does not have any attributes.
Error: Unsupported attribute
on main.tf line 47, in module "web_servers":
47: module.networking.perf_pvt_sg.name,
|----------------
| module.networking.perf_pvt_sg is "sg-0a50f754aceaae6cd"
This value does not have any attributes.
Error: Unsupported attribute
on main.tf line 48, in module "web_servers":
48: module.networking.alb_sg.name
|----------------
| module.networking.alb_sg is "sg-05c898e0b6873c411"
This value does not have any attributes.
何が間違っているのでしょうか?
編集1: web_servers/メイン.tf
#Web Server
resource "aws_instance" "web" {
count = var.web_count
ami = data.aws_ami.server_ami.id
ebs_optimized = true
instance_type = var.web_inst_type
subnet_id = element(var.pvtsubnets, count.index)
credit_specification {
cpu_credits = "standard"
}
root_block_device {
volume_type = "gp2"
volume_size = 80
encrypted = true
kms_key_id = "1d9ef127-cc8f-4dda-9bdf-abdad498ea6f"
}
ebs_block_device {
device_name = "/dev/sdf"
volume_type = "gp2"
volume_size = 40
encrypted = true
kms_key_id = "1d9ef127-cc8f-4dda-9bdf-abdad498ea6f"
}
tags = {
Name = "PerformanceWeb0${count.index + 1}"
}
}
web_servers/変数.tf
variable "keyname" {}
variable "public_key_path" {}
variable "web_count" {}
variable "web_inst_type" {}
variable "pvtsubnets" {
type = list(string)
}
variable "webserver_sg" {}
答え1
解決しました。これが唯一の方法かどうかはわかりません。コードを確認すると、コメントを付けたのでvpc_セキュリティグループIDweb_servers モジュールでは、VPC のデフォルトのセキュリティ グループが使用されていました。以下のようにいくつか変更を加えました。
web_servers/メイン.tf
#Web_servers
resource "aws_instance" "web" {
count = var.web_count
ami = data.aws_ami.server_ami.id
ebs_optimized = true
instance_type = var.web_inst_type
subnet_id = element(var.pvtsubnets, count.index)
vpc_security_group_ids = [
var.web_sg,
var.perf_pvt_sg,
var.alb_traffic_sg
]
web_servers/変数.tf
variable "web_sg" {}
variable "perf_pvt_sg" {}
variable "alb_traffic_sg" {}
ルート/メイン.tf
#Deploy Web Servers
module "web_servers" {
source = "./web_servers"
keyname = module.domain_controllers.key_name
public_key_path = var.public_key_path
web_count = var.web_count
web_inst_type = var.web_inst_type
pvtsubnets = module.networking.private_subnets
web_sg = module.networking.web_sg
perf_pvt_sg = module.networking.perf_pvt_sg
alb_traffic_sg = module.networking.alb_traffic_sg
}