CloudFormation: доступ к PrivateDnsNamespace с помощью HostedZone - PullRequest
0 голосов
/ 03 октября 2019

В документации для ServiceDiscovery::PrivateDnsNamespace указано, что:

При создании частного пространства имен DNS AWS Cloud Map автоматически создает частную размещенную зону Amazon Route 53, которая имеетто же имя, что и пространство имен.

В CloudFormation есть ли способ доступа к созданным HostedZone (как Route53::HostedZone), чтобы я мог добавить к нему дополнительные Route53:RecordSet s?

  • Является ли идентификатор таким же?
  • Могу ли я включить Route53::HostedZone с тем же именем, чтобы получить правильный идентификатор?
  • Есть ли какой-то другой прием?

Например, я хотел бы выставить свой экземпляр RDS и ElastiCache (Redis) на частные записи DNS. Я понимаю, что это может быть проблемой XY, но я получаю доступ к этим системам в стандартных местах в своем устаревшем коде и пытаюсь минимизировать настройку (и, следовательно, потенциальные ошибки) в моей первой попытке ECS.

ПРЕДУПРЕЖДЕНИЕ. Хотя стратегии AWS Service Discovery можно использовать для предоставления таких услуг, как БД и RDS, существует несколько квалификаций:

  • Для обнаружения служб AWS требуется синтаксис <name>.<namespace>, поэтому вы не можете простовыставить услуги на db и redis. Ваши лучшие шансы для «стандартного» домена - что-то вроде redis.local и db.local. Хотя local является зарезервированным TLD, существует некоторая враждебность к его использованию.
  • Сертификаты RDS SSL привязаны к имени домена RDS , а пользовательские сертификаты SSL не поддерживаются так что вы не можете выставить его на db.<mydomain>.com. Если вы не используете RDS CNAME, вы не сможете подключиться к этим экземплярам по доверенному SSL-соединению.

1 Ответ

1 голос
/ 03 октября 2019

Нет способа получить доступ к созданному HostedZone в CloudFormation.

Тем не менее, если вы хотите добавить дополнительные записи в эту частную зону, вы можете использовать AWS::ServiceDiscovery::Service и AWS::ServiceDiscovery::Instance ресурсов.

По сути, вам нужно создать один сервис для вашего экземпляра RDS и один сервис для вашего экземпляра Redis. Затем вы создаете экземпляры в своих службах.

Пример для RDS:

RDSSDService:
  Type: AWS::ServiceDiscovery::Service
  Properties:
    DnsConfig:
      DnsRecords:
        - TTL: 60
          Type: CNAME
      NamespaceId:
        Ref: YourNamespace
      RoutingPolicy: WEIGHTED
    Name: my-rds-service # this will become the record name
    NamespaceId:
      Ref: YourNamespace

RDSSDInstance: # If your RDS instance is in the same stack
  Type: AWS::ServiceDiscovery::Instance
  Properties:
    InstanceAttributes:
      AWS_INSTANCE_CNAME:
        Fn::GetAtt:
          - YourInstanceLogicalName
          - Endpoint.Address
    ServiceId:
      Fn::GetAtt:
        - RDSSDService
        - Id
    InstanceId: # this is optional
      Ref: YourInstanceLogicalName

RDSInstance: # If referencing an existing instance
  Type: AWS::ServiceDiscovery::Instance
  Properties:
    InstanceAttributes:
      AWS_INSTANCE_CNAME: xyz.abc.us-east-1.rds.amazonaws.com # or with Fn::ImportValue
    ServiceId:
      Fn::GetAtt:
        - RDSSDService
        - Id
    InstanceId: xyz # this is optional
...