|
| 1 | +#!/bin/bash |
| 2 | +# Deploy Cedar policy to MCP Gateway |
| 3 | +# Requires AWS CLI 2.32+ |
| 4 | +set -e |
| 5 | + |
| 6 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 7 | + |
| 8 | +# Load environment |
| 9 | +if [ -f "$SCRIPT_DIR/.env" ]; then |
| 10 | + source "$SCRIPT_DIR/.env" |
| 11 | +fi |
| 12 | + |
| 13 | +GATEWAY_ARN="arn:aws:bedrock-agentcore:${AWS_REGION}:${ACCOUNT_ID}:gateway/${MCP_GATEWAY_ID}" |
| 14 | +POLICY_FILE="${SCRIPT_DIR}/backoffice-policy.cedar" |
| 15 | + |
| 16 | +echo "Deploying Cedar policy..." |
| 17 | +echo " Gateway: ${MCP_GATEWAY_ID}" |
| 18 | +echo " Policy Engine: ${MCP_POLICY_ENGINE_ID}" |
| 19 | +echo "" |
| 20 | + |
| 21 | +# Read and substitute policy |
| 22 | +POLICY_STATEMENT=$(sed "s|\${GATEWAY_ARN}|${GATEWAY_ARN}|g" "$POLICY_FILE") |
| 23 | + |
| 24 | +# Delete existing policies and wait for deletion |
| 25 | +echo "1. Cleaning up existing policies..." |
| 26 | +EXISTING=$(aws bedrock-agentcore-control list-policies \ |
| 27 | + --policy-engine-id "${MCP_POLICY_ENGINE_ID}" \ |
| 28 | + --query 'policies[].policyId' --output text 2>/dev/null || true) |
| 29 | + |
| 30 | +for PID in $EXISTING; do |
| 31 | + echo " Deleting: $PID" |
| 32 | + aws bedrock-agentcore-control delete-policy \ |
| 33 | + --policy-engine-id "${MCP_POLICY_ENGINE_ID}" \ |
| 34 | + --policy-id "$PID" > /dev/null |
| 35 | + |
| 36 | + # Wait for deletion to complete |
| 37 | + while true; do |
| 38 | + STATUS=$(aws bedrock-agentcore-control get-policy \ |
| 39 | + --policy-engine-id "${MCP_POLICY_ENGINE_ID}" \ |
| 40 | + --policy-id "$PID" \ |
| 41 | + --query 'status' --output text 2>/dev/null || echo "DELETED") |
| 42 | + |
| 43 | + if [ "$STATUS" = "DELETED" ] || [ -z "$STATUS" ]; then |
| 44 | + break |
| 45 | + fi |
| 46 | + sleep 2 |
| 47 | + done |
| 48 | +done |
| 49 | + |
| 50 | +# Create new policy |
| 51 | +echo "" |
| 52 | +echo "2. Creating policy..." |
| 53 | +POLICY_ID=$(aws bedrock-agentcore-control create-policy \ |
| 54 | + --policy-engine-id "${MCP_POLICY_ENGINE_ID}" \ |
| 55 | + --name "ForbidDangerousOperations" \ |
| 56 | + --validation-mode "IGNORE_ALL_FINDINGS" \ |
| 57 | + --definition "{\"cedar\":{\"statement\":$(echo "$POLICY_STATEMENT" | jq -Rs .)}}" \ |
| 58 | + --query 'policyId' --output text) |
| 59 | + |
| 60 | +echo " Policy ID: $POLICY_ID" |
| 61 | + |
| 62 | +# Wait for ACTIVE |
| 63 | +echo "" |
| 64 | +echo "3. Waiting for policy to become ACTIVE..." |
| 65 | +for i in {1..30}; do |
| 66 | + STATUS=$(aws bedrock-agentcore-control get-policy \ |
| 67 | + --policy-engine-id "${MCP_POLICY_ENGINE_ID}" \ |
| 68 | + --policy-id "$POLICY_ID" \ |
| 69 | + --query 'status' --output text) |
| 70 | + |
| 71 | + echo " Status: $STATUS" |
| 72 | + |
| 73 | + if [ "$STATUS" = "ACTIVE" ]; then |
| 74 | + echo "" |
| 75 | + echo "✅ Policy deployed successfully!" |
| 76 | + exit 0 |
| 77 | + elif [[ "$STATUS" == *"FAILED"* ]]; then |
| 78 | + echo "" |
| 79 | + echo "❌ Policy deployment failed" |
| 80 | + exit 1 |
| 81 | + fi |
| 82 | + sleep 2 |
| 83 | +done |
| 84 | + |
| 85 | +echo "❌ Timeout waiting for policy" |
| 86 | +exit 1 |
0 commit comments