Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Workflow broadcast end-to-end con AWS MediaConnect

By Nikhil PawarJun 23, 202510 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

Nel panorama media di oggi, sempre più dinamico, trasportare contenuti video di alta qualità in modo affidabile e sicuro attraverso le reti è diventato indispensabile. Che si tratti di un broadcaster impegnato a trasmettere eventi live a un pubblico globale, di un content creator che distribuisce video premium su piattaforme di streaming o di un'azienda che gestisce le comunicazioni video interne, preservare la qualità del video e garantire al tempo stesso sicurezza e affidabilità può rivelarsi un'impresa tutt'altro che semplice.

È qui che entra in gioco AWS Elemental MediaConnect, una soluzione che cambia le regole del gioco. Si tratta di un servizio cloud che ridefinisce il concetto stesso di trasporto video, offrendo un modo scalabile, sicuro e di altissima qualità per spostare flussi video sulle reti globali. Pensato per semplificare i workflow di streaming, AWS Elemental MediaConnect elimina la complessità e i costi delle infrastrutture tradizionali.

Progettato per prestazioni e resilienza, MediaConnect supporta protocolli sicuri di settore come Zixi, SRT e RIST, per garantire che i contenuti arrivino integri e ai massimi standard qualitativi. Funzionalità come l'ingest flessibile delle sorgenti, gli output ridondanti e la stretta integrazione con gli AWS Media Services (come MediaLive e MediaPackage) permettono ai team di distribuire flussi impeccabili e a bassa latenza, lasciando spazio a ciò che conta davvero: i contenuti, non la pipeline.

AWS Elemental MediaConnect supporta diversi scenari di distribuzione video di alta qualità, tra cui:

  • Da on-premises ad AWS: trasporto sicuro del video da encoder di contribuzione (o altre sorgenti on-prem) verso AWS tramite protocolli affidabili come Zixi, SRT o RIST.
  • Da AWS a on-premises: distribuzione del video elaborato da AWS verso sedi on-premises per riproduzione, monitoraggio o ulteriore elaborazione.
  • Sindacazione cloud-to-cloud: condivisione di contenuti tra regioni AWS o con altre piattaforme cloud per strategie di ridondanza o multi-CDN.
  • Distribuzione globale sicura: consegna dei contenuti a utenti finali o partner in tutto il mondo, con cifratura e controlli di accesso integrati.

Grazie alla funzione di entitlement di MediaConnect, i clienti possono ripartire i costi di distribuzione con i propri abbonati o clienti, attivando o disattivando l'entitlement con un semplice clic.

Diagramma architetturale

Configurazione di MediaConnect (ingest)

Configurare un workflow standard di contribuzione cloud in MediaConnect

  • Creare il flow nell'account originator: ad esempio source-demoflow-in-originator-us-east-1. Ho aggiunto alcuni template CloudFormation come riferimento, ma mostrerò come creare le diverse pipeline media e collegarle tra loro tramite la console, per renderne più chiara la logica.

Creazione del flow

  • Inserire il nome, lasciare la Availability Zone sul valore predefinito, impostare Source type → Standard source, quindi scegliere il Protocol (ad esempio SRT listener).

Creazione del flow MediaConnect

Aggiungere un Allowlist CIDR block per proteggere il flow da utilizzi impropri. Ho inserito il mio indirizzo IP pubblico seguito da /32, insieme al numero di porta, ad esempio 5000. (Range valido: da 1024 a 65535 inclusi, eccetto 2077 e 2088. Caratteri validi: 0–9).

NOTA — Se il flusso è cifrato, è possibile selezionare l'opzione di decrittazione.

La chiave di decrittazione può essere conservata in AWS Secret Manager, dove AWS MediaConnect potrà recuperarla, a patto che il ruolo di MediaConnect disponga dei permessi per leggere il secret.

  • Avviare il flow:

source-demoflow-in-originator-us-east-1

  • Avviare lo stream: per inviare uno stream SRT al workflow MediaConnect uso OBS Studio. Aprire OBS e preparare lo stream. Selezionare Settings in OBS e poi Stream. Alla voce Server, inserire srt://<Inbound IP Address>:<Port>. Sostituire Inbound IP Address con l'indirizzo IP in ingresso del flow e Port con il relativo numero di porta. Lasciare vuoto Stream Key. Cliccare OK per chiudere la finestra Settings.

Trasmissione tramite OBS Studio

A questo punto si può avviare lo streaming in OBS per l'ingest sul flow di MediaConnect. Dopo qualche istante la sorgente dovrebbe passare allo stato Connected sotto Source health e dovreste vedere la miniatura del video. Lo stream è arrivato correttamente a MediaConnect, pronto per la distribuzione.

Stream alla sorgente di distribuzione nell'account originator

Creazione degli output

Configurare un workflow standard di distribuzione cloud dall'AWS Originator Account

  • Output #1: ad esempio protocollo SRT.

Creiamo ora un output con protocollo SRT nel flow di ingest cloud configurato in precedenza (source-demoflow-in-originator-us-east-1). Lo stream video verrà poi ricevuto e riprodotto su un laptop locale tramite VLC.

  • Aggiungere un output nella sezione output del flow MediaConnect (ad esempio output-1-srt-listner-from-source-demoflow-in-originator-us-east-1).

Output #1 — protocollo SRT

  • Avviare lo streaming da OBS e verificare in VLC che lo stream arrivi correttamente.

Output — Stato — Connected

  • Una volta configurato l'output di MediaConnect, aprire le impostazioni di rete di VLC e inserire srt://<Inbound IP Address>:Port nell'URL. Sostituire Inbound IP Address e Port con l'indirizzo IP in ingresso del flow, quindi cliccare Open.

VLC riproduce lo stream video tramite protocollo SRT, connesso attraverso il flow di output di MediaConnect

Nota: (opzionale) al momento non è possibile aggiungere tag a un flow MediaConnect tramite template CloudFormation; per aggiungerli sto usando una funzione lambda, ma si può procedere anche da console o CLI.

AWSTemplateFormatVersion: '2010-09-09'
Description: Create an AWS MediaConnect flow with an SRT listener source

Resources:
  MediaConnectFlow:
    Type: AWS::MediaConnect::Flow
    Properties:
      AvailabilityZone: us-east-1a
      Name: source-demoflow-in-originator-us-east-1
      Source:
        Name: nikhil-mac
        Description: nikhil-mac-machine
        Protocol: srt-listener
        IngestPort: 5000
        WhitelistCidr: 0.0.0.0/0  # Replace with a specific IP range for security
      SourceMonitoringConfig:
        ThumbnailState: ENABLED

  MediaConnectFlowOutput:
    Type: AWS::MediaConnect::FlowOutput
    Properties:
      FlowArn: !Ref MediaConnectFlow
      Name: output-1-srt-listner-from-source-demoflow-in-originator-us-east-1
      Description: Output-1-for-site-1-VLC
      Protocol: srt-listener
      Port: 2222
      MinLatency: 2000
      CidrAllowList:
        - 0.0.0.0/0

  TaggingLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      Policies:
        - PolicyName: MediaConnectTaggingPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - mediaconnect:TagResource
                Resource: !Sub 'arn:aws:mediaconnect:${AWS::Region}:${AWS::AccountId}:flow:*'

  TaggingLambda:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.9
      Handler: index.handler
      Role: !GetAtt TaggingLambdaRole.Arn
      Timeout: 30
      Code:
        ZipFile: |
          import boto3
          import cfnresponse

          def handler(event, context):
              if event['RequestType'] in ['Create', 'Update']:
                  try:
                      client = boto3.client('mediaconnect')
                      flow_arn = event['ResourceProperties']['FlowArn']
                      tags = [\
                          {'Key': 'name', 'Value': 'source-demoflow-in-originator-us-east-1'},\
                          {'Key': 'account', 'Value': '2111XXXXXXXX'},\
                          {'Key': 'created_by', 'Value': 'cloudformation'},\
                          {'Key': 'type', 'Value': 'originator'}\
                      ]

                      tag_dict = {}
                      for tag in tags:
                          tag_dict[tag['Key']] = tag['Value']

                      client.tag_resource(
                          ResourceArn=flow_arn,
                          Tags=tag_dict
                      )

                      cfnresponse.send(event, context, cfnresponse.SUCCESS, {})
                  except Exception as e:
                      print(f"Error tagging MediaConnect Flow: {str(e)}")
                      cfnresponse.send(event, context, cfnresponse.FAILED, {})
              else:
                  cfnresponse.send(event, context, cfnresponse.SUCCESS, {})

  MediaConnectFlowTags:
    Type: Custom::MediaConnectFlowTags
    DependsOn: MediaConnectFlow
    Properties:
      ServiceToken: !GetAtt TaggingLambda.Arn
      FlowArn: !Ref MediaConnectFlow

Outputs:
  FlowArn:
    Description: ARN of the MediaConnect Flow
    Value: !Ref MediaConnectFlow

  FlowOutputArn:
    Description: ARN of the MediaConnect Flow Output
    Value: !Ref MediaConnectFlowOutput
  • Output #2: concedere un entitlement a un altro account — Gli originator dei contenuti possono concedere entitlement per condividere i propri contenuti con altri account AWS (account subscriber). I subscriber potranno quindi configurare i propri flow di AWS Elemental MediaConnect usando il flow dell'originator come sorgente.

Concessione entitlement 1.1

Concessione entitlement 1.2

Nota — È possibile aggiungere più account in un singolo entitlement tramite "add subscriber".

  MediaConnectFlowEntitlement:
    Type: AWS::MediaConnect::FlowEntitlement
    Properties:
      FlowArn: !Ref MediaConnectFlow
      Name: entitlement-for-subscriber-account-7227XXXXXXXX
      Description: Entitlement for subscriber account
      Subscribers:
        - "7227XXXXXXXX"
      DataTransferSubscriberFeePercent: 100
      EntitlementStatus: ENABLED

Configurare un workflow standard di distribuzione cloud dall'AWS Subscriber Account

  • Creare un flow MediaConnect nell'account subscriber a cui si intende inviare lo stream; in fase di creazione deve essere disponibile l'ARN dell'entitlement.

Flow MediaConnect del subscriber tramite entitlement

#Sample Cloudformation template with Entilement
AWSTemplateFormatVersion: '2010-09-09'
Description: Subscriber MediaConnect flow using an entitlement from another account

Resources:
  SubscriberMediaConnectFlow:
    Type: AWS::MediaConnect::Flow
    Properties:
      AvailabilityZone: us-east-1a
      Name: subscriber-flow-from-originator-entitlement
      Source:
        Name: entitlement-source
        Description: Source from entitlement
        EntitlementArn: arn:aws:mediaconnect:us-east-1:2111XXXXXXXX:entitlement:1-WgUJUgRTAlJeUghT-b1637ab66a4c:entitlement-for-subscriber-account-7227XXXXXXXX
      SourceMonitoringConfig:
        ThumbnailState: ENABLED
  • Avviare entrambi i flow e iniziare lo streaming.

Stream in arrivo nell'account subscriber tramite entitlement

Collegare MediaConnect a MediaLive

  • Output #3: dal flow MediaConnect (account originator) a un canale AWS Elemental MediaLive (stesso account originator, stessa regione)
  • Canale AWS Elemental MediaLive: per prima cosa, creare un input per il canale MediaLive.
  • Iniziare aprendo la console del servizio MediaLive. Da lì:
  • Andare in Inputs e cliccare Create input.
  • In Input details, assegnare all'input un nome descrittivo.
  • Per Input type, selezionare MediaConnect.
  • Nella sezione MediaConnect flows, impostare Input class su SINGLE_INPUT. Sarà quindi necessario scegliere il Flow ARN specifico dall'elenco a discesa.
  • Per Role ARN, selezionare Use existing role e scegliere MediaLiveAccessRole tra le opzioni disponibili.
  • Inseriti tutti i dettagli, cliccare Create per generare l'input.

Per approfondire Role, Inputs e AWS Elemental MediaLive, potete consultare il mio articolo dedicato a MediaLive qui.

Input MediaLive 1.1

Input MediaLive 1.2

  • Creare il canale MediaLive — dal menu AWS Elemental MediaLiveChannels → Create Channel. Inserire le informazioni generali, il Channel name e il ruolo IAM.

Canale MediaLive nell'originator

  • Nella sezione Channel template, scegliere Live event HLS. Channel class → Single Pipeline.

Impostazioni del canale MediaLive nell'originator

  • In Input attachments → cliccare Add. In Attach input, alla voce Input, scegliere il proprio input dall'elenco a discesa e confermare.
  • Il canale MediaLive richiede dei gruppi di output: le opzioni sono molteplici. A scopo dimostrativo userò HLS con S3 come destinazione, ad esempio nikhil-medialive-destination. In HLS group destination A, alla voce URL, inserire l'URL S3 nel formato seguente, utilizzando il nome del bucket S3 creato — s3://nikhil-medialive-destination/live/index.

Impostazioni di output del canale MediaLive

  • Creare il canale MediaLive e avviare lo stream da OBS. Lo stream dovrebbe arrivare al canale MediaLive e nel bucket S3 verranno generati i file. In via opzionale, è possibile aggiungere una distribution CloudFront sull'output HLS e riprodurre lo stream tramite l'URL di CloudFront, ad esempio https:///live/index.m3u8.

Da MediaConnect a MediaLive

MediaConnect cross-region

  • Output #4: da MediaLive (originator — us-east-1) a MediaConnect (originator — us-west-2)
  • Per prima cosa, creare un altro flow MediaConnect, come fatto in precedenza, in una regione diversa (ad esempio demoflow-in-originator-us-west-2).

Flow MediaConnect

  • Selezionando l'opzione di decrittazione, il contenuto proveniente dal canale MediaLive (us-east-1) sarà cifrato. (Nota: lo farò proprio per mostrare la parte di cifratura.) Sia il ruolo del flow MediaConnect sia quello di MediaLive dovranno avere accesso alla chiave di cifratura/decrittazione. La chiave di cifratura/decrittazione può essere conservata in AWS Secret Manager (in us-east-1) e replicata nella regione di destinazione (Oregon — us-west-2): i secret di AWS sono infatti risorse regionali e MediaConnect non li vedrà se non replicati.

  • Esempio di policy per il secret di AWS
{
  "Version" : "2012-10-17",
  "Statement" : [ {\
    "Sid" : "AllowMediaConnectGetSecretValue",\
    "Effect" : "Allow",\
    "Principal" : {\
      "Service" : "mediaconnect.amazonaws.com"\
    },\
    "Action" : "secretsmanager:GetSecretValue",\
    "Resource" : [\
         "arn:aws:secretsmanager:us-east-1:2111XXXXXXXX:secret:medialive-secret-us-east-1-jedikQ",\
         "arn:aws:secretsmanager:us-west-2:2111XXXXXXXX:secret:medialive-secret-us-east-1-jedikQ" ],\
    "Condition" : {\
      "StringEquals" : {\
        "aws:SourceAccount" : "2111XXXXXXXX"\
      }\
    }\
  }, {\
    "Sid" : "AllowMediaConnectListSecrets",\
    "Effect" : "Allow",\
    "Principal" : {\
      "Service" : "mediaconnect.amazonaws.com"\
    },\
    "Action" : "secretsmanager:ListSecrets",\
    "Resource" : "*",\
    "Condition" : {\
      "StringEquals" : {\
        "aws:SourceAccount" : "2111XXXXXXXX"\
      }\
    }\
  }, {\
    "Sid" : "AllowMediaLiveAccessRoleGetSecretValue",\
    "Effect" : "Allow",\
    "Principal" : {\
      "AWS" : "arn:aws:iam::2111XXXXXXXX:role/MediaLiveAccessRole"\
    },\
    "Action" : "secretsmanager:GetSecretValue",\
    "Resource" : [ "arn:aws:secretsmanager:us-east-1:211125713318:secret:medialive-secret-us-east-1-jedikQ", "arn:aws:secretsmanager:us-west-2:211125713318:secret:medialive-secret-us-east-1-jedikQ" ],\
    "Condition" : {\
      "StringEquals" : {\
        "aws:SourceAccount" : "2111XXXXXXXX"\
      }\
    }\
  } ]
}
  • A questo punto, configurare l'output MediaConnect (us-west-2) nel canale MediaLive (us-east-1) modificando il canale per completare la pipeline media.
  • Edit channel → Output group (add) → SRT → Confirm

Output group MediaLive — SRT

  • Assegnare un nome (ad esempio media-connect-srt-oregon) → Settings.

Impostazioni del gruppo di output SRT

  • Aggiungere l'URL SRT come endpoint MediaConnect (us-east-2) con la porta nel formato srt://<Inbound IP Address>:<Port> e selezionare il secret.

Endpoint SRT

Verifica dei workflow

Configurati gli input, il passaggio cruciale successivo è avviare tutti i workflow e il canale MediaLive. È così che ci si assicura che ogni output raggiunga la destinazione prevista e che ogni pipeline funzioni correttamente. Come si vede di seguito, la pipeline distribuisce i contenuti a tutti gli endpoint configurati.

Vediamo nel dettaglio il flusso tipico dei contenuti:

Lato originator (AWS Account 2111XXXXXXXX):

  • OBS (MAC) invia lo stream iniziale.
  • Lo stream viene instradato verso il flow MediaConnect nikhil-demoflow (us-east-1).
  • Da qui arriva a VLC (srt://3.233.7.232:5555) per la verifica locale.
  • Lo stream alimenta inoltre il canale Elemental MediaLive — nikhil-obs-channel (us-east-1).
  • Lo stream alimenta anche il flow MediaConnect — stream-from-account-2111XXXXXXXX-flow (us-east-1) nell'account subscriber (AWS Account 7227XXXXXXXX).
  • Nell'account originator, lo stream va dal flow MediaConnect nikhil-demoflow (us-east-1) a nikhil-demoflow-oregon (us-west-2).

Flow MediaConnect — us-west-2

Workflow del subscriber

Output #5: pipeline dall'endpoint MediaConnect dell'account subscriber al canale AWS Elemental MediaLive

Per questo passaggio, distribuirò rapidamente il canale MediaLive nell'account subscriber tramite il Workflow Wizard. Per maggiori dettagli sul Workflow Wizard, vi rimando al mio articolo dedicato.

Anziché ricorrere a un Entitlement (per account), creerò un output nel flow MediaConnect, che servirà come input per il canale MediaLive nell'account subscriber.

Output del flow del subscriber

  • Creare un input (di tipo MediaConnect) come fatto in precedenza e distribuire il canale MediaLive.

Workflow del subscriber — canale MediaLive

  • Infine, avviare tutti i workflow MediaConnect e i canali MediaLive e iniziare lo streaming.

Anteprima MediaPackage

Dall'ingest alla delivery, AWS Elemental MediaConnect costituisce la spina dorsale di workflow video scalabili e ad alte prestazioni. Integrando MediaLive per l'elaborazione in tempo reale, MediaPackage per il packaging just-in-time e CloudFront per la distribuzione globale — affiancati da AWS Secrets Manager per archiviare e gestire in sicurezza le chiavi di cifratura — i broadcaster possono proteggere i contenuti e distribuirli senza interruzioni a endpoint pubblici o privati. Con l'evolversi delle esigenze del live video, questa architettura mostra come gli AWS Media Services nascondano la complessità infrastrutturale, permettendo ai team di concentrarsi sull'innovazione anziché sull'overhead operativo.

Visualizzazione finale della pipeline

Pulizia

Eliminare tutte le risorse distribuite,

Canali MediaLivesubscriber-workflow, medialive-channel-in-originator

Flow MediaConnectsource-demoflow-in-originator-us-east-1, subscriber-flow-from-originator-entitlement, demoflow-in-originator-us-west-2

Secret di Secret Managermedialive-secret (rimuovere la replica del secret ed eliminarlo da us-east-1 nell'account originator)

Input MediaLiveinput-for-medialive-originator (creato separatamente)

Che stiate costruendo una piattaforma di streaming o esplorando le funzionalità media di AWS, mi auguro che questa guida vi aiuti a semplificare la configurazione delle pipeline MediaConnect e delle relative integrazioni. Dalla progettazione di architetture cloud all'automazione dell'infrastruttura, DoiT International mette a disposizione una competenza completa per modernizzare la vostra infrastruttura cloud. Contattateci qui per scoprire le nostre soluzioni di cloud engineering.