#!/usr/bin/env bash set -euo pipefail if ! command -v aws >/dev/null 2>&1; then echo "aws CLI is required. Install AWS CLI v2 and authenticate before running." >&2 exit 1 fi AWS_REGION="${AWS_REGION:-ap-south-1}" AWS_ACCOUNT_ID="${AWS_ACCOUNT_ID:-$(aws sts get-caller-identity --query Account --output text)}" BUCKET_NAME="${VELOCITY_MEDIA_BUCKET:-velocity-media-${AWS_ACCOUNT_ID}-${AWS_REGION}}" IAM_USER_NAME="${VELOCITY_MEDIA_IAM_USER:-velocity-media-app}" IAM_POLICY_NAME="${VELOCITY_MEDIA_IAM_POLICY_NAME:-VelocityMediaBucketReadWriteObjects}" CORS_ORIGIN="${VELOCITY_MEDIA_CORS_ORIGIN:-https://velocity.desineuron.in}" TMP_DIR="$(mktemp -d)" cleanup() { rm -rf "${TMP_DIR}" } trap cleanup EXIT bucket_exists() { aws s3api head-bucket --bucket "${BUCKET_NAME}" >/dev/null 2>&1 } create_bucket() { if bucket_exists; then echo "S3 bucket already exists: ${BUCKET_NAME}" return fi echo "Creating private S3 bucket: ${BUCKET_NAME} (${AWS_REGION})" if [[ "${AWS_REGION}" == "us-east-1" ]]; then aws s3api create-bucket --bucket "${BUCKET_NAME}" --region "${AWS_REGION}" >/dev/null else aws s3api create-bucket \ --bucket "${BUCKET_NAME}" \ --region "${AWS_REGION}" \ --create-bucket-configuration "LocationConstraint=${AWS_REGION}" >/dev/null fi aws s3api wait bucket-exists --bucket "${BUCKET_NAME}" } secure_bucket() { echo "Applying private bucket controls" aws s3api put-public-access-block \ --bucket "${BUCKET_NAME}" \ --public-access-block-configuration \ BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true aws s3api put-bucket-ownership-controls \ --bucket "${BUCKET_NAME}" \ --ownership-controls '{ "Rules": [ { "ObjectOwnership": "BucketOwnerEnforced" } ] }' aws s3api put-bucket-encryption \ --bucket "${BUCKET_NAME}" \ --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" }, "BucketKeyEnabled": true } ] }' aws s3api put-bucket-versioning \ --bucket "${BUCKET_NAME}" \ --versioning-configuration Status=Enabled } apply_cors() { local cors_file="${TMP_DIR}/cors.json" cat >"${cors_file}" <"${bucket_policy_file}" </dev/null 2>&1; then echo "IAM user already exists: ${IAM_USER_NAME}" return fi echo "Creating IAM user: ${IAM_USER_NAME}" aws iam create-user \ --user-name "${IAM_USER_NAME}" \ --tags Key=Project,Value=Velocity Key=Purpose,Value=MediaStorage >/dev/null } attach_restricted_policy() { local policy_file="${TMP_DIR}/iam-policy.json" cat >"${policy_file}" <