在 AWS ECS 上部署 Flask 应用程序
Deploying flask application on AWS ECS
我按照 youtube 上提供的 Corey Schafer 视频创建了一个示例烧瓶应用程序。我能够 运行 在本地环境中运行良好。我想使用 fargate 选项将它部署在 AWS ECS 集群中,这样我就不必管理 EC2 实例。我能够使用 Terraform 构建示例集群和服务。下面是代码(缺少应用程序负载均衡器部分)
provider "aws" {
region = "us-east-2"
}
resource "aws_ecs_cluster" "sample_cluster" {
name = "sample_cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
data "aws_iam_role" "ecs_task_execution_role" {
name = "ecsTaskExecutionRole"
}
resource "aws_ecs_task_definition" "sample_cluster_task_definition" {
container_definitions = file("templates/container_definition.json")
family = "sample_terraform_task_definition"
cpu = 256
memory = 512
execution_role_arn = data.aws_iam_role.ecs_task_execution_role.arn
network_mode = "awsvpc"
runtime_platform {
operating_system_family = "LINUX"
cpu_architecture = "X86_64"
}
requires_compatibilities = ["FARGATE"]
}
data "aws_subnets" "private" {
filter {
name = "vpc-id"
values = ["vpc-ac6d734yrbfjd7ebc7"]
}
}
resource "aws_ecs_service" "sample_service" {
name = "sample_ecs_service"
cluster = aws_ecs_cluster.sample_cluster.arn
task_definition = aws_ecs_task_definition.sample_cluster_task_definition.arn
launch_type = "FARGATE"
desired_count = 1
network_configuration {
subnets = toset(data.aws_subnets.private.ids)
security_groups = ["sg-0044394c6e4b485738762f7"]
assign_public_ip = "true"
}
depends_on = [aws_ecs_task_definition.sample_cluster_task_definition,data.aws_subnets.private ,aws_ecs_cluster.sample_cluster]
}
我正在努力解决如何(如果需要)在 AWS 中配置 Web 服务器,因为本地环境有一个不适合生产环境的开发服务器。所以我的问题是
- 对于网络服务器,例如nginx 是单独的 docker 容器还是 AWS 是否有任何可用作 Web 服务器的托管服务。例如,我使用 AWS RDS 而不是单独的数据库容器。
- 如果需要单独的 docker 容器,它是相同任务定义的一部分还是不同。推荐哪一款
我只是想让部署更像实际的生产设置,所以如果有人在生产中的 aws ecs 中部署了 Flask 应用程序,请帮帮我。谢谢
既然你问的是“最佳实践”,那么通常认为 运行 Nginx 在 Flask 之前是最佳实践。要在 ECS/Fargate 上完成此操作,您需要在同一 ECS 任务中 运行 两个容器(在同一任务定义中定义它们)。您可以将 Nginx 配置为在 127.0.0.1:5000
(或 Flask 使用的任何端口)代理到 Flask,因为 multiple containers in the same task share 127.0.0.1 in Fargate.
我按照 youtube 上提供的 Corey Schafer 视频创建了一个示例烧瓶应用程序。我能够 运行 在本地环境中运行良好。我想使用 fargate 选项将它部署在 AWS ECS 集群中,这样我就不必管理 EC2 实例。我能够使用 Terraform 构建示例集群和服务。下面是代码(缺少应用程序负载均衡器部分)
provider "aws" {
region = "us-east-2"
}
resource "aws_ecs_cluster" "sample_cluster" {
name = "sample_cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
data "aws_iam_role" "ecs_task_execution_role" {
name = "ecsTaskExecutionRole"
}
resource "aws_ecs_task_definition" "sample_cluster_task_definition" {
container_definitions = file("templates/container_definition.json")
family = "sample_terraform_task_definition"
cpu = 256
memory = 512
execution_role_arn = data.aws_iam_role.ecs_task_execution_role.arn
network_mode = "awsvpc"
runtime_platform {
operating_system_family = "LINUX"
cpu_architecture = "X86_64"
}
requires_compatibilities = ["FARGATE"]
}
data "aws_subnets" "private" {
filter {
name = "vpc-id"
values = ["vpc-ac6d734yrbfjd7ebc7"]
}
}
resource "aws_ecs_service" "sample_service" {
name = "sample_ecs_service"
cluster = aws_ecs_cluster.sample_cluster.arn
task_definition = aws_ecs_task_definition.sample_cluster_task_definition.arn
launch_type = "FARGATE"
desired_count = 1
network_configuration {
subnets = toset(data.aws_subnets.private.ids)
security_groups = ["sg-0044394c6e4b485738762f7"]
assign_public_ip = "true"
}
depends_on = [aws_ecs_task_definition.sample_cluster_task_definition,data.aws_subnets.private ,aws_ecs_cluster.sample_cluster]
}
我正在努力解决如何(如果需要)在 AWS 中配置 Web 服务器,因为本地环境有一个不适合生产环境的开发服务器。所以我的问题是
- 对于网络服务器,例如nginx 是单独的 docker 容器还是 AWS 是否有任何可用作 Web 服务器的托管服务。例如,我使用 AWS RDS 而不是单独的数据库容器。
- 如果需要单独的 docker 容器,它是相同任务定义的一部分还是不同。推荐哪一款
我只是想让部署更像实际的生产设置,所以如果有人在生产中的 aws ecs 中部署了 Flask 应用程序,请帮帮我。谢谢
既然你问的是“最佳实践”,那么通常认为 运行 Nginx 在 Flask 之前是最佳实践。要在 ECS/Fargate 上完成此操作,您需要在同一 ECS 任务中 运行 两个容器(在同一任务定义中定义它们)。您可以将 Nginx 配置为在 127.0.0.1:5000
(或 Flask 使用的任何端口)代理到 Flask,因为 multiple containers in the same task share 127.0.0.1 in Fargate.