我在做什么
我正在尝试这样做:
在私有子网中启动任务,并确保您在 VPC 中为您需要的服务配置了 AWS PrivateLink 终端节点(用于图像拉取身份验证的 ECR、用于图像层的 S3 和用于密钥的 AWS Secrets Manager)。
我对此的理解是 AWS 服务充当“VPC 端点服务”,我需要做的就是设置一个“接口 VPC 端点”以使我的服务成为“服务使用者”,如下所述:https://docs .aws.amazon.com/vpc/latest/privatelink/vpce-interface.html
我试图在 CloudFormation 中实现这一点,但我在阅读文档时遇到了一些问题。
我的问题
问题 1
该文档解释了如何创建 Interface VPC Endpoints,这很棒。但它也说:“要为接口端点打开私有 DNS,对于启用 DNS 名称,请选中该复选框。” 和“此选项默认开启”
它说:“默认值:假”。它是哪一个?
问题2
我需要启用 3 个服务名称。所以...我需要重复3次吗?我的 YAML 重复 AWS::EC2::VPCEndpoint 3 次如下。这真的正确吗?它似乎太长/冗长。
privateVPCEndpoint1:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.ecr.dkr
PrivateDnsEnabled: True
# "If this parameter is not specified, we attach a default policy that allows full access to the service."
# PolicyDocument:
SecurityGroupIds:
- !Ref ECSSecurityGroupDownloadRedisContainer
SubnetIds:
- !Ref privateSubnet1
- !Ref privateSubnet2
VpcEndpointType: Interface
VpcId: !Ref VPC
privateVPCEndpoint2:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.ecr.api
PrivateDnsEnabled: True
SecurityGroupIds:
- !Ref ECSSecurityGroupDownloadRedisContainer
SubnetIds:
- !Ref privateSubnet1
- !Ref privateSubnet2
VpcEndpointType: Interface
VpcId: !Ref VPC
privateVPCEndpoint3:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.ecr.s3
PrivateDnsEnabled: True
SecurityGroupIds:
- !Ref ECSSecurityGroupDownloadRedisContainer
SubnetIds:
- !Ref privateSubnet1
- !Ref privateSubnet2
VpcEndpointType: Interface
VpcId: !Ref VPC
问题 3
对于安全组,选择要与端点网络接口关联的安全组。
我是否使用通过 NetworkConfiguration / AwsvpcConfiguration / SecurityGroups 附加到我的 ECS 服务的 ECSSecurityGroupDownloadRedisContainer 安全组?如果是,我是否需要同时关联 ECSSecurityGroupDownloadRedisContainer(允许 443 上的流量)和 ECSSecurityGroupRedis(允许 6379 上的流量)?我认为这个答案是肯定的 + 只有 ECSSecurityGroupDownloadRedisContainer 但我真的不知道。
问题 4
下载容器后,我可以以某种方式禁用对端口 443 上的 ECS 的访问吗?我只需要访问 6379 for Redis;其他任何事情对我来说似乎都是安全责任。
背景:我为什么要这样做
我正在尝试创建 ECS 集群 + 服务 + 任务,但出现错误:
(CannotPullContainerError: inspect image has been retried 5 time(s): failed to resolve ref "docker.io/library/redis:latest": failed to do request: Head https://registry-1.docker.io/v2/library/redis/manifests/latest: dial tcp 34.231.251.252:443: i/o timeout)
研究已将我指向这篇文章:Aws ecs fargate ResourceInitializationError: unable to pull secrets or registry auth
从今年 3 月开始,AWS 员工 nathan peck 给出了这个权威答案:https ://stackoverflow.com/a/66802973
他们提出了以下三个解决方案之一:
- 将任务启动到具有公共 IP 地址的公共子网中,以便它们可以使用 Internet 网关与 ECR 和其他支持服务进行通信
- 在具有配置为通过公有子网中的 NAT 网关路由出站流量的 VPC 路由表的私有子网中启动任务。这样,NAT 网关可以代表任务打开到 ECR 的连接。
- 在私有子网中启动任务,并确保您在 VPC 中为您需要的服务配置了 AWS PrivateLink 终端节点(用于图像拉取身份验证的 ECR、用于图像层的 S3 和用于密钥的 AWS Secrets Manager)。
如您所知,redis 运行在 6379 端口,而不是 443 端口。我对这些解决方案的想法:
- 选项1非常危险!我永远不应该被迫将我的数据库实例暴露给公共互联网。所以就这样了。
- 选项 2 是我开始实施的,然后我意识到这涉及在我的子网 + 路由表 + 等中公开和允许端口 443 上的流量。当我只打算使用端口 443 时,这似乎是不必要的安全风险@ 容器启动。
- 选项 3 似乎是正确的做法。
于是,我的旅程。