ECS 服务:如果不将公共 IP 分配给服务任务,则无法从 ECR 注册表中提取 docker 映像

rev*_*evy 4 amazon-web-services amazon-ecs aws-cloudformation amazon-vpc 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*k B 6

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

IAM 角色仅授予其权限,不提供网络连接。

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

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

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

  1. 公共IP。

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

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

  • @revy 查看我的更新。Internet 网关仅适用于具有公共 IP 的资源。如果没有公共 IP,您必须通过 NAT 网关才能访问 Internet。 (2认同)
  • 我懂了!所以我可能需要使用 NAT 创建私有子网,谢谢! (2认同)