0

我在做什么

我正在尝试这样做:

在私有子网中启动任务,并确保您在 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 名称,请选中该复选框。” 和“此选项默认开启”

但在这里:https ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled

它说:“默认值:假”。它是哪一个?

问题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 似乎是正确的做法。

于是,我的旅程。

4

1 回答 1

0

我得到了这个工作。一些答案如下。

对于问题 1:

该文档解释了如何创建 Interface VPC Endpoints,这很棒。但它也说:“要为接口端点打开私有 DNS,对于启用 DNS 名称,请选中该复选框。” 和“此选项默认开启”

但在这里:https ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled

它说:“默认值:假”。它是哪一个?

我不知道答案。我所知道的是,您绝对应该打开私有 DNS。而默认 DNS 类似于:ec2.us-east-1.amazonaws.com;特定于端点的区域或区域 DNS 主机名更长且更复杂。更多信息:https ://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#access-service-though-endpoint

对于问题 2:不!我只需要重复两次。工作答案:

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:
      #   Version: 2012-10-17
      #   Statement:
      #     - Effect: Allow
      #       Principal: '*'
      #       Action:
      #         - ''
      #       Resource:
      #         - ''
      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

对于问题 3:

这正是你应该做的,我似乎是正确的。

对于问题 4:

不,如果现有容器出现故障,我将不得不启动一个新容器。发生这种情况时,我需要访问端口 443。您不能像那样切换防火墙/安全组的访问级别。

于 2021-08-06T20:36:29.380 回答