For subdomain bdt-chatbot: disable #22
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: "Lightsail service management" | |
run-name: "For subdomain ${{inputs.subdomain}}: ${{inputs.command}}" | |
on: | |
workflow_dispatch: | |
inputs: | |
subdomain: | |
description: 'Subdomain of navalabs.co on which to run command' | |
type: choice | |
default: '' | |
options: | |
- '' | |
- 'chat' | |
- 'chatbot' | |
- 'chatbdt' | |
- 'chat-bdt' | |
- 'bdtbot' | |
- 'bdt-bot' | |
- 'bdt-chat' | |
- 'bdt-chatbot' | |
- 'chatbot-prototype' | |
- 'chat.zone' | |
command: | |
description: "Command to perform on Lightsail service" | |
required: true | |
type: choice | |
default: 'status' | |
options: | |
- 'status' | |
- 'list_images' | |
- 'delete_old_images' | |
- 'enable' | |
- 'disable' | |
- 'disable_all' | |
- 'update_power' | |
- 'create_new' | |
- 'delete_service' | |
power: | |
description: "Only used for update_power and create_new commands: power of service (useful for deployment failures)" | |
type: choice | |
options: | |
# - '' | |
# - nano | |
- micro | |
- small | |
- medium | |
- large | |
- xlarge | |
permissions: | |
id-token: write # This is required for requesting the JWT from GitHub's OIDC provider for AWS authentication | |
env: | |
AWS_REGION: us-east-1 | |
SERVICE_NAME: ${{ inputs.subdomain }}-svc | |
DOMAIN_NAME: navalabs.co | |
FULL_DOMAIN: ${{ inputs.subdomain }}.navalabs.co | |
jobs: | |
lightsail: | |
runs-on: ubuntu-latest | |
steps: | |
- name: "Configure AWS credentials" | |
uses: aws-actions/configure-aws-credentials@v4 | |
with: | |
aws-region: ${{ env.AWS_REGION }} | |
role-to-assume: arn:aws:iam::654654379445:role/Lightsail_Mgmt_role | |
role-session-name: GitHub_to_AWS_via_FederatedOIDC | |
- name: "Install AWS lightsail command" | |
run: | | |
# Uncomment the following lines if you need to upgrade the AWS CLI version | |
# aws --version | |
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" | |
# unzip awscliv2.zip | |
# sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update | |
# which aws | |
aws --version | |
aws sts get-caller-identity | |
sudo curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/linux-amd64/lightsailctl" -o "/usr/local/bin/lightsailctl" | |
sudo chmod +x /usr/local/bin/lightsailctl | |
- name: "Extract branch name" | |
run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT | |
id: extract_branch | |
- name: "Install waitForLightsail.sh" | |
run: | | |
echo "https://raw.githubusercontent.com/$GITHUB_REPOSITORY/${{ steps.extract_branch.outputs.branch }}/.github/workflows/waitForLightsail.sh" | |
curl https://raw.githubusercontent.com/$GITHUB_REPOSITORY/${{ steps.extract_branch.outputs.branch }}/.github/workflows/waitForLightsail.sh -o waitForLightsail.sh | |
chmod +x waitForLightsail.sh | |
- name: "Enable service" | |
if: inputs.command == 'enable' | |
run: | | |
aws lightsail update-container-service --service-name "$SERVICE_NAME" --no-is-disabled | |
SLEEP_INTERVAL=5 waitForLightsail.sh service READY RUNNING | |
- name: "Disable service" | |
if: inputs.command == 'disable' | |
run: | | |
aws lightsail update-container-service --service-name "$SERVICE_NAME" --is-disabled | |
SLEEP_INTERVAL=10 waitForLightsail.sh service DISABLED | |
- name: "Disable all services" | |
if: inputs.command == 'disable_all' | |
run: | | |
SERVICES=$(aws lightsail get-container-services | jq -r '.containerServices[].containerServiceName') | |
while read SERVICE_NAME; do | |
if [ "$SERVICE_NAME" == "" ]; then | |
continue | |
fi | |
echo "Disabling service $SERVICE_NAME" | |
aws lightsail update-container-service --service-name "$SERVICE_NAME" --is-disabled | |
SLEEP_INTERVAL=5 waitForLightsail.sh service UPDATING | |
done <<< "$SERVICES" | |
while read SERVICE_NAME; do | |
SLEEP_INTERVAL=10 waitForLightsail.sh service DISABLED | |
done <<< "$SERVICES" | |
- name: "Update the power of the service to ${{inputs.power}}" | |
if: inputs.command == 'update_power' | |
run: | | |
aws lightsail update-container-service --service-name "$SERVICE_NAME" --power ${{inputs.power}} | |
SLEEP_INTERVAL=5 waitForLightsail.sh service READY | |
- name: "List images associated with service" | |
if: inputs.command == 'list_images' | |
run: | | |
aws lightsail get-container-images --service-name "$SERVICE_NAME" | |
- name: "Delete previous images" | |
if: inputs.command == 'delete_old_images' | |
run: | | |
IMAGE_NAMES=$(aws lightsail get-container-images --service-name "$SERVICE_NAME" | jq -r '.containerImages[].image') | |
# Skip the first image, which is the current image | |
OLD_IMAGE_NAMES=$(echo $IMAGE_NAMES | tail -n +2) | |
while read IMG_NAME; do | |
if [ "$IMG_NAME" == "" ]; then | |
continue | |
fi | |
echo "Deleting image $IMG_NAME" | |
echo aws lightsail delete-container-image --service-name "$SERVICE_NAME" --image $IMG_NAME; | |
done <<< "$OLD_IMAGE_NAMES" | |
echo "Images:" | |
aws lightsail get-container-images --service-name "$SERVICE_NAME" | |
- name: "Create new container service" | |
if: inputs.command == 'create_new' | |
run: | | |
# check if service already exists | |
if aws lightsail get-container-services --service-name "$SERVICE_NAME" > /dev/null; then | |
echo "Already exists: $SERVICE_NAME" | |
exit 0 | |
fi | |
# `micro` power is needed for it's memory capacity; 60%+ memory is needed for the vector DB | |
aws lightsail create-container-service --service-name $SERVICE_NAME --power ${{inputs.power}} --scale 1 --public-domain-names navalabs-cert=$FULL_DOMAIN | |
SLEEP_INTERVAL=15 waitForLightsail.sh service READY | |
SVC_URL=$(aws lightsail get-container-services --service-name "$SERVICE_NAME" | jq -r '.containerServices[0].url') | |
# Remove 'https://' prefix | |
URL_DOMAIN=${SVC_URL#https://} | |
# Remove '/' suffix | |
TARGET_DOMAIN=${URL_DOMAIN%/} | |
# If domain entry exists, delete it | |
OLD_TARGET=$(aws lightsail get-domain --domain-name $DOMAIN_NAME | jq -r ".domain.domainEntries[] | select( .name == \"$FULL_DOMAIN\" ) | .target") | |
if [ "$OLD_TARGET" ] ; then | |
echo "Deleting existing '$FULL_DOMAIN' entry with target '$OLD_TARGET'" | |
aws lightsail delete-domain-entry --domain-name $DOMAIN_NAME --domain-entry "type=A,isAlias=true,name=$FULL_DOMAIN,target=$OLD_TARGET" | |
fi | |
echo "Creating DNS assignment by adding a domain entry $FULL_DOMAIN to target $TARGET_DOMAIN" | |
aws lightsail create-domain-entry --domain-name $DOMAIN_NAME --domain-entry "type=A,isAlias=true,name=$FULL_DOMAIN,target=$TARGET_DOMAIN" | |
- name: "Delete container service" | |
if: inputs.command == 'delete_service' | |
run: | | |
# check if service exists | |
if ! aws lightsail get-container-services --service-name "$SERVICE_NAME"; then | |
echo "Service does not exist: $SERVICE_NAME" | |
exit 0 | |
fi | |
aws lightsail delete-container-service --service-name "$SERVICE_NAME" | |
- name: "Print status" | |
run: | | |
aws lightsail get-container-services | jq '.containerServices[] | { containerServiceName, createdAt, state, isDisabled, power, | |
"deployment_state": .currentDeployment.state, | |
"container_image": .currentDeployment.containers.chatbot.image, | |
"container_BUILD_DATE": .currentDeployment.containers.chatbot.environment.BUILD_DATE, | |
"container_GIT_SHA": .currentDeployment.containers.chatbot.environment.GIT_SHA, | |
"publicDomainNames": .publicDomainNames["navalabs-cert"] }' | |