Создать запись A в CloudFormation для частного IP-адреса главного узла EMR - PullRequest
0 голосов
/ 27 марта 2019

Я хотел бы знать, есть ли способ объявить AWS::Route53::RecordSet в конфигурации CloudFormation, который указывает на частный IP-адрес главного узла в кластере EMR, который также определен в той же конфигурации?

Сценарий CloudFormation должен быть понятен:

  rVPC:
    Type: AWS::EC2::VPC
    # ... 

  rMyEMRCluster:
    Type: AWS::EMR::Cluster
    # ...

  rPrivateHostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      Name: "example.com"
      VPCs:
        - VPCId: !Ref rVPC
          VPCRegion: ${AWS::Region}

  rMyRecordSet:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref rPrivateHostedZone
      Name: !Sub "sub.example.com"
      Region: ${AWS::Region}
      Type: A
      ResourceRecords:
        # TODO: How can I do something like this:
        # - GetAtt rMyEMRCluster.MasterNodePrivateIpAddress

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Не совсем.

Единственное доступное возвращаемое значение - MasterPublicDNS. Это, однако, должно разрешаться до IP-адреса главного узла.

См. Раздел Возвращаемые значения в AWS :: EMR :: Cluster - AWS CloudFormation .

0 голосов
/ 03 апреля 2019

Вы можете попробовать использовать собственный ресурс для этого.Он может использовать emr: ListInstances для получения IP-адреса, а затем вы можете использовать этот результат в своем ресурсе Route 53.

Я не пробовал, но что-то вроде следующего должно работать.Возможно, вам придется добавить некоторую задержку, если EMR требуется некоторое время для создания главного узла, а CloudFormation еще не ждет этого.

Resources:
  DescribeClusterRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: sts:AssumeRole
            Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      Policies:
        - PolicyName: DescribeCluster
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Action: elasticmapreduce:ListInstances
                Effect: Allow
                Resource: "*"
  GetClusterPrivateIP:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.6
      Handler: index.handler
      Role: !Sub ${DescribeClusterRole.Arn}
      Timeout: 60
      Code:
        ZipFile: |
          import boto3
          import cfnresponse
          import traceback

          def handler(event, context):
            try:
              response = boto3.client('emr').list_instances(
                  ClusterId=event['ResourceProperties']['ClusterId'],
                  InstanceGroupTypes=['MASTER'],
              )

              ip = response['Instances'][0]['PrivateIpAddress']

              cfnresponse.send(event, context, cfnresponse.SUCCESS, {}, ip)
            except:
              traceback.print_last()
              cfnresponse.send(event, context, cfnresponse.FAIL, {}, "ok")
  MasterIp:
    Type: Custom::EmrMasterIp
    Properties:
      ServiceToken: !Sub ${GetClusterPrivateIP.Arn}
      ClusterId: !Ref rMyEMRCluster
  rMyRecordSet:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref rPrivateHostedZone
      Name: !Sub "sub.example.com"
      Region: ${AWS::Region}
      Type: A
      ResourceRecords:
        !Ref MasterIp
...