Skip to content

Commit 921cda1

Browse files
committed
design fixes
1 parent caaca2c commit 921cda1

1 file changed

Lines changed: 191 additions & 33 deletions

File tree

text/0884-aws-elemental-mediaconnect-l2.md

Lines changed: 191 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ const bridge = new mediaconnect.Bridge(stack, 'Bridge', {
9191
bridgeName: 'my-bridge',
9292
gateway: gateway,
9393
config: mediaconnect.BridgeConfiguration.egress({
94-
maxBitrate: mediaconnect.Bitrate.mbps(10),
94+
maxBitrate: cdk.Bitrate.mbps(10),
9595
flowSources: [{
9696
name: 'flow-source',
9797
flow: flow,
@@ -356,24 +356,47 @@ export interface IFlow extends IResource, IFlowRef {
356356
* @default - maximum over 60 seconds
357357
*/
358358
metricFailoverSourceSelected(props?: MetricOptions): Metric;
359+
360+
/**
361+
* Grant methods for this flow
362+
*/
363+
readonly grants: FlowGrants;
359364
}
360365
```
361366

362367
Provide fromMethod capability - allowing imports of the resource:
363368

364369
```ts
365-
/**
366-
* Creates a Flow construct that represents an external (imported) Flow
367-
*/
368-
public static fromFlowAttributes(scope: Construct, id: string, attrs: FlowAttributes): IFlow {
369-
class Import extends FlowBase implements IFlow {
370-
public readonly flowArn = attrs.flowArn;
371-
public readonly sourceArn = attrs.primarySourceArn;
372-
public readonly isFailoverEnabled = attrs.isFailoverEnabled ?? false;
373-
}
374-
375-
return new Import(scope, id);
376-
}
370+
// Simple import — when you only need the flow ARN
371+
const importedFlow = mediaconnect.Flow.fromFlowArn(
372+
stack, 'ImportedFlow',
373+
'arn:aws:mediaconnect:us-west-2:111122223333:flow:1-11111111111111111111111111111111:MyFlow',
374+
);
375+
376+
// Full import — when you need source ARN or failover state
377+
const importedFlow = mediaconnect.Flow.fromFlowAttributes(stack, 'ImportedFlow', {
378+
flowArn: 'arn:aws:mediaconnect:us-west-2:111122223333:flow:1-11111111111111111111111111111111:MyFlow',
379+
sourceArn: 'arn:aws:mediaconnect:us-west-2:111122223333:source:2-22222222222222222222222222222222:MySource',
380+
isFailoverEnabled: true,
381+
});
382+
```
383+
384+
##### Granting Permissions on Flows
385+
386+
Grant methods enable Lambda functions or Step Functions to orchestrate flow lifecycle without manual IAM policy wiring:
387+
388+
```ts
389+
declare const flow: mediaconnect.IFlow;
390+
declare const fn: lambda.IFunction;
391+
392+
// Grant permission to start the flow
393+
flow.grants.start(fn);
394+
395+
// Grant permission to stop the flow
396+
flow.grants.stop(fn);
397+
398+
// Grant arbitrary actions
399+
flow.grants.actions(fn, 'mediaconnect:UpdateFlow');
377400
```
378401

379402
##### Flow Source Types
@@ -424,9 +447,10 @@ new mediaconnect.Flow(stack, 'MyFlow', {
424447

425448
```ts
426449
// Import an entitlement from another AWS account
427-
const entitlement = mediaconnect.FlowEntitlement.fromFlowEntitlementAttributes(stack, 'ImportedEntitlement', {
428-
entitlementArn: 'arn:aws:mediaconnect:us-west-2:111122223333:entitlement:1-11111111111111111111111111111111:MyEntitlement',
429-
});
450+
const entitlement = mediaconnect.FlowEntitlement.fromFlowEntitlementArn(
451+
stack, 'ImportedEntitlement',
452+
'arn:aws:mediaconnect:us-west-2:111122223333:entitlement:1-11111111111111111111111111111111:MyEntitlement',
453+
);
430454

431455
new mediaconnect.Flow(stack, 'MyFlow', {
432456
source: mediaconnect.SourceConfiguration.entitlement({
@@ -435,6 +459,69 @@ new mediaconnect.Flow(stack, 'MyFlow', {
435459
});
436460
```
437461

462+
#### AWS Elemental MediaConnect Flow Source
463+
464+
A FlowSource (`AWS::MediaConnect::FlowSource`) is a standalone resource used to add secondary
465+
or failover sources to an existing flow. This is separate from the primary source defined in
466+
`FlowProps` — secondary sources are created as their own constructs and associated with a flow
467+
to enable failover configurations.
468+
469+
For further information refer to [our documentation](https://docs.aws.amazon.com/mediaconnect/latest/ug/flows-source.html).
470+
471+
```ts
472+
declare const flow: mediaconnect.IFlow;
473+
474+
new mediaconnect.FlowSource(stack, 'BackupSource', {
475+
flow: flow,
476+
flowSourceName: 'backup-source',
477+
source: mediaconnect.SourceConfiguration.srtListener({
478+
flowSourceName: 'backup',
479+
port: 5001,
480+
network: mediaconnect.NetworkConfiguration.publicNetwork('203.0.113.0/24'),
481+
}),
482+
});
483+
```
484+
485+
This enables failover configurations where the primary source is defined on the Flow and secondary sources are added as separate constructs.
486+
487+
#### AWS Elemental MediaConnect Flow Entitlement
488+
489+
A FlowEntitlement (`AWS::MediaConnect::FlowEntitlement`) grants another AWS account permission
490+
to access content from your flow. It is created on the content originator's side and consumed
491+
by the subscriber via `SourceConfiguration.entitlement()`.
492+
493+
For further information refer to [our documentation](https://docs.aws.amazon.com/mediaconnect/latest/ug/entitlements.html).
494+
495+
##### Creating an Entitlement
496+
497+
```ts
498+
declare const flow: mediaconnect.IFlow;
499+
500+
const entitlement = new mediaconnect.FlowEntitlement(stack, 'Entitlement', {
501+
flow: flow,
502+
entitlementName: 'partner-access',
503+
subscribers: ['111122223333'],
504+
description: 'Grant partner access to live feed',
505+
});
506+
```
507+
508+
##### Consuming an Entitlement (Subscriber Side)
509+
510+
The subscriber imports the entitlement ARN and uses it as a source in their own flow:
511+
512+
```ts
513+
const entitlement = mediaconnect.FlowEntitlement.fromFlowEntitlementArn(
514+
stack, 'ImportedEntitlement',
515+
'arn:aws:mediaconnect:us-west-2:111122223333:entitlement:1-11111111111111111111111111111111:MyEntitlement',
516+
);
517+
518+
new mediaconnect.Flow(stack, 'SubscriberFlow', {
519+
source: mediaconnect.SourceConfiguration.entitlement({
520+
entitlement: entitlement,
521+
}),
522+
});
523+
```
524+
438525
#### AWS Elemental MediaConnect VPC Interface
439526

440527
VPC interfaces enable MediaConnect flows to send and receive content through
@@ -553,7 +640,7 @@ new mediaconnect.Bridge(stack, 'EgressBridge', {
553640
bridgeName: 'my-egress-bridge',
554641
gateway: gateway,
555642
config: mediaconnect.BridgeConfiguration.egress({
556-
maxBitrate: mediaconnect.Bitrate.mbps(10),
643+
maxBitrate: cdk.Bitrate.mbps(10),
557644
flowSources: [{
558645
name: 'cloud-source',
559646
flow: flow,
@@ -692,16 +779,17 @@ gateway.addNetwork({
692779
You can import existing gateways for use in your CDK application:
693780

694781
```ts
695-
const gateway = mediaconnect.Gateway.fromAttributes(stack, 'ImportedGateway', {
696-
gatewayArn: 'arn:aws:mediaconnect:us-west-2:111122223333:gateway:1-11111111111111111111111111111111:MyGateway',
697-
});
782+
const gateway = mediaconnect.Gateway.fromGatewayArn(
783+
stack, 'ImportedGateway',
784+
'arn:aws:mediaconnect:us-west-2:111122223333:gateway:1-11111111111111111111111111111111:MyGateway',
785+
);
698786

699787
// Use the imported gateway with bridges
700788
new mediaconnect.Bridge(stack, 'MyBridge', {
701789
bridgeName: 'my-bridge',
702790
gateway: gateway,
703791
config: mediaconnect.BridgeConfiguration.egress({
704-
maxBitrate: mediaconnect.Bitrate.mbps(10),
792+
maxBitrate: cdk.Bitrate.mbps(10),
705793
flowSources: [/* ... */],
706794
networkOutputs: [/* ... */],
707795
}),
@@ -812,7 +900,7 @@ const gateway = new mediaconnect.Gateway(stack, 'MyGateway', {
812900
new mediaconnect.Bridge(stack, 'MyIngressBridge', {
813901
bridgeName: 'my-ingress-bridge',
814902
config: mediaconnect.BridgeConfiguration.ingress({
815-
maxBitrate: mediaconnect.Bitrate.mbps(10),
903+
maxBitrate: cdk.Bitrate.mbps(10),
816904
maxOutputs: 2,
817905
networkSources: [{
818906
name: 'on-prem-source',
@@ -836,7 +924,7 @@ declare const vpcInterface: mediaconnect.VpcInterfaceConfig;
836924
new mediaconnect.Bridge(stack, 'MyEgressBridge', {
837925
bridgeName: 'my-egress-bridge',
838926
config: mediaconnect.BridgeConfiguration.egress({
839-
maxBitrate: mediaconnect.Bitrate.mbps(10),
927+
maxBitrate: cdk.Bitrate.mbps(10),
840928
flowSources: [{
841929
name: 'cloud-source',
842930
flow: flow,
@@ -857,6 +945,17 @@ new mediaconnect.Bridge(stack, 'MyEgressBridge', {
857945
});
858946
```
859947

948+
##### Importing Existing Bridges
949+
950+
You can import existing bridges for use in your CDK application:
951+
952+
```ts
953+
const importedBridge = mediaconnect.Bridge.fromBridgeArn(
954+
stack, 'ImportedBridge',
955+
'arn:aws:mediaconnect:us-west-2:111122223333:bridge:1-11111111111111111111111111111111:MyBridge',
956+
);
957+
```
958+
860959
##### Adding Outputs to Bridges
861960

862961
For egress bridges, the `addOutput()` method provides a convenient
@@ -866,7 +965,7 @@ way to add network outputs:
866965
const bridge = new mediaconnect.Bridge(stack, 'MyEgressBridge', {
867966
bridgeName: 'my-egress-bridge',
868967
config: mediaconnect.BridgeConfiguration.egress({
869-
maxBitrate: mediaconnect.Bitrate.mbps(10),
968+
maxBitrate: cdk.Bitrate.mbps(10),
870969
flowSources: [{
871970
name: 'cloud-source',
872971
flow: flow,
@@ -955,6 +1054,30 @@ resources include network interfaces, inputs, and outputs.
9551054

9561055
For further information refer to [our documentation](https://docs.aws.amazon.com/mediaconnect/latest/ug/routers.html).
9571056

1057+
##### Importing Existing Router Resources
1058+
1059+
You can import existing router resources for use in your CDK application:
1060+
1061+
```ts
1062+
// Import a router network interface
1063+
const importedInterface = mediaconnect.RouterNetworkInterface.fromRouterNetworkInterfaceArn(
1064+
stack, 'ImportedInterface',
1065+
'arn:aws:mediaconnect:us-west-2:111122223333:router-network-interface:1-11111111111111111111111111111111:MyInterface',
1066+
);
1067+
1068+
// Import a router input
1069+
const importedInput = mediaconnect.RouterInput.fromRouterInputArn(
1070+
stack, 'ImportedInput',
1071+
'arn:aws:mediaconnect:us-west-2:111122223333:router-input:1-11111111111111111111111111111111:MyInput',
1072+
);
1073+
1074+
// Import a router output
1075+
const importedOutput = mediaconnect.RouterOutput.fromRouterOutputArn(
1076+
stack, 'ImportedOutput',
1077+
'arn:aws:mediaconnect:us-west-2:111122223333:router-output:1-11111111111111111111111111111111:MyOutput',
1078+
);
1079+
```
1080+
9581081
##### Router Network Interfaces
9591082

9601083
Network interfaces define the network connectivity for router inputs and outputs:
@@ -964,7 +1087,7 @@ Network interfaces define the network connectivity for router inputs and outputs
9641087
const publicInterface = new mediaconnect.RouterNetworkInterface(stack, 'PublicInterface', {
9651088
routerNetworkInterfaceName: 'public-interface',
9661089
configuration: mediaconnect.RouterNetworkConfiguration.publicNetwork({
967-
cidr: ['10.0.0.0/16'],
1090+
cidr: ['203.0.113.0/24'],
9681091
}),
9691092
});
9701093

@@ -991,7 +1114,7 @@ declare const networkInterface: mediaconnect.IRouterNetworkInterface;
9911114

9921115
const input = new mediaconnect.RouterInput(stack, 'RtpInput', {
9931116
routerInputName: 'rtp-input',
994-
maximumBitrate: mediaconnect.Bitrate.mbps(10),
1117+
maximumBitrate: cdk.Bitrate.mbps(10),
9951118
routingScope: mediaconnect.RoutingScope.REGIONAL,
9961119
tier: mediaconnect.RouterInputTier.INPUT_100,
9971120
availabilityZone: 'us-east-1a',
@@ -1009,7 +1132,7 @@ declare const flowOutput: mediaconnect.IFlowOutput;
10091132

10101133
const flowInput = new mediaconnect.RouterInput(stack, 'FlowInput', {
10111134
routerInputName: 'flow-input',
1012-
maximumBitrate: mediaconnect.Bitrate.mbps(20),
1135+
maximumBitrate: cdk.Bitrate.mbps(20),
10131136
routingScope: mediaconnect.RoutingScope.REGIONAL,
10141137
tier: mediaconnect.RouterInputTier.INPUT_50,
10151138
availabilityZone: 'us-east-1a',
@@ -1022,7 +1145,7 @@ const flowInput = new mediaconnect.RouterInput(stack, 'FlowInput', {
10221145
// MediaConnect Flow input without specific connection (requires explicit AZ)
10231146
const flowInputNoConnection = new mediaconnect.RouterInput(stack, 'FlowInputNoConnection', {
10241147
routerInputName: 'flow-input-no-connection',
1025-
maximumBitrate: mediaconnect.Bitrate.mbps(20),
1148+
maximumBitrate: cdk.Bitrate.mbps(20),
10261149
routingScope: mediaconnect.RoutingScope.REGIONAL,
10271150
tier: mediaconnect.RouterInputTier.INPUT_50,
10281151
availabilityZone: 'us-east-1a',
@@ -1032,6 +1155,41 @@ const flowInputNoConnection = new mediaconnect.RouterInput(stack, 'FlowInputNoCo
10321155
});
10331156
```
10341157

1158+
##### Router Input Grants
1159+
1160+
Grant methods enable orchestration of router input lifecycle:
1161+
1162+
```ts
1163+
declare const routerInput: mediaconnect.IRouterInput;
1164+
declare const fn: lambda.IFunction;
1165+
1166+
routerInput.grants.start(fn);
1167+
routerInput.grants.stop(fn);
1168+
routerInput.grants.restart(fn);
1169+
routerInput.grants.actions(fn, 'mediaconnect:UpdateRouterInput');
1170+
```
1171+
1172+
Interface for Router Input:
1173+
1174+
```ts
1175+
/**
1176+
* Interface for MediaConnect Router Input
1177+
*/
1178+
export interface IRouterInput extends IResource {
1179+
/**
1180+
* The Amazon Resource Name (ARN) of the router input
1181+
*
1182+
* @attribute
1183+
*/
1184+
readonly routerInputArn: string;
1185+
1186+
/**
1187+
* Grant methods for this router input
1188+
*/
1189+
readonly grants: RouterInputGrants;
1190+
}
1191+
```
1192+
10351193
##### Router Outputs
10361194

10371195
Router outputs send video streams to various destinations:
@@ -1042,7 +1200,7 @@ declare const networkInterface: mediaconnect.IRouterNetworkInterface;
10421200

10431201
const output = new mediaconnect.RouterOutput(stack, 'SrtOutput', {
10441202
routerOutputName: 'srt-output',
1045-
maximumBitrate: mediaconnect.Bitrate.mbps(10),
1203+
maximumBitrate: cdk.Bitrate.mbps(10),
10461204
routingScope: mediaconnect.RoutingScope.REGIONAL,
10471205
tier: mediaconnect.RouterOutputTier.OUTPUT_100,
10481206
configuration: mediaconnect.RouterOutputConfiguration.standard({
@@ -1059,7 +1217,7 @@ declare const mediaLiveInput: medialive.CfnInput;
10591217

10601218
const mediaLiveOutput = new mediaconnect.RouterOutput(stack, 'MediaLiveOutput', {
10611219
routerOutputName: 'medialive-output',
1062-
maximumBitrate: mediaconnect.Bitrate.mbps(15),
1220+
maximumBitrate: cdk.Bitrate.mbps(15),
10631221
routingScope: mediaconnect.RoutingScope.GLOBAL,
10641222
tier: mediaconnect.RouterOutputTier.OUTPUT_50,
10651223
configuration: mediaconnect.RouterOutputConfiguration.mediaLiveInput({
@@ -1071,7 +1229,7 @@ const mediaLiveOutput = new mediaconnect.RouterOutput(stack, 'MediaLiveOutput',
10711229
// MediaLive output without specific connection (requires explicit AZ)
10721230
const mediaLiveOutputNoConnection = new mediaconnect.RouterOutput(stack, 'MediaLiveOutputNoConnection', {
10731231
routerOutputName: 'medialive-output-no-connection',
1074-
maximumBitrate: mediaconnect.Bitrate.mbps(15),
1232+
maximumBitrate: cdk.Bitrate.mbps(15),
10751233
routingScope: mediaconnect.RoutingScope.GLOBAL,
10761234
tier: mediaconnect.RouterOutputTier.OUTPUT_50,
10771235
configuration: mediaconnect.RouterOutputConfiguration.mediaLiveInputWithoutConnection({
@@ -1084,7 +1242,7 @@ declare const flow: mediaconnect.IFlow;
10841242

10851243
const flowOutput = new mediaconnect.RouterOutput(stack, 'FlowOutput', {
10861244
routerOutputName: 'flow-output',
1087-
maximumBitrate: mediaconnect.Bitrate.mbps(20),
1245+
maximumBitrate: cdk.Bitrate.mbps(20),
10881246
routingScope: mediaconnect.RoutingScope.REGIONAL,
10891247
tier: mediaconnect.RouterOutputTier.OUTPUT_100,
10901248
configuration: mediaconnect.RouterOutputConfiguration.mediaConnectFlow({
@@ -1095,7 +1253,7 @@ const flowOutput = new mediaconnect.RouterOutput(stack, 'FlowOutput', {
10951253
// MediaConnect Flow output without specific connection (requires explicit AZ)
10961254
const flowOutputNoConnection = new mediaconnect.RouterOutput(stack, 'FlowOutputNoConnection', {
10971255
routerOutputName: 'flow-output-no-connection',
1098-
maximumBitrate: mediaconnect.Bitrate.mbps(20),
1256+
maximumBitrate: cdk.Bitrate.mbps(20),
10991257
routingScope: mediaconnect.RoutingScope.REGIONAL,
11001258
tier: mediaconnect.RouterOutputTier.OUTPUT_100,
11011259
configuration: mediaconnect.RouterOutputConfiguration.mediaConnectFlowWithoutConnection({

0 commit comments

Comments
 (0)