Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

AWS MediaConnectで実現するエンドツーエンドの放送ワークフロー

By Nikhil PawarJun 23, 202510 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

変化の激しい今日のメディア業界では、高品質な映像コンテンツをネットワーク越しに確実かつ安全に届けることが欠かせません。グローバル視聴者にライブイベントを配信する放送事業者、プレミアム映像をストリーミングプラットフォームに供給するクリエイター、社内向け映像コミュニケーションを運用する企業——いずれの場合も、画質を保ちながらセキュリティと信頼性を両立させるのは容易ではありません。

こうした課題を一変させるのがAWS Elemental MediaConnectです。クラウドベースのこのサービスは、グローバルネットワーク全体にわたって映像フィードを高品質・スケーラブル・セキュアに伝送する仕組みを提供し、映像配信のあり方を大きく変えます。ストリーミングワークフローをシンプルにするAWS Elemental MediaConnectを使えば、従来型インフラに伴う複雑さとコストから解放されます。

MediaConnectはパフォーマンスとレジリエンスを重視して設計されており、Zixi、SRT、RISTといった業界標準のセキュアプロトコルに対応。コンテンツを最高品質のまま確実に届けます。柔軟なソース取り込み、冗長出力、AWS Media Services(MediaLiveやMediaPackageなど)との緊密な連携といった機能により、低遅延で安定したストリーム配信を実現。パイプラインの運用ではなく、コンテンツ制作そのものに集中できます。

AWS Elemental MediaConnectが対応する高品質映像配信のシナリオは多岐にわたります。

  • オンプレミスからAWSへ: Zixi、SRT、RISTなど信頼性の高いプロトコルを用いて、コントリビューションエンコーダー(またはその他のオンプレミスソース)からAWSへ映像を安全に伝送します。
  • AWSからオンプレミスへ: AWS上で処理した映像を、再生・モニタリング・追加処理のためにオンプレミス拠点へ戻します。
  • クラウド間シンジケーション: 冗長化やマルチCDN戦略のために、AWSリージョン間や他のクラウドプラットフォームとコンテンツを共有します。
  • グローバルでのセキュア配信: 暗号化とアクセス制御を組み込み、世界中のエンドユーザーやパートナーへコンテンツを届けます。

MediaConnectのエンタイトルメント機能を使えば、配信コストを契約者・顧客と分担でき、ボタン1つでエンタイトルメントの有効化・無効化を切り替えられます。

アーキテクチャ図

MediaConnectのセットアップ(取り込み)

MediaConnectで標準的なクラウドコントリビューションワークフローを構築する

  • オリジネーターアカウントでフローを作成: 例: source-demoflow-in-originator-us-east-1。参考用のCloudFormationテンプレートもいくつか用意していますが、本記事では理解しやすさを優先し、コンソール上で各メディアパイプラインを作成しつなぎ合わせる手順をデモで紹介します。

フローを作成

  • 名前を入力し、アベイラビリティーゾーンはデフォルトのまま、ソースタイプ → Standard sourceを選択。プロトコルを指定します(例: SRT listener)。

MediaConnectでフローを作成

不正利用からフローを守るため、許可リストCIDRブロックを追加します。ここでは自分のパブリックIPアドレスに /32 を付けて入力し、ポート番号(例: 5000)も併記しました(指定可能な範囲は1024〜65535、ただし2077と2088を除く。使用可能文字: 0〜9)。

注 — ストリームが暗号化されている場合は、復号オプションを選択できます。

復号キーはAWS Secrets Managerに保存し、AWS MediaConnectからアクセスできます。ただし、MediaConnectロールにそのシークレットを読み取る権限が必要です。

  • フローを開始:

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

  • ストリームを開始: ここではOBS StudioからMediaConnectワークフローへSRTストリームを送信します。OBSを起動して配信の準備を行い、設定から配信を開きます。サーバーには srt://<Inbound IP Address>:<Port> を入力し、Inbound IP AddressはフローのインバウンドIPアドレスに、Portはフローのポート番号に置き換えます。ストリームキーは空欄のままで構いません。OKをクリックして設定ダイアログを閉じます。

OBS Studioによる配信

OBSで配信を開始すると、MediaConnectフローへの取り込みが始まります。しばらくするとソースの正常性欄でステータスがConnectedに変わり、ストリーム映像のサムネイルが表示されます。これでストリームが配信用にMediaConnectへ到達した状態です。

オリジネーターアカウントの配信ソースに到達したストリーム

出力の作成

AWSオリジネーターアカウントから標準的なクラウド配信ワークフローを構築する

  • 出力 #1: 例: SRTプロトコル

先ほど構成したクラウド取り込みフロー(source-demoflow-in-originator-us-east-1)に、SRTプロトコルの出力を追加します。続いて、ローカルのノートPCでVLCプレーヤーを使い、映像ストリームを受信・再生します。

  • MediaConnectフローのOutputセクションで出力を追加します(例: output-1-srt-listner-from-source-demoflow-in-originator-us-east-1)。

出力 #1 — SRTプロトコル

  • OBSから配信を開始し、VLCでストリームが届いていることを確認します。

出力 — ステータス — Connected

  • MediaConnectの出力を構成したら、VLCのネットワーク設定を開き、URL欄に srt://<Inbound IP Address>:Port を入力します。Inbound IP AddressとPortはフローのインバウンドIPアドレスに置き換え、開くをクリックします。

MediaConnect出力フロー経由で接続し、SRTプロトコルで映像ストリームを再生するVLC

注:(任意)現時点ではCloudFormationテンプレートからMediaConnectフローにタグを追加できません。ここではタグ付与にLambda関数を使用していますが、コンソールや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
  • 出力 #2: 別アカウントへエンタイトルメントを付与する — コンテンツのオリジネーターはエンタイトルメントを付与することで、他のAWSアカウント(サブスクライバーアカウント)とコンテンツを共有できます。サブスクライバー側は、オリジネーターのフローをソースとして自身のAWS Elemental MediaConnectフローを構築できます。

エンタイトルメントの付与 1.1

エンタイトルメントの付与 1.2

注 — サブスクライバーを追加することで、1つのエンタイトルメントに複数のアカウントを含められます。

  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

AWSサブスクライバーアカウント側で標準的なクラウド配信ワークフローを構築する

  • MediaConnectフローを作成します。ストリームを受け取るサブスクライバーアカウントで作成し、その際にエンタイトルメントARNが利用可能になっている必要があります。

エンタイトルメント由来のサブスクライバーMediaConnectフロー

#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
  • 両方のフローを開始し、配信を始めます。

エンタイトルメント経由でサブスクライバーアカウントに到達したストリーム

MediaConnectとMediaLiveの接続

  • 出力 #3: MediaConnectフロー(オリジネーターアカウント)から同一リージョン内のAWS Elemental MediaLiveチャネル(オリジネーターアカウント)へ
  • AWS Elemental MediaLiveチャネル: まずはMediaLiveチャネルの入力を作成します。
  • MediaLiveのコンソールにアクセスし、以下の手順で進めます。
  • Inputsに移動し、Create inputをクリック。
  • Input detailsで、入力にわかりやすい名前を付けます。
  • Input typeMediaConnectを選択します。
  • MediaConnect flowsセクションで、Input classSINGLE_INPUTに設定。続いて、ドロップダウンから対象のFlow ARNを選択します。
  • Role ARNUse existing roleを選び、選択肢の中からMediaLiveAccessRoleを指定します。
  • すべての項目を入力したら、Createをクリックして入力を生成します。

ロールや入力、AWS Elemental MediaLiveについて詳しく知りたい方は、こちらのMediaLive記事をご覧ください。

MediaLive入力 1.1

MediaLive入力 1.2

  • MediaLiveチャネルを作成AWS Elemental MediaLiveメニュー → ChannelsCreate Channel。一般情報、Channel name、IAMロールを入力します。

オリジネーター内のMediaLiveチャネル

  • Channel templateセクションでLive event HLSを選択します。Channel class → Single Pipeline。

オリジネーター内のMediaLiveチャネル設定

  • Input attachmentsAddをクリック。Attach inputInputでドロップダウンから入力を選び、確定します。
  • MediaLiveチャネルには出力グループが必要です。複数の選択肢がありますが、ここではデモ目的でHLS+S3を出力先に使います。例: nikhil-medialive-destinationHLS group destination AURLに、作成したS3バケット名を使って次の形式でS3 URLを入力します — s3://nikhil-medialive-destination/live/index

MediaLiveチャネルの出力設定

  • MediaLiveチャネルを作成し、OBSから配信を開始します。ストリームがMediaLiveチャネルへ届き、S3バケットにファイルが生成されているはずです。任意で、HLS出力にCloudFrontディストリビューションを設定し、CloudFront URL(例: https:///live/index.m3u8)で映像ストリームを再生することもできます。

MediaConnectからMediaLiveへ

リージョン間のMediaConnect

  • 出力 #4: MediaLive(オリジネーター — us-east-1)からMediaConnect(オリジネーター — us-west-2)へ
  • まず、先ほどと同じ要領で別リージョンに新たなMediaConnectフローを作成します(例: demoflow-in-originator-us-west-2)。

MediaConnectフロー

  • ここで復号を選択すると、MediaLiveチャネル(us-east-1)から送られるコンテンツが暗号化されることを意味します(注: 暗号化部分を示すためにあえて選択しています)。MediaConnectフローのロールとMediaLiveのロールの両方に、暗号化/復号キーへのアクセス権が必要です。暗号化/復号キーはAWS Secrets Manager(us-east-1)に保存し、宛先リージョン(オレゴン — us-west-2)へレプリケートしておきます。AWSシークレットはリージョン単位のリソースであり、レプリケートしないとMediaConnectから参照できないためです。

  • 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"\
      }\
    }\
  } ]
}
  • 続いて、MediaLiveチャネル(us-east-1)を編集してMediaConnect(us-west-2)出力を構成し、メディアパイプラインを完成させます。
  • Edit channel → Output group(add) → SRT → Confirm

MediaLive出力グループ — SRT

  • 名前を付け(例: media-connect-srt-oregon)、設定に進みます。

SRT出力グループの設定

  • SRT URLとして、MediaConnectエンドポイント(us-east-2)を srt://<Inbound IP Address>:<Port> 形式でポート付きで追加し、シークレットを選択します。

SRTエンドポイント

ワークフローの動作確認

入力の構成が完了したら、次に重要なのはすべてのワークフローとMediaLiveチャネルを起動することです。これにより、すべての出力が想定どおりの宛先へ届き、各パイプラインが正しく動作していることを確認できます。下図のとおり、パイプラインは構成済みのすべてのエンドポイントへ正常にコンテンツを届けています。

典型的なコンテンツの流れを整理しておきましょう。

オリジネーター側(AWSアカウント 2111XXXXXXXX):

  • OBS(Mac)が初期ストリームを送信。
  • このストリームはMediaConnectフローnikhil-demoflow(us-east-1)へルーティングされます。
  • そこからローカル確認用のVLC(srt://3.233.7.232:5555)へ届けられます。
  • 同時に、ストリームはElemental MediaLiveチャネル — nikhil-obs-channel(us-east-1)にも入力されます。
  • さらに、サブスクライバーアカウント(AWSアカウント 7227XXXXXXXX)MediaConnectフロー — stream-from-account-2111XXXXXXXX-flow(us-east-1)へも入力されます。
  • オリジネーターアカウント内では、MediaConnectフロー nikhil-demoflow(us-east-1)からnikhil-demoflow-oregon(us-west-2)へストリームが送られます。

MediaConnectフロー — us-west-2

サブスクライバー側のワークフロー

出力 #5: サブスクライバーアカウントのMediaConnectエンドポイントからAWS Elemental MediaLiveチャネルへのパイプライン

ここでは、Workflow Wizardを使ってサブスクライバーアカウントにMediaLiveチャネルを手早くデプロイします。Workflow Wizardの詳細は、私のブログ記事をご覧ください。

今回はエンタイトルメント(アカウント向け)ではなく、MediaConnectフローに出力を作成し、それをサブスクライバーアカウント側のMediaLiveチャネルの入力として利用します。

サブスクライバーフロー — 出力

  • 先ほどと同様に入力(タイプ: mediaconnect)を作成し、MediaLiveチャネルをデプロイします。

サブスクライバー側ワークフロー — MediaLiveチャネル

  • 最後に、すべてのMediaConnectワークフローとMediaLiveチャネルを起動し、配信を開始します。

MediaPackageプレビュー

取り込みから配信まで、AWS Elemental MediaConnectはスケーラブルで高性能な映像ワークフローの土台となります。リアルタイム処理のMediaLive、ジャストインタイムパッケージングのMediaPackage、グローバル配信のCloudFrontに加え、暗号化キーを安全に保管・管理するAWS Secrets Managerを組み合わせることで、放送事業者はコンテンツを保護しつつ、パブリック/プライベートいずれのエンドポイントへもシームレスに届けられます。ライブ映像のニーズが進化し続ける中、このアーキテクチャはAWS Media Servicesがインフラの複雑さを抽象化し、運用負荷ではなくイノベーションにチームが集中できる仕組みを示すものです。

最終的なパイプラインの全体像

クリーンアップ

デプロイしたリソースをすべて削除します。

MediaLiveチャネルsubscriber-workflow、medialive-channel-in-originator

MediaConnectフローsource-demoflow-in-originator-us-east-1、subscriber-flow-from-originator-entitlement、demoflow-in-originator-us-west-2

Secrets Managerシークレットmedialive-secret(レプリケーションを解除し、オリジネーターアカウントのus-east-1から削除)

MediaLive入力input-for-medialive-originator(別途作成したもの)

ストリーミングプラットフォームを構築中の方も、AWSのメディアサービスを試している方も、本記事がMediaConnectパイプラインや各種連携のセットアップを整理する一助となれば幸いです。クラウドアーキテクチャの設計からインフラ自動化まで、DoiT Internationalはクラウドインフラのモダナイゼーションを総合的に支援します。クラウドエンジニアリングソリューションの詳細は、こちらからお気軽にお問い合わせください。