|
| 1 | +#!/bin/bash |
| 2 | +WORK_DIR=$(mktemp -d); exec > >(tee -a "$WORK_DIR/alias.log") 2>&1 |
| 3 | +REGION=${AWS_DEFAULT_REGION:-$(aws configure get region 2>/dev/null)}; [ -z "$REGION" ] && echo "ERROR: No region" && exit 1; export AWS_DEFAULT_REGION="$REGION"; echo "Region: $REGION" |
| 4 | +RANDOM_ID=$(openssl rand -hex 4); FUNC="tut-alias-${RANDOM_ID}"; ROLE="lambda-alias-role-${RANDOM_ID}" |
| 5 | +handle_error() { echo "ERROR on line $1"; trap - ERR; cleanup; exit 1; }; trap 'handle_error $LINENO' ERR |
| 6 | +cleanup() { echo ""; echo "Cleaning up..."; aws lambda delete-alias --function-name "$FUNC" --name live 2>/dev/null; aws lambda delete-function --function-name "$FUNC" 2>/dev/null && echo " Deleted function"; aws iam detach-role-policy --role-name "$ROLE" --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole 2>/dev/null; aws iam delete-role --role-name "$ROLE" 2>/dev/null && echo " Deleted role"; rm -rf "$WORK_DIR"; echo "Done."; } |
| 7 | +ROLE_ARN=$(aws iam create-role --role-name "$ROLE" --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}' --query 'Role.Arn' --output text) |
| 8 | +aws iam attach-role-policy --role-name "$ROLE" --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole; sleep 10 |
| 9 | +echo "Step 1: Creating function (v1)" |
| 10 | +cat > "$WORK_DIR/v1.py" << 'EOF' |
| 11 | +def handler(event, context): return {"version": "1.0", "message": "Hello from v1"} |
| 12 | +EOF |
| 13 | +(cd "$WORK_DIR" && zip v1.zip v1.py > /dev/null) |
| 14 | +aws lambda create-function --function-name "$FUNC" --zip-file "fileb://$WORK_DIR/v1.zip" --handler v1.handler --runtime python3.12 --role "$ROLE_ARN" --architectures x86_64 > /dev/null |
| 15 | +aws lambda wait function-active-v2 --function-name "$FUNC" |
| 16 | +V1=$(aws lambda publish-version --function-name "$FUNC" --query 'Version' --output text) |
| 17 | +echo " Published version $V1" |
| 18 | +echo "Step 2: Creating alias pointing to v1" |
| 19 | +aws lambda create-alias --function-name "$FUNC" --name live --function-version "$V1" --query '{Alias:Name,Version:FunctionVersion}' --output table |
| 20 | +echo "Step 3: Deploying v2 with canary" |
| 21 | +cat > "$WORK_DIR/v2.py" << 'EOF' |
| 22 | +def handler(event, context): return {"version": "2.0", "message": "Hello from v2"} |
| 23 | +EOF |
| 24 | +(cd "$WORK_DIR" && zip v2.zip v2.py > /dev/null) |
| 25 | +aws lambda update-function-code --function-name "$FUNC" --zip-file "fileb://$WORK_DIR/v2.zip" > /dev/null |
| 26 | +aws lambda wait function-updated-v2 --function-name "$FUNC" |
| 27 | +V2=$(aws lambda publish-version --function-name "$FUNC" --query 'Version' --output text) |
| 28 | +aws lambda update-alias --function-name "$FUNC" --name live --function-version "$V2" --routing-config "{\"AdditionalVersionWeights\":{\"$V1\":0.1}}" > /dev/null |
| 29 | +echo " Alias 'live' → v2 (90%) + v1 (10%)" |
| 30 | +echo "Step 4: Invoking via alias (multiple times)" |
| 31 | +for i in $(seq 1 5); do aws lambda invoke --function-name "$FUNC" --qualifier live --cli-binary-format raw-in-base64-out "$WORK_DIR/out.json" > /dev/null; echo " $(cat $WORK_DIR/out.json)"; done |
| 32 | +echo "Step 5: Shifting all traffic to v2" |
| 33 | +aws lambda update-alias --function-name "$FUNC" --name live --function-version "$V2" --routing-config '{}' > /dev/null |
| 34 | +echo " Alias 'live' → v2 (100%)" |
| 35 | +echo ""; echo "Tutorial complete." |
| 36 | +echo "Do you want to clean up? (y/n): "; read -r CHOICE; [[ "$CHOICE" =~ ^[Yy]$ ]] && cleanup |
0 commit comments