Вопросы по настройке AWS PrivateLink + CloudFormation из документации

Что я делаю

Я пытаюсь это сделать:

Запускайте задачи в частной подсети и убедитесь, что в вашем VPC настроены конечные точки AWS PrivateLink для необходимых вам сервисов (ECR для аутентификации по запросу, S3 для слоев изображений и AWS Secrets Manager для секретов).

Насколько я понимаю, сервисы AWS действуют как «служба конечных точек VPC», и все, что мне нужно сделать, это настроить «конечную точку интерфейса VPC», чтобы сделать мой сервис «потребителем услуг», как описано здесь: https: // docs .aws.amazon.com / vpc / latest / privatelink / vpce-interface.html

Я попытался реализовать это в CloudFormation, но у меня есть несколько вопросов из документации.

Мои вопросы

Вопрос 1

В документации объясняется, как создавать конечные точки интерфейса VPC, и это здорово. Но в нем также говорится: «Чтобы включить частный DNS для конечной точки интерфейса, для параметра« Включить DNS-имя »установите флажок». и «Эта опция включена по умолчанию»

Но вот здесь: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled

Там написано: «По умолчанию: false». Что он?

вопрос 2

Мне нужно включить 3 ServiceNames. Итак ... мне нужно повторить это 3 раза? Ниже приведен мой YAML, который 3 раза повторяет AWS::EC2::VPCEndpoint. Это правда правильно? Это кажется слишком длинным / многословным.

      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

Для группы безопасности выберите группы безопасности, которые нужно связать с сетевыми интерфейсами конечной точки.

Могу ли я использовать группу безопасности ECSSecurityGroupDownloadRedisContainer, которая подключена к моей службе ECS через NetworkConfiguration / AwsvpcConfiguration / SecurityGroups? Если да, нужно ли связать ECSSecurityGroupDownloadRedisContainer (разрешающий трафик на 443) и ECSSecurityGroupRedis (разрешающий трафик на 6379)? Я предполагаю, что ответ на это да + только ECSSecurityGroupDownloadRedisContainer, но я точно не знаю.

Вопрос 4

Могу ли я как-то отключить доступ к ECS по порту 443 после загрузки контейнера? Мне нужен только доступ к 6379 для Redis; все остальное кажется мне угрозой безопасности.

Предыстория: почему я это делаю

Я пытаюсь создать кластер ECS + Service + Task, но получаю сообщение об ошибке:

(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: невозможно получить секреты или авторизацию реестра.

С этим авторитетным ответом сотрудника AWS Натана Пека от марта этого года: /questions/50676337/aws-ecs-fargate-resourceinitializationerror-nevozmozhno-poluchit-sekretyi-ili-au/57043495#57043495

Они предлагают одно из трех решений:

  • Запускать задачи в общедоступной подсети с общедоступным IP-адресом, чтобы они могли связываться с ECR и другими вспомогательными службами через интернет-шлюз.
  • Запускать задачи в частной подсети с таблицей маршрутизации VPC, настроенной для маршрутизации исходящего трафика через шлюз NAT в общедоступной подсети. Таким образом, шлюз NAT может открыть соединение с ECR от имени задачи.
  • Запускайте задачи в частной подсети и убедитесь, что в вашем VPC настроены конечные точки AWS PrivateLink для необходимых вам сервисов (ECR для аутентификации по запросу, S3 для слоев изображений и AWS Secrets Manager для секретов).

Как вы знаете, redis работает с портом 6379, а не с портом 443. Мои мысли по поводу этих решений:

  • Вариант 1 очень опасен! Меня НИКОГДА не следует заставлять открывать доступ к моему экземпляру базы данных в общедоступном Интернете. Так что это вышло.
  • Вариант 2 - это то, что я начал реализовывать, а затем я понял, что это связано с открытием и разрешением трафика на порт 443 в моей подсети + таблица маршрутизации и т. Д. Это кажется ненужным риском безопасности, когда я собираюсь использовать только порт 443 @ запуск контейнера.
  • Вариант 3 кажется правильным.

Итак, мое путешествие.

1 ответ

Я заставил это работать. Некоторые ответы ниже.

По вопросу 1:

В документации объясняется, как создавать конечные точки интерфейса VPC, и это здорово. Но в нем также говорится: «Чтобы включить частный DNS для конечной точки интерфейса, для параметра« Включить DNS-имя »установите флажок». и «Эта опция включена по умолчанию»

Но вот здесь: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled

Там написано: «По умолчанию: false». Что он?

Я не знаю ответ. Что я точно знаю, так это то, что вам обязательно стоит включить частный DNS. В то время как DNS по умолчанию выглядит примерно так: ec2.us-east-1.amazonaws.com; региональные или зональные имена хостов DNS для конкретных конечных точек длиннее и сложнее. Дополнительная информация: https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#access-service-ought-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. Вы не можете переключать уровень доступа брандмауэра / группы безопасности таким образом.

Другие вопросы по тегам