首页 > 解决方案 > ECS 服务:如果没有为服务任务分配公共 IP,则无法从 ECR 注册表中提取 docker 映像

问题描述

我有以下定义ECS 服务的 cloudformation 堆栈:

ApiService:
    Type: AWS::ECS::Service
    DependsOn:
     - LoadBalancerListener80
     - LoadBalancerListener443
    Properties:
      Cluster: !Ref EcsClusterArn
      DeploymentConfiguration:
        MaximumPercent: 200
        MinimumHealthyPercent: 100
      DeploymentController:
        Type: ECS
      DesiredCount: 1
      HealthCheckGracePeriodSeconds: 10
      LaunchType: FARGATE
      LoadBalancers:
        - ContainerName: !Join ['-', ['container', !Ref AWS::StackName]]
          ContainerPort: !Ref Port
          TargetGroupArn: !Ref LoadBalancerTargetGroup
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED # <-- if disabled, pulling from ecr registry fails
          SecurityGroups:
            - !Ref ApiServiceContainerSecurityGroup
          Subnets: !Ref Subnets
      SchedulingStrategy: REPLICA
      ServiceName: !Ref AWS::StackName
      TaskDefinition: !Ref ApiServiceTaskDefinition

我注意到,如果不启用公共 IP 自动分配,服务任务将无法从 ECR 注册表中提取 docker 映像。我不明白为什么我需要容器具有公共 IP 才能从注册表中提取图像...服务安全组允许所有出站流量,子网可以通过 Internet 网关访问 Internet,并且 IAM 角色允许从ECR ...那么为什么需要公共IP?我不希望我的容器有公共 ip,它们应该只能在 VPC 内部访问。或者我误解了,只有任务会收到公共 ip(无论出于何种原因),而容器在 VPC 内仍然是私有的?

标签: amazon-web-servicesdockeramazon-cloudformationamazon-ecsamazon-vpc

解决方案


“IAM 角色允许从 ECR 中提取”

IAM 角色只是授予它权限,它不提供网络连接。

“子网可以通过互联网网关访问互联网”

我想您会发现 Internet 网关仅提供对分配有公共 IP 的资源的 Internet 访问。

ECR 是一项存在于您的 VPC 之外的服务,因此您需要以下其中一项才能建立到 ECR 的网络连接:

  1. 公共IP。

  2. NAT 网关,带有到子网中 NAT 网关的路由。

  3. ECR 接口 VPC 终端节点,带有到子网中终端节点的路由。


推荐阅读