amazon-web-services - 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 内仍然是私有的?
解决方案
“IAM 角色允许从 ECR 中提取”
IAM 角色只是授予它权限,它不提供网络连接。
“子网可以通过互联网网关访问互联网”
我想您会发现 Internet 网关仅提供对分配有公共 IP 的资源的 Internet 访问。
ECR 是一项存在于您的 VPC 之外的服务,因此您需要以下其中一项才能建立到 ECR 的网络连接:
公共IP。
NAT 网关,带有到子网中 NAT 网关的路由。
ECR 接口 VPC 终端节点,带有到子网中终端节点的路由。
推荐阅读
- asp.net-core - IIS 上的 asp.net 核心延迟与 IIS express 相反
- sql - 将 Sum 除以 Count 多次优化
- git - 如何撤消在 Git 中编辑索引文件?
- cqrs - 如何存储 sagas 的数据?
- android - 为什么屏幕关闭时调用 OnStop
- python - tar.gz 使用 python 提取所有 S3
- javascript - PHP/Python/Bash 模拟器
- apache-spark - 使用 Spark / Scala 写入 Kudu 时遇到错误
- angular - 幻灯片 - 在滑动事件之前
- c - 如何正确地将 C 算法与 OpenMP 并行化?