我在地形中遇到错误:
ClientException: Links are not supported when networkMode=awsvpc.
我将nginx与我的nodejs应用程序链接起来。我希望nodejs在3000端口上运行,而nginx在80端口上运行。当请求传入时,nginx将代理nodejs。(我已经将nginx.conf和proxy定义为3000(。
它发生在远门模式下。但我在这里没有选择,网络模式只是awsvpc
。
我能做什么?有办法把容器连接起来吗?里面有一个conatiner、nginx和nodejs?只是nodejs?其他解决方案?
这里是我的地形设置:
resource "aws_ecs_service" "nginx" {
name = "nginx-${var.app}"
cluster = aws_ecs_cluster.demo.id
task_definition = aws_ecs_task_definition.nginx.arn
desired_count = 4
launch_type = "FARGATE"
lifecycle {
ignore_changes = [task_definition]
}
...
}
resource "aws_ecs_task_definition" "nginx" {
family = "nginx-${var.app}"
container_definitions = file("container_definitions.json")
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
}
container_definitions.json:
[
{
"name": "nginx-...nginx-www",
"image": "311443.dkr.ecr.us-east-2.amazonaws.com/...-nginx:latest",
"cpu": 256,
"memory": 256,
"essential": true,
"links": ["www-app"],
"portMappings": [
{
"protocol": "tcp",
"containerPort": 80
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "...",
"awslogs-region": "us-east-2",
"awslogs-stream-prefix": "ecs"
}
}
},
{
"name": "www-app",
"image": "93934.dkr.ecr.us-east-2.amazonaws.com/..../www-app:latest",
"cpu": 256,
"memory": 256,
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs-..../nginx",
"awslogs-region": "us-east-2",
"awslogs-stream-prefix": "ecs"
}
}
}
]
TL;博士
我建议您将位于s3的配置文件链接到ecs-nginx。
ecs容器之间,彼此链接在同一网络上。如果您使用fargates,AWS会强制执行网络模式。
有两种解决方案。
- 为容器nginx镜像配置nginx配置
只需将web端口80转发到3000节点端口。Nginx主要是针对这个主题设计的。
上传nginx.config文件到s3,然后用";EnvironmentFile;领域
或者,您可以使用自定义配置构建自己的nginx映像(不推荐(。
- 放弃使用nginx。Web端口可以与应用程序负载均衡器一起转发
您可以在应用程序负载均衡器上从80转发到3000。这取决于您的应用程序大小。如果这是一个简单的应用程序,你不必使用nginx。
通常,Nginx被用作反向代理,但可以用于控制http缓冲(代理缓冲(、优雅的重新启动、排队请求等