Ontwerp een GitHub Actions Workflow voor Automatische Resource Scaling
description
Met deze prompt kan de gebruiker een geavanceerde GitHub Actions workflow ontwerpen die automatisch resources schaalt op basis van de behoeften van de CI/CD pipeline, waardoor de prestaties verbeteren en kosten efficiënter worden beheerd. Dit lost handmatige schaalproblemen op en biedt flexibiliteit voor verschillende omgevingen.
prompt
Help me een GitHub Actions workflow te ontwerpen die automatische scaling van resources ondersteunt tijdens CI/CD-processen. Projecttype: <voer je projecttype in, bijvoorbeeld Node.js, Python>. Schaalstrategie: <beschrijf de gewen ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een GitHub Actions workflow die automatische horizontale schaalvergroting ondersteunt op basis van CPU-belasting in AWS voor een Node.js-project. Deze workflow controleert de CPU-belasting en past automatisch het aantal EC2-instances aan via AWS API’s (bijvoorbeeld met behulp van AWS CLI of SDK).
**Belangrijk:** Zorg dat je AWS credentials hebt geconfigureerd als secrets in je repository (bijvoorbeeld `AWS_ACCESS_KEY_ID` en `AWS_SECRET_ACCESS_KEY`) en dat je de juiste rechten hebt om EC2-instances te beheren.
---
```yaml
name: CI met Auto-Scaling
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Installeer dependencies
run: npm install
- name: Installeer AWS CLI
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
- name: Configureer AWS credentials
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-1 # Pas dit aan naar je regio
run: |
aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
aws configure set default.region $AWS_DEFAULT_REGION
- name: Meet CPU-belasting
id: cpu_load
run: |
# Gebruik bijvoorbeeld 'mpstat' of 'top' om de CPU-belasting te meten
# Hier een voorbeeld met top:
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
echo "cpu_load=$CPU_USAGE" >> $GITHUB_OUTPUT
- name: Bepaal schaalverandering
id: scale_decision
run: |
CPU_THRESHOLD=70
# Lees de CPU-belasting
cpu_load=${{ steps.cpu_load.outputs.cpu_load }}
echo "Huidige CPU-belasting: $cpu_load%"
# Bepaal het aantal instances
DESIRED_CAPACITY=1 # standaard
if (( $(echo "$cpu_load > $CPU_THRESHOLD" | bc -l) )); then
# verhoog capaciteit
DESIRED_CAPACITY=3
elif (( $(echo "$cpu_load < 30" | bc -l) )); then
# verlaag capaciteit
DESIRED_CAPACITY=1
fi
echo "desired_capacity=$DESIRED_CAPACITY" >> $GITHUB_OUTPUT
- name: Pas autoscaling aan
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
# Voorbeeld: aanpassen van Auto Scaling Group (ASG)
AUTO_SCALING_GROUP_NAME="jouw-asg-naam"
desired_capacity=${{ steps.scale_decision.outputs.desired_capacity }}
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name $AUTO_SCALING_GROUP_NAME \
--desired-capacity $desired_capacity
echo "Schaal ingesteld op $desired_capacity instances."
```
---
**Uitleg:**
- De workflow wordt geactiveerd bij iedere push naar `main`.
- Het meet de CPU-belasting op de runner (in dit geval de GitHub-host OS – niet ideaal voor productie, maar illustratief).
- Gebaseerd op de CPU-belasting wordt het gewenste aantal instances bepaald.
- Daarna wordt de Auto Scaling Group (ASG) in AWS aangepast om het aantal instances te verhogen of verlagen.
**Aanpassingen benodigd:**
- Vervang `jouw-asg-naam` door de daadwerkelijke naam van je Auto Scaling Group.
- Pas de regio aan in de AWS-configuratie.
- Overweeg het gebruik van een meer betrouwbare manier om CPU-belasting te meten op je productie-omgeving.
- Overweeg het toevoegen van wacht- of interval-logica voor meer gecontroleerd schalen.
**Tip:** Voor een robuustere aanpak kun je een aparte service of Lambda gebruiken die periodiek de CPU-belasting meet en de ASG aanpast, in plaats van dit direct in CI/CD te doen.
provider: deepseek
model: deepseek-chat
Hier is een uitgebreide GitHub Actions workflow met automatische horizontale schaling op basis van CPU-belasting voor je Node.js project op AWS:
```yaml
name: CI/CD met Auto-scaling
on: [push]
env:
AWS_REGION: 'eu-west-1'
ECS_CLUSTER: 'nodejs-cluster'
ECS_SERVICE: 'nodejs-service'
CPU_THRESHOLD: '70'
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build application
run: npm run build
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
deploy-and-scale:
needs: build-and-test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Build and push Docker image
run: |
docker build -t ${{ secrets.AWS_ECR_REPOSITORY }}:latest .
aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com
docker push ${{ secrets.AWS_ECR_REPOSITORY }}:latest
- name: Deploy to ECS
run: |
aws ecs update-service \
--cluster ${{ env.ECS_CLUSTER }} \
--service ${{ env.ECS_SERVICE }} \
--force-new-deployment
- name: Configure Auto Scaling
run: |
# Configureer CloudWatch alarms voor CPU monitoring
aws cloudwatch put-metric-alarm \
--alarm-name "HighCPUUtilization-${{ env.ECS_SERVICE }}" \
--alarm-description "Alarm bij hoge CPU belasting" \
--metric-name CPUUtilization \
--namespace AWS/ECS \
--statistic Average \
--period 300 \
--threshold ${{ env.CPU_THRESHOLD }} \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--alarm-actions ${{ secrets.AWS_SCALING_POLICY_ARN }} \
--dimensions Name=ClusterName,Value=${{ env.ECS_CLUSTER }} Name=ServiceName,Value=${{ env.ECS_SERVICE }}
# Stel Application Auto Scaling in
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/${{ env.ECS_CLUSTER }}/${{ env.ECS_SERVICE }} \
--min-capacity 1 \
--max-capacity 10
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/${{ env.ECS_CLUSTER }}/${{ env.ECS_SERVICE }} \
--policy-name cpu-based-scaling \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration file://scaling-policy.json
monitoring:
needs: deploy-and-scale
runs-on: ubuntu-latest
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Monitor deployment status
run: |
echo "Monitoring deployment status..."
aws ecs wait services-stable \
--cluster ${{ env.ECS_CLUSTER }} \
--services ${{ env.ECS_SERVICE }}
echo "Deployment voltooid en service is stabiel"
```
**Benodigde bestanden:**
1. **Dockerfile** (in je project root):
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
```
2. **scaling-policy.json**:
```json
{
"TargetValue": 70.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 300
}
```
**Vereiste GitHub Secrets:**
- `AWS_ACCESS_KEY_ID`
- `AWS_SECRET_ACCESS_KEY`
- `AWS_ACCOUNT_ID`
- `AWS_ECR_REPOSITORY`
- `AWS_SCALING_POLICY_ARN`
**AWS Infrastructure vereisten:**
- ECS Cluster met Fargate
- ECR Repository
- Application Auto Scaling geconfigureerd
- IAM Rollen met juiste permissions
Deze workflow bouwt je applicatie, voert tests uit, deployt naar AWS ECS en configureert automatische horizontale schaling gebaseerd op CPU-utilisatie met een drempelwaarde van 70%.