Add AMI replication helper script
This commit is contained in:
parent
14748088a1
commit
3da8cf8a29
110
packer/Cloud-Neutra-VMs/packer/scripts/common/ami-replicate.sh
Executable file
110
packer/Cloud-Neutra-VMs/packer/scripts/common/ami-replicate.sh
Executable file
@ -0,0 +1,110 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<USAGE
|
||||||
|
Usage: $0 <AMI_ID> <EDITION> <UBUNTU_VERSION> <CPU_ARCH> <BASE_REGION> "<TARGET_REGIONS>" <PROJECT_TAG>
|
||||||
|
|
||||||
|
Example:
|
||||||
|
$0 ami-1234567890 base 2204 amd64 ap-northeast-1 "ap-northeast-1 ap-east-1" Cloud-Neutra
|
||||||
|
USAGE
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$#" -ne 7 ]; then
|
||||||
|
echo "[ami-replicate] ERROR: Invalid arguments" >&2
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
AMI_ID="$1"
|
||||||
|
EDITION="$2"
|
||||||
|
UBUNTU_VERSION="$3"
|
||||||
|
CPU_ARCH="$4"
|
||||||
|
BASE_REGION="$5"
|
||||||
|
TARGET_REGIONS_STR="$6"
|
||||||
|
PROJECT_TAG="$7"
|
||||||
|
|
||||||
|
if ! command -v aws >/dev/null 2>&1; then
|
||||||
|
echo "[ami-replicate] ERROR: aws CLI is required." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$TARGET_REGIONS_STR" ]; then
|
||||||
|
echo "[ami-replicate] ERROR: TARGET_REGIONS cannot be empty." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalize target regions into an array
|
||||||
|
IFS=' ' read -r -a TARGET_REGIONS <<< "$TARGET_REGIONS_STR"
|
||||||
|
|
||||||
|
if [ "${#TARGET_REGIONS[@]}" -eq 0 ]; then
|
||||||
|
echo "[ami-replicate] ERROR: No target regions provided." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fetch AMI metadata from base region
|
||||||
|
read -r IMAGE_NAME IMAGE_DESC <<< "$(aws ec2 describe-images \
|
||||||
|
--region "$BASE_REGION" \
|
||||||
|
--image-ids "$AMI_ID" \
|
||||||
|
--query 'Images[0].[Name,Description]' \
|
||||||
|
--output text)"
|
||||||
|
|
||||||
|
if [ -z "$IMAGE_NAME" ] || [ "$IMAGE_NAME" = "None" ]; then
|
||||||
|
echo "[ami-replicate] ERROR: Unable to resolve AMI name for $AMI_ID in $BASE_REGION" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$IMAGE_DESC" ] || [ "$IMAGE_DESC" = "None" ]; then
|
||||||
|
IMAGE_DESC="Cloud-Neutra ${EDITION} image Ubuntu ${UBUNTU_VERSION} ${CPU_ARCH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
TAG_SET=(
|
||||||
|
Key=Name,Value="$IMAGE_NAME"
|
||||||
|
Key=Project,Value="$PROJECT_TAG"
|
||||||
|
Key=Edition,Value="$EDITION"
|
||||||
|
Key=UbuntuVersion,Value="$UBUNTU_VERSION"
|
||||||
|
Key=Architecture,Value="$CPU_ARCH"
|
||||||
|
Key=Role,Value=Golden-Image
|
||||||
|
Key=SourceRegion,Value="$BASE_REGION"
|
||||||
|
)
|
||||||
|
|
||||||
|
for REGION in "${TARGET_REGIONS[@]}"; do
|
||||||
|
if [ "$REGION" = "$BASE_REGION" ]; then
|
||||||
|
echo "[ami-replicate] Skip base region $BASE_REGION"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[ami-replicate] Replicating $AMI_ID ($IMAGE_NAME) to $REGION ..."
|
||||||
|
|
||||||
|
NEW_AMI_ID=$(aws ec2 copy-image \
|
||||||
|
--region "$REGION" \
|
||||||
|
--source-region "$BASE_REGION" \
|
||||||
|
--source-image-id "$AMI_ID" \
|
||||||
|
--name "$IMAGE_NAME" \
|
||||||
|
--description "$IMAGE_DESC" \
|
||||||
|
--query 'ImageId' \
|
||||||
|
--output text)
|
||||||
|
|
||||||
|
echo "[ami-replicate] Waiting for AMI $NEW_AMI_ID in $REGION to become available ..."
|
||||||
|
aws ec2 wait image-available --region "$REGION" --image-ids "$NEW_AMI_ID"
|
||||||
|
|
||||||
|
echo "[ami-replicate] Tagging AMI $NEW_AMI_ID in $REGION"
|
||||||
|
aws ec2 create-tags --region "$REGION" --resources "$NEW_AMI_ID" --tags "${TAG_SET[@]}"
|
||||||
|
|
||||||
|
SNAPSHOT_IDS=$(aws ec2 describe-images \
|
||||||
|
--region "$REGION" \
|
||||||
|
--image-ids "$NEW_AMI_ID" \
|
||||||
|
--query 'Images[0].BlockDeviceMappings[].Ebs.SnapshotId' \
|
||||||
|
--output text)
|
||||||
|
|
||||||
|
if [ -n "$SNAPSHOT_IDS" ]; then
|
||||||
|
for SNAP_ID in $SNAPSHOT_IDS; do
|
||||||
|
echo "[ami-replicate] Tagging snapshot $SNAP_ID in $REGION"
|
||||||
|
aws ec2 create-tags --region "$REGION" --resources "$SNAP_ID" --tags "${TAG_SET[@]}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[ami-replicate] Completed replication to $REGION (AMI: $NEW_AMI_ID)"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[ami-replicate] Replication process finished."
|
||||||
Loading…
Reference in New Issue
Block a user