Skip to content

Instantly share code, notes, and snippets.

@lusoal
Last active June 6, 2024 12:24
Show Gist options
  • Select an option

  • Save lusoal/4de3dea19ded8f71f12dfcd82111ee57 to your computer and use it in GitHub Desktop.

Select an option

Save lusoal/4de3dea19ded8f71f12dfcd82111ee57 to your computer and use it in GitHub Desktop.
# Deployment Guide

## Initial Setup
1. **Deploy 3 Tenants in the Platform**:
   - Deploy one tenant in each tier. Note that the `pool-1` environment is already deployed.
   - Create new versions of Helm Charts and images to demonstrate updates already deployed.

2. **Get SQS Queues URL to Provision the Tenants**:
   ```bash
   export QUEUE_PREFIX="argoworkflows-"
   for queue in $(aws sqs list-queues --queue-name-prefix "$QUEUE_PREFIX" --output text --query 'QueueUrls[]'); do
       queue_name=$(echo "$queue" | awk -F/ '{print $NF}' | sed "s/^$QUEUE_PREFIX//")
       queue_env_var="ARGO_WORKFLOWS_$(echo "$queue_name" | tr '-' '_' | tr '[:lower:]' '[:upper:]')_SQS_URL"
       export "$queue_env_var"="$queue"
   done
  1. Open Argo Workflows:

    ARGO_WORKFLOW_URL=$(kubectl -n argo-workflows get service/argo-workflows-server -o json | jq -r '.status.loadBalancer.ingress[0].hostname')
    echo http://$ARGO_WORKFLOW_URL:2746/workflows
  2. Onboard 3 Tenants, One in Each Tier:

    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_ONBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-1",
            "tenant_tier": "premium",
            "release_version": "0.0"
        }'
    
    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_ONBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-2",
            "tenant_tier": "basic",
            "release_version": "0.0"
        }'
    
    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_ONBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-3",
            "tenant_tier": "advanced",
            "release_version": "0.0"
        }'
  3. Export Application LoadBalancer to Test Tenants:

    # Export Application Endpoint
    APP_LB=http://$(kubectl get ingress -n tenant-1 -o json | jq -r .items[0].status.loadBalancer.ingress[0].hostname)

Demonstration

  1. Show CodeCommit Repository for GitOps, Explore Add-Ons, Infra, and Everything:

    • Mention that we already have onboarded 3 tenants in different tiers.
    • Show commits where we can show that we have added new tenants.
    • On Cloud9, show all assets that flux is reconciling:
      flux get all
  2. Get Tenant Environments and Show the Tenants That We Have Deployed:

    flux get helmreleases | grep -i 0.0.1
  3. Deploy New Tenant-4 Model Premium to Show Creating of New Resources:

    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_ONBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-4",
            "tenant_tier": "premium",
            "release_version": "0.0"
        }'
  4. After Deployment Kicks In, Explore Various Tenants:

    • Explore Tenant-1 Premium:

      kubectl get all -ntenant-1
      curl -s -H "tenantID: tenant-1" $APP_LB/producer | jq
      curl -s -H "tenantID: tenant-1" $APP_LB/consumer | jq
    • Explore Tenant-2 Basic:

      kubectl get all -ntenant-2
      kubectl get all -npool-1 | grep -i tenant-2
      curl -s -H "tenantID: tenant-2" $APP_LB/producer | jq
      curl -s -H "tenantID: tenant-2" $APP_LB/consumer | jq
    • Tenant-3 Advanced:

      kubectl get all -ntenant-3
      kubectl get all -npool-1 | grep -i tenant-3
      curl -s -H "tenantID: tenant-3" $APP_LB/producer | jq
      curl -s -H "tenantID: tenant-3" $APP_LB/consumer | jq
  • Show Terraform Logs for Tenant-4

Further Updates and Offboarding

  1. Deploy Patch Version:

    • Mention that you've already created a new chart version with the only change being the producer microservice version.

    • Registry login and push new Helm version to ECR:

      export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
      
      aws ecr get-login-password --region $AWS_REGION | helm registry login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
      
      helm push helm-tenant-chart-0.0.2.tgz \
      oci://$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/gitops-saas
      
      aws ecr list-images --repository-name gitops-saas/helm-tenant-chart
    • Show patch being reconciled automatically because of wildcard:

      watch -n1 -d flux get helmreleases
    • Test Microservices:

      curl -s -H "tenantID: tenant-1" $APP_LB/producer | jq
      curl -s -H "tenantID: tenant-2" $APP_LB/producer | jq
      curl -s -H "tenantID: tenant-3" $APP_LB/producer | jq
      curl -s -H "tenantID: tenant-4" $APP_LB/producer | jq
  2. Deploy Major Version:

    • Show uncommenting Helm chart values, update chart version, and push package to ECR.
    • Uncomment Terraform for payments, tag commit, and push tag with new TF version.
    • Uncomment Tenant Tier Templates on GitOps folder
    • Trigger pipeline to deploy across all the tenants:
      aws sqs send-message \
          --queue-url $ARGO_WORKFLOWS_DEPLOYMENT_QUEUE_SQS_URL \
          --message-body '{
              "tenant_tier": "basic",
              "release_version": "1.0"
          }'
      
      aws sqs send-message \
          --queue-url $ARGO_WORKFLOWS_DEPLOYMENT_QUEUE_SQS_URL \
          --message-body '{
              "tenant_tier": "advanced",
              "release_version": "1.0"
          }'
      
      aws sqs send-message \
          --queue-url $ARGO_WORKFLOWS_DEPLOYMENT_QUEUE_SQS_URL \
          --message-body '{
              "tenant_tier": "premium",
              "release_version": "1.0"
          }'
  3. Offboarding:

    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_OFFBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-4",
            "tenant_tier": "premium"
        }'
    
    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_OFFBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-1",
            "tenant_tier": "premium"
        }'
    
    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_OFFBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-2",
            "tenant_tier": "basic"
        }'
    
    aws sqs send-message \
        --queue-url $ARGO_WORKFLOWS_OFFBOARDING_QUEUE_SQS_URL \
        --message-body '{
            "tenant_id": "tenant-3",
            "tenant_tier": "advanced"
        }'

This Markdown structure organizes your steps and commands in a clear, readable format. Adjust any headings or details as needed for your specific needs!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment