terraform - 使用 to_port 和 from_port 配置为 Terraform 入口/出口映射专用网络端口?
问题描述
我不确定这里的 Terraform 端口转发命名法。如果我在私有网络的 5000 端口上有一个应用程序,我想在端口 8000 上向公众公开 - 我应该设置哪些变量?
会不会是从私网的角度?
from_port: 5000
to_port: 8000
还是公网的视角?
from_port: 8000
to_port: 5000
如果我的内部应用程序需要响应数据,我是否还需要设置出口值?
示例来自:terraform 简介
resource "aws_security_group" "elb" {
name = "terraform-example-elb"
# Allow all outbound
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
# Inbound HTTP from anywhere
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
解决方案
将安全组 (SG) 视为实例周围的封闭气泡。它与您的实例内部发生的事情无关。它在实例之外运行。
您设置的 SG 规则在此气泡中打孔,指定允许哪些端口上的哪些流量(TCP、UDP)进入实例和实例外部。
在您的情况下,由于您希望允许端口上的传入流量8000
到您的实例,您将使用 port 制作一个“洞” 8000
:
resource "aws_security_group" "elb" {
name = "terraform-example-elb"
# Allow all outbound
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
# Inbound port 8000 from anywhere
ingress {
from_port = 8000
to_port = 8000
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
上述 SG 将允许端口 8000 上的传入流量到您的实例。不允许其他端口,因此from_port == to_port
. 一旦允许此流量,您的实例正在执行的操作超出了 SG 范围和规则。因此,通常您必须在实例上安装一个服务器,侦听端口 8000。如果您的应用程序在端口 5000 上运行,那么您需要在实例上使用反向代理,例如 nginx。Nginx 将接受端口 8000 上的连接并将它们重定向到端口 5000 上的应用程序::
client--->SG:8000--->Instance:8000--->Nginx:8000--->Your app:5000
相反,如果你这样写
from_port: 5000
to_port: 8000
您将打开从 5000 到 8000 的所有端口以通过气泡并到达您的实例。
推荐阅读
- java - Spring Data Repository Generics - 尝试获取错误的类型
- python - Issue with Stale data Flask/SqlAlchemy
- angular - 我在 Angular 中的路由中遇到错误
- java - 如何在 Netbeans 中编译单个 Java 文件?
- javascript - Jasonette - .replace.string
- mysql - 在mysql中的条件下使用join更新记录
- ms-access - 访问 VBA DLOOKUP
- python - 使用python在Photoshop中选择一个区域返回错误
- powerapps - 为什么我不允许在 PowerApps 中为列名使用动态字符串?
- java - 添加外部Jar文件后Java中无法访问的语句