View a markdown version of this page

MediaConnect examples using AWS CLI with Bash script - AWS SDK Code Examples

There are more AWS SDK examples available in the AWS Doc SDK Examples GitHub repo.

MediaConnect examples using AWS CLI with Bash script

The following code examples show you how to perform actions and implement common scenarios by using the AWS Command Line Interface with Bash script with MediaConnect.

Scenarios are code examples that show you how to accomplish specific tasks by calling multiple functions within a service or combined with other AWS services.

Each example includes a link to the complete source code, where you can find instructions on how to set up and run the code in context.

Topics

Scenarios

The following code example shows how to:

  • Verify access to Elemental MediaConnect

  • Create a flow

  • Add an output

  • Clean up resources

AWS CLI with Bash script
Note

There's more on GitHub. Find the complete example and learn how to set up and run in the Sample developer tutorials repository.

#!/bin/bash # AWS Elemental MediaConnect Getting Started Tutorial Script # This script creates a MediaConnect flow, adds an output, grants an entitlement, # and then cleans up the resources. set -euo pipefail # Security: Restrict umask to prevent world-readable files umask 0077 # Set up logging with restricted permissions LOG_FILE="mediaconnect-tutorial.log" touch "$LOG_FILE" chmod 600 "$LOG_FILE" exec > >(tee -a "$LOG_FILE") 2>&1 echo "Starting AWS Elemental MediaConnect tutorial script at $(date)" echo "All commands and outputs will be logged to $LOG_FILE" # Function to handle errors handle_error() { echo "ERROR: $1" >&2 echo "Attempting to clean up resources..." cleanup_resources exit 1 } # Function to validate AWS CLI is available validate_aws_cli() { if ! command -v aws &> /dev/null; then handle_error "AWS CLI is not installed or not in PATH" fi # Security: Verify AWS CLI version is recent local aws_version aws_version=$(aws --version 2>&1 | head -1) echo "AWS CLI version: $aws_version" if ! aws sts get-caller-identity &> /dev/null; then handle_error "AWS credentials are not configured or invalid" fi # Security: Validate caller identity local account_id account_id=$(aws sts get-caller-identity --query Account --output text 2>/dev/null) if [ -z "$account_id" ]; then handle_error "Failed to retrieve AWS account ID" fi echo "AWS Account ID: $account_id" } # Function to safely extract JSON values using jq (preferred) or fallback extract_json_value() { local json_output="$1" local key="$2" if [ -z "$json_output" ]; then return 1 fi # Security: Use jq if available for safer JSON parsing if command -v jq &> /dev/null; then echo "$json_output" | jq -r ".${key} // empty" 2>/dev/null || return 1 else # Fallback with additional validation if ! echo "$json_output" | grep -q "\"$key\""; then return 1 fi echo "$json_output" | grep -o "\"$key\": \"[^\"]*" | head -1 | cut -d'"' -f4 fi } # Function to clean up resources cleanup_resources() { echo "Cleaning up resources..." if [ -n "${FLOW_ARN:-}" ]; then # Security: Validate ARN format before using it if [[ ! "$FLOW_ARN" =~ ^arn:aws:mediaconnect:[a-z0-9-]+:[0-9]+:flow:[a-zA-Z0-9:-]+$ ]]; then echo "WARNING: Invalid Flow ARN format, skipping cleanup: $FLOW_ARN" return 1 fi # Check flow status before attempting to stop echo "Checking flow status..." local flow_status_output if flow_status_output=$(aws mediaconnect describe-flow --flow-arn "$FLOW_ARN" --query "Flow.Status" --output text 2>&1); then echo "Current flow status: $flow_status_output" if [ "$flow_status_output" == "ACTIVE" ] || [ "$flow_status_output" == "UPDATING" ]; then echo "Stopping flow: $FLOW_ARN" if aws mediaconnect stop-flow --flow-arn "$FLOW_ARN" 2>&1; then # Wait for flow to stop before deleting echo "Waiting for flow to stop..." sleep 10 else echo "WARNING: Failed to stop flow. Attempting to delete anyway..." fi else echo "Flow is not in ACTIVE or UPDATING state, skipping stop operation." fi # Delete the flow echo "Deleting flow: $FLOW_ARN" if aws mediaconnect delete-flow --flow-arn "$FLOW_ARN" 2>&1; then echo "Flow deleted successfully" else echo "WARNING: Failed to delete flow. You may need to manually delete it from the AWS console." fi else echo "WARNING: Could not check flow status" fi fi } # Set trap to cleanup on script exit trap cleanup_resources EXIT # Validate AWS CLI setup validate_aws_cli # Get the current AWS region aws_region="" if aws_region=$(aws configure get region 2>/dev/null); then if [ -z "$aws_region" ]; then handle_error "Failed to get AWS region. Please make sure AWS CLI is configured." fi else handle_error "Failed to retrieve AWS region configuration" fi # Security: Validate region format if [[ ! "$aws_region" =~ ^[a-z]{2}-[a-z]+-[0-9]$ ]]; then handle_error "Invalid AWS region format: $aws_region" fi AWS_REGION="$aws_region" echo "Using AWS Region: $AWS_REGION" # Get available availability zones in the current region echo "Getting available availability zones in region $AWS_REGION..." az_output="" if az_output=$(aws ec2 describe-availability-zones --region "$AWS_REGION" --query "AvailabilityZones[0].ZoneName" --output text 2>&1); then AVAILABILITY_ZONE="$az_output" if [ -z "$AVAILABILITY_ZONE" ]; then handle_error "Failed to retrieve availability zones" fi # Security: Validate AZ format if [[ ! "$AVAILABILITY_ZONE" =~ ^[a-z]{2}-[a-z]+-[0-9][a-z]$ ]]; then handle_error "Invalid availability zone format: $AVAILABILITY_ZONE" fi echo "Using availability zone: $AVAILABILITY_ZONE" else handle_error "Failed to get availability zones" fi # Generate a unique suffix for resource names SUFFIX=$(date +%s | cut -c 6-10) FLOW_NAME="AwardsNYCShow-${SUFFIX}" SOURCE_NAME="AwardsNYCSource-${SUFFIX}" OUTPUT_NAME="AwardsNYCOutput-${SUFFIX}" ENTITLEMENT_NAME="PhillyTeam-${SUFFIX}" echo "Using the following resource names:" echo "Flow name: $FLOW_NAME" echo "Source name: $SOURCE_NAME" echo "Output name: $OUTPUT_NAME" echo "Entitlement name: $ENTITLEMENT_NAME" # Step 1: Verify access to MediaConnect echo "Step 1: Verifying access to AWS Elemental MediaConnect..." list_flows_output="" if list_flows_output=$(aws mediaconnect list-flows 2>&1); then echo "$list_flows_output" else handle_error "Failed to list flows. Please check your AWS credentials and permissions." fi # Step 2: Create a flow echo "Step 2: Creating a flow..." create_flow_output="" if create_flow_output=$(aws mediaconnect create-flow \ --availability-zone "$AVAILABILITY_ZONE" \ --name "$FLOW_NAME" \ --source "Name=$SOURCE_NAME,Protocol=zixi-push,WhitelistCidr=10.24.34.0/23,StreamId=ZixiAwardsNYCFeed" 2>&1); then echo "$create_flow_output" else handle_error "Failed to create flow" fi # Extract the flow ARN from the output FLOW_ARN=$(echo "$create_flow_output" | jq -r '.Flow.FlowArn // empty' 2>/dev/null) if [ -z "$FLOW_ARN" ]; then FLOW_ARN=$(echo "$create_flow_output" | grep -o '"FlowArn": "[^"]*' | head -1 | cut -d'"' -f4) fi if [ -z "$FLOW_ARN" ]; then handle_error "Failed to extract flow ARN from output" fi echo "Flow ARN: $FLOW_ARN" # Validate flow ARN format if [[ ! "$FLOW_ARN" =~ ^arn:aws:mediaconnect:[a-z0-9-]+:[0-9]+:flow:[a-zA-Z0-9:-]+$ ]]; then handle_error "Invalid Flow ARN format: $FLOW_ARN" fi # Step 3: Add an output echo "Step 3: Adding an output to the flow..." add_output_output="" if add_output_output=$(aws mediaconnect add-flow-outputs \ --flow-arn "$FLOW_ARN" \ --outputs "Name=$OUTPUT_NAME,Protocol=zixi-push,Destination=198.51.100.11,Port=1024,StreamId=ZixiAwardsOutput" 2>&1); then echo "$add_output_output" else handle_error "Failed to add output to flow" fi # Extract the output ARN output_arn="" output_arn=$(echo "$add_output_output" | jq -r ".Output.OutputArn // empty" 2>/dev/null) if [ -z "$output_arn" ]; then output_arn=$(echo "$add_output_output" | grep -o '"OutputArn": "[^"]*' | head -1 | cut -d'"' -f4); fi if [ -z "$output_arn" ]; then echo "WARNING: Failed to extract output ARN from output" else OUTPUT_ARN="$output_arn" echo "Output ARN: $OUTPUT_ARN" fi # Step 4: Grant an entitlement echo "Step 4: Granting an entitlement..." grant_entitlement_output="" if grant_entitlement_output=$(aws mediaconnect grant-flow-entitlements \ --flow-arn "$FLOW_ARN" \ --entitlements "Name=$ENTITLEMENT_NAME,Subscribers=222233334444" 2>&1); then echo "$grant_entitlement_output" else handle_error "Failed to grant entitlement" fi # Extract the entitlement ARN entitlement_arn="" entitlement_arn=$(echo "$grant_entitlement_output" | jq -r '.Entitlement.EntitlementArn // empty' 2>/dev/null) if [ -z "$entitlement_arn" ]; then entitlement_arn=$(echo "$grant_entitlement_output" | grep -o '"EntitlementArn": "[^"]*' | head -1 | cut -d'"' -f4) fi if [ -z "$entitlement_arn" ]; then echo "WARNING: Failed to extract entitlement ARN from output" else ENTITLEMENT_ARN="$entitlement_arn" echo "Entitlement ARN: $ENTITLEMENT_ARN" fi # Step 5: List entitlements to share with affiliates echo "Step 5: Listing entitlements for the flow..." describe_flow_output="" if describe_flow_output=$(aws mediaconnect describe-flow --flow-arn "$FLOW_ARN" --query "Flow.Entitlements" 2>&1); then echo "Entitlements for the flow:" echo "$describe_flow_output" else handle_error "Failed to describe flow" fi # Display information to share with affiliates echo "" echo "Information to share with your Philadelphia affiliate:" echo "Entitlement ARN: ${ENTITLEMENT_ARN:-N/A}" echo "AWS Region: $AWS_REGION" # Display resource summary echo "" echo "===========================================" echo "RESOURCE SUMMARY" echo "===========================================" echo "The following resources were created:" echo "1. Flow: $FLOW_NAME (ARN: $FLOW_ARN)" echo "2. Output: $OUTPUT_NAME (ARN: ${OUTPUT_ARN:-N/A})" echo "3. Entitlement: $ENTITLEMENT_NAME (ARN: ${ENTITLEMENT_ARN:-N/A})" echo "" echo "===========================================" echo "CLEANUP CONFIRMATION" echo "===========================================" echo "Automatically cleaning up all created resources..." echo "Script completed at $(date)"