Вопросы по настройке 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-имя »установите флажок». и «Эта опция включена по умолчанию»
Там написано: «По умолчанию: 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-имя »установите флажок». и «Эта опция включена по умолчанию»
Там написано: «По умолчанию: 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. Вы не можете переключать уровень доступа брандмауэра / группы безопасности таким образом.