aws-cloudformation / cloudformation-coverage-roadmap

The AWS CloudFormation Public Coverage Roadmap
https://aws.amazon.com/cloudformation/
Creative Commons Attribution Share Alike 4.0 International
1.1k stars 54 forks source link

[AWS::MediaPackageV2::Channel] - [Enhancement] - GetAtt support for channel's IngestEndpoints #2014

Closed mattyboy84 closed 1 month ago

mattyboy84 commented 5 months ago

Name of the resource

AWS::MediaPackageV2::Channel

Resource name

No response

Description

Let's say you have a Mediapackage V2 Channel group & channel like this:

  mediaPackageV2ChannelGroup:
    Type: AWS::MediaPackageV2::ChannelGroup
    Properties:
      ChannelGroupName: !Ref channelName

  mediaPackageV2Channel:
    Type: AWS::MediaPackageV2::Channel
    Properties:
      ChannelGroupName: !Select [1, !Split [ '/', !Ref mediaPackageV2ChannelGroup ]]
      ChannelName: !Ref channelName
      Description: !Sub "I love watching my favourite channel, ${channelName}"

The AWS::MediaPackageV2::Channel resource does support GetAtt for IngestEndpoints but it returns a complex object like

[
    {
        "Id": "1",
        "Url": "https://abc123-1.ingest.def456.mediapackagev2.us-east-1.amazonaws.com/in/v1/test-channel/1/test-channel/index"
    },
    {
        "Id": "2",
        "Url": "https://abc123-2.ingest.def456.mediapackagev2.us-east-1.amazonaws.com/in/v1/test-channel/2/test-channel/index"
    }
]

You could get the first element of the array like this:

!Select [0, !GetAtt mediaPackageV2Channel.IngestEndpoints]

but that still leaves you with:

{
    "Id": "1",
    "Url": "https://abc123-1.ingest.def456.mediapackagev2.us-east-1.amazonaws.com/in/v1/test-channel/1/test-channel/index"
}

How would you further extract the Url from this object?

Perhaps add GetAtt support for

!GetAtt mediaPackageV2Channel.IngestEndpoints.0.Url
!GetAtt mediaPackageV2Channel.IngestEndpoints.1.Url

That resolves to the String Urls to be used by other resources in the template.


Workaround? I've found this this is able to deterministically create the ingest urls however direct GetAtt support would make this nicer.

Outputs:
  mediaPackageV2ChannelIngestEndpoint1:
    Value: !Join ['', ["https://", !Select [0, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], "-1.ingest.", !Select [2, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], !Sub ".mediapackagev2.${AWS::Region}.amazonaws.com/in/v1/", !Select [1, !Split [ '/', !Ref mediaPackageV2ChannelGroup ]], "/1/", !Select [3, !Split [ '/', !Ref mediaPackageV2Channel ]], "/index"]]
  mediaPackageV2ChannelIngestEndpoint2:
    Value: !Join ['', ["https://", !Select [0, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], "-2.ingest.", !Select [2, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], !Sub ".mediapackagev2.${AWS::Region}.amazonaws.com/in/v1/", !Select [1, !Split [ '/', !Ref mediaPackageV2ChannelGroup ]], "/2/", !Select [3, !Split [ '/', !Ref mediaPackageV2Channel ]], "/index"]]

Other Details

No response

mattyboy84 commented 1 month ago

coincidentally this is solved by MediaPackage's introduction of GetAtt support for

IngestEndpointUrls

This

Outputs:
  mediaPackageV2ChannelIngestEndpoint1:
    Value: !Join ['', ["https://", !Select [0, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], "-1.ingest.", !Select [2, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], !Sub ".mediapackagev2.${AWS::Region}.amazonaws.com/in/v1/", !Select [1, !Split [ '/', !Ref mediaPackageV2ChannelGroup ]], "/1/", !Select [3, !Split [ '/', !Ref mediaPackageV2Channel ]], "/index"]]
  mediaPackageV2ChannelIngestEndpoint2:
    Value: !Join ['', ["https://", !Select [0, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], "-2.ingest.", !Select [2, !Split ['.', !GetAtt mediaPackageV2ChannelGroup.EgressDomain]], !Sub ".mediapackagev2.${AWS::Region}.amazonaws.com/in/v1/", !Select [1, !Split [ '/', !Ref mediaPackageV2ChannelGroup ]], "/2/", !Select [3, !Split [ '/', !Ref mediaPackageV2Channel ]], "/index"]]

Can be simplified to

Outputs:
  mediaPackageV2ChannelIngestEndpoint1:
    Value: !Select [0, !GetAtt mediaPackageChannel.IngestEndpointUrls]
  mediaPackageV2ChannelIngestEndpoint2:
    Value: !Select [1, !GetAtt mediaPackageChannel.IngestEndpointUrls]