如何解决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 的网络连接:
-
公共 IP。
-
NAT Gateway,带有到子网中 NAT 网关的路由。
-
ECR Interface VPC Endpoint,带有到子网中端点的路由。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。