Вы можете попробовать использовать собственный ресурс для этого.Он может использовать 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