View a markdown version of this page

MediaConnect 使用示例 AWS CLI 使用 Bash 脚本 - AWS SDK 代码示例

D AWS oc AWS SDK 示例 GitHub 存储库中有更多 SDK 示例。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

MediaConnect 使用示例 AWS CLI 使用 Bash 脚本

以下代码示例向您展示了如何使用 with Bash 脚本来执行操作和实现常见场景。 AWS Command Line Interface MediaConnect

场景是向您演示如何通过在一个服务中调用多个函数或与其他 AWS 服务结合来完成特定任务的代码示例。

每个示例都包含一个指向完整源代码的链接,您可以从中找到有关如何在上下文中设置和运行代码的说明。

主题

场景

以下代码示例展示了如何:

  • 验证对 Elemental 的访问权限 MediaConnect

  • 创建流程

  • 添加输出

  • 清理资源

AWS CLI 使用 Bash 脚本
注意

还有更多 GitHub。在 Sample developer tutorials 存储库中查找完整示例,了解如何进行设置和运行。

#!/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" # Tags for all resources TAGS_ARRAY=("Key=project,Value=doc-smith" "Key=tutorial,Value=aws-elemental-mediaconnect-gs") # 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 tag MediaConnect resource tag_mediaconnect_resource() { local resource_arn="$1" echo "Tagging resource: $resource_arn" for tag in "${TAGS_ARRAY[@]}"; do if ! aws mediaconnect tag-resource --resource-arn "$resource_arn" --tags "$tag" 2>&1; then echo "WARNING: Failed to apply tag $tag to resource" fi done } # 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 # Tag the flow tag_mediaconnect_resource "$FLOW_ARN" # 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" tag_mediaconnect_resource "$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" tag_mediaconnect_resource "$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)"