繁体   English   中英

AWS ECS:无法连接到在 EC2 实例中运行的网络服务器

[英]AWS ECS: Cannot connect to webserver running in EC2 instance

我正在使用AWS CDK创建一个简单的基础设施:

  • 单个 EC2 实例;
  • 从 Docker 图像运行网络服务器;
  • 使用 Elastic Container Service (ECS) 所以我不必管理容器

我可以启动并运行它,但无法访问网络服务器(例如,通过在浏览器中访问 EC2 实例的 IP 或使用wget ),我不明白为什么我无法访问它。

我尝试/发现的事情:

  • 在同一个 CDK 脚本中,我可以直接创建一个 EC2 实例,运行 docker 图像,并通过 Inte.net 连接到它。 因此图像和 VPC 正在按预期工作。
  • 我在我的任务定义中尝试了AWS_VPCBRIDGE .network 模式,结果相同(一切都在运行,但我无法连接到服务器)
  • 如果我使用AWS_VPC模式,我最终会得到与我的 EC2 实例关联的两个网络接口。 即使我确保两者都有允许传入端口 80 流量的安全组,我仍然无法直接连接到 EC2 实例。
  • 我查看了所有官方ecsec2示例。 我正在做与示例正在做的相同的事情,尽管这些示例似乎都没有设置网络可见的服务器。
  • 我已经阅读了ecsec2的 CDK 文档,但在那里找不到解释。
  • 我已经对可访问的普通 EC2 实例与不可访问的 EC2 管理的 ECS 实例的网络和安全设置进行了并排比较——它们在功能上似乎是等同的。

容器外的所有内容似乎都设置为能够通过 web 与 EC2 实例进行通信,因此我假设它与任务/容器本身有关。 我最好的猜测是它与任务的网络模式有关,但我还没有找到让我找到答案的配置或文档。

有谁知道为什么我无法访问此 EC2 实例? 或者有任何示例 CDK 脚本做类似的事情以供参考?

这是我期望生成可访问网络服务器(但没有)的最小 CDK 脚本,使用演示 nginx 容器作为 hello-world:

import {
  Stack,
  StackProps,
  aws_ec2 as ec2,
  aws_ecs as ecs,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // VPC
    const vpc = new ec2.Vpc(this, 'VPC', {
      enableDnsSupport: true,
      enableDnsHostnames: true,
      subnetConfiguration: [{ name: 'PublicSubnet', subnetType: ec2.SubnetType.PUBLIC }],
    });

    // ECS
    const cluster = new ecs.Cluster(this, 'Cluster', {
      vpc,
      capacity: {
        instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.NANO),
        machineImage: ecs.EcsOptimizedImage.amazonLinux(),
        desiredCapacity: 1,
      },
    });
    cluster.connections.allowFromAnyIpv4(ec2.Port.tcp(80));

    // TASK DEFINITION
    const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef', {
      networkMode: ecs.NetworkMode.AWS_VPC,
    });

    const container = taskDefinition.addContainer('HelloWorldContainer', {
      image: ecs.ContainerImage.fromRegistry('nginxdemos/hello'),
      memoryReservationMiB: 256,
      portMappings: [
        {
          containerPort: 80,
          protocol: ecs.Protocol.TCP,
        },
      ],
    });

    const service = new ecs.Ec2Service(this, 'Service', {
      cluster,
      taskDefinition,
    });
    service.connections.allowFromAnyIpv4(ec2.Port.tcp(80));
  }
}

终于找到答案:

要直接连接到由 ECS 管理的 EC2 实例,网络模式任务需要为“ 主机”。 这使您可以像使用常规 EC2 实例一样使用该实例。

回想起来相关的文档非常清楚,我只是第一次看的时候不太理解它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM