#!/usr/bin/env bash
# Raise an LMI function timeout to 90 minutes (5400s) and check SQS visibility.
# Context: AWS CLI v2. AWS Lambda Managed Instances async/ESM timeout, 9 Sep 2026.
# Requires: AWS CLI v2, iam:pass + lambda:UpdateFunctionConfiguration (+ sqs:GetQueueAttributes if QUEUE_URL is set).
# Usage: ./set-lmi-async-timeout.sh <function-name> [region] [sqs-queue-url]
#
# Sync invokes still cap at 15 minutes. Init still caps at 15 minutes.
# Amazon MQ and DocumentDB ESMs stay at 15 minutes — do not use this script for those sources.

set -euo pipefail

FUNCTION_NAME="${1:?function name required}"
REGION="${2:-us-east-1}"
QUEUE_URL="${3:-}"
TIMEOUT_SECONDS=5400
MIN_VISIBILITY=$((TIMEOUT_SECONDS * 6))

echo "Updating ${FUNCTION_NAME} timeout to ${TIMEOUT_SECONDS}s (90 min) in ${REGION}"
echo "Note: only async and ESM invokes on Managed Instances honor this value."

aws lambda update-function-configuration \
  --function-name "${FUNCTION_NAME}" \
  --timeout "${TIMEOUT_SECONDS}" \
  --region "${REGION}" \
  --output json \
  --query '{FunctionName:FunctionName,Timeout:Timeout,PackageType:PackageType}'

echo
echo "GetFunctionConfiguration reports the configured timeout even if a sync invoke is still capped at 900s."

if [[ -n "${QUEUE_URL}" ]]; then
  visibility="$(aws sqs get-queue-attributes \
    --queue-url "${QUEUE_URL}" \
    --attribute-names VisibilityTimeout \
    --region "${REGION}" \
    --query 'Attributes.VisibilityTimeout' \
    --output text)"
  echo
  echo "SQS VisibilityTimeout=${visibility}s; required minimum for a ${TIMEOUT_SECONDS}s function is ${MIN_VISIBILITY}s (6x)."
  if [[ "${visibility}" -lt "${MIN_VISIBILITY}" ]]; then
    echo "FAIL: raise queue visibility before deploying a 90-minute consumer."
    echo "Example:"
    echo "  aws sqs set-queue-attributes --queue-url ${QUEUE_URL} --attributes VisibilityTimeout=${MIN_VISIBILITY} --region ${REGION}"
    exit 1
  fi
  echo "OK: visibility timeout meets the 6x rule."
else
  echo
  echo "No QUEUE_URL passed. If this function is an SQS consumer, visibility must be >= ${MIN_VISIBILITY}s (9 hours)."
fi
