在 terraform 中使用现有的 AWS 安全组
Use existing AWS security group in terraform
我对 Terraform 还很陌生,最近才开始学习。我已成功启动 AWS ec2 实例。创建它时,我提供了以下 SG 相关信息:
resource "aws_security_group" "forssh" {
name = "ssh-access"
ingress {
cidr_blocks = [ "0.0.0.0/0" ]
from_port = 22
protocol = "tcp"
to_port = 22
}
tags = {
"Name" = "terraform-create"
}
}
这创建了一个 SG,我可以在 AWS 控制台上看到它以及“sg-000312648cb099634”。现在,假设我想要另一个完全不同的 EC2 实例,但不重新声明 SG。我想在我的新配置中使用相同的现有 SG。有可能这样做吗?如何实现?
新信息
我想我可以通过参考@Marcin 的评论使用数据源重新使用现有的 SG。这是我的简单 .tf 代码:
data "aws_security_group" "testsg" {
id = "sg-0f9fb8b59aebac240"
}
resource "aws_instance" "myec2" {
ami = "ami-033b95fb8079dc481"
instance_type = "t2.micro"
tags = {
"Name" = "terra"
}
key_name = aws_key_pair.sshkey.id
vpc_security_group_ids = [data.aws_security_group.testsg.id]
}
resource "aws_key_pair" "sshkey" {
public_key = file("C:/Users/admin/key.pub")
}
我在 aws 控制台上手动创建了一个 SG 作为“sg-0f9fb8b59aebac240”。这完全超出了 TF 的范围,因为 TF 无法知道它的存在。然后我使用数据源读取它并将其中的信息输入到 TF。实例已正确启动并且正确的 SG 已附加到它。
希望我上面做的是对的,否则我洗耳恭听:)
仅供参考,我也尝试了@Ash Blake 的方法。当我在同一目录下创建文件时效果很好。对于 diff 目录,我认为数据源是正确的方法。
您可以使用 Data Source called aws_security_group 获取现有 SG 的详细信息:
data "aws_security_group" "selected" {
id ="sg-000312648cb099634"
}
然后您可以使用数据源来引用与给定安全组相关的所有信息。
如果EC2和SG tf文件在同一个文件夹中,您可以声明EC2从SG块中获取ID。 Documentation
resource "aws_instance" "web" {
...
security_groups = [aws_security_group.forssh.id]
...
}
如果它们在不同的文件夹中,您可以像上面的答案一样进行硬编码,或者编写输出然后通过数据源导入。 Documentation
我对 Terraform 还很陌生,最近才开始学习。我已成功启动 AWS ec2 实例。创建它时,我提供了以下 SG 相关信息:
resource "aws_security_group" "forssh" {
name = "ssh-access"
ingress {
cidr_blocks = [ "0.0.0.0/0" ]
from_port = 22
protocol = "tcp"
to_port = 22
}
tags = {
"Name" = "terraform-create"
}
}
这创建了一个 SG,我可以在 AWS 控制台上看到它以及“sg-000312648cb099634”。现在,假设我想要另一个完全不同的 EC2 实例,但不重新声明 SG。我想在我的新配置中使用相同的现有 SG。有可能这样做吗?如何实现?
新信息
我想我可以通过参考@Marcin 的评论使用数据源重新使用现有的 SG。这是我的简单 .tf 代码:
data "aws_security_group" "testsg" {
id = "sg-0f9fb8b59aebac240"
}
resource "aws_instance" "myec2" {
ami = "ami-033b95fb8079dc481"
instance_type = "t2.micro"
tags = {
"Name" = "terra"
}
key_name = aws_key_pair.sshkey.id
vpc_security_group_ids = [data.aws_security_group.testsg.id]
}
resource "aws_key_pair" "sshkey" {
public_key = file("C:/Users/admin/key.pub")
}
我在 aws 控制台上手动创建了一个 SG 作为“sg-0f9fb8b59aebac240”。这完全超出了 TF 的范围,因为 TF 无法知道它的存在。然后我使用数据源读取它并将其中的信息输入到 TF。实例已正确启动并且正确的 SG 已附加到它。
希望我上面做的是对的,否则我洗耳恭听:)
仅供参考,我也尝试了@Ash Blake 的方法。当我在同一目录下创建文件时效果很好。对于 diff 目录,我认为数据源是正确的方法。
您可以使用 Data Source called aws_security_group 获取现有 SG 的详细信息:
data "aws_security_group" "selected" {
id ="sg-000312648cb099634"
}
然后您可以使用数据源来引用与给定安全组相关的所有信息。
如果EC2和SG tf文件在同一个文件夹中,您可以声明EC2从SG块中获取ID。 Documentation
resource "aws_instance" "web" {
...
security_groups = [aws_security_group.forssh.id]
...
}
如果它们在不同的文件夹中,您可以像上面的答案一样进行硬编码,或者编写输出然后通过数据源导入。 Documentation