微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ECS 服务:无法在没有为服务任务分配公共 IP 的情况下从 ECR 注册表中拉取 docker 镜像

如何解决ECS 服务:无法在没有为服务任务分配公共 IP 的情况下从 ECR 注册表中拉取 docker 镜像

我有以下定义 ECS Service 的 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

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

解决方法

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

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

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

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

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

  1. 公共 IP。

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

  3. ECR Interface VPC Endpoint,带有到子网中端点的路由。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。