Close

Distribuzione degli allarmi AWS CloudWatch con GitHub

Primo piano di Warren Marusiak
Warren Marusiak

Senior Technical Evangelist

Per fornire una dimostrazione di come sviluppare, distribuire e gestire applicazioni utilizzando Jira Software e vari strumenti connessi, il nostro team ha creato ImageLabeller, una semplice applicazione demo basata su AWS che utilizza l'apprendimento automatico per applicare etichette alle immagini.

In questa pagina viene spiegato come configurare un modello predefinito AWS SageMaker, un prerequisito per la corretta elaborazione delle immagini in ImageLabeller. Prima di iniziare, ti consigliamo di leggere le pagine sull'architettura di ImageLabeller e sulla distribuzione di ImageLabeller con GitHub per contestualizzare i contenuti.


Aggiunta di un repository di allarmi per l'integrazione di Opsgenie

Vai su Jira e crea un nuovo ticket Jira per aggiungere un repository di allarmi AWS CloudWatch a GitHub. In questo esempio, l'ID del ticket Jira è IM-10.

Screenshot di un ticket Jira per l'aggiunta di un repository GitHub

Vai su GitHub e clicca su New (Nuovo). In Owner (Responsabile) scegli l'organizzazione appropriata. Clicca su Create repository (Crea repository) per procedere.

Screenshot della creazione di un repository di allarmi in GitHub

Clicca su Settings (Impostazioni), quindi su Secrets (Segreti). Aggiungi l'ID della chiave di accesso AWS come AWS_ACCESS_KEY_ID e la chiave di accesso segreta AWS come AWS_SECRET_ACCESS_KEY.

Screenshot dell'aggiunta di chiavi di accesso AWS in GitHub

Nel terminale utilizzato, vai al repository CloudWatchAlarms ed esegui lo script seguente per effettuare il push del codice AWS CloudFormation a GitHub.

git add --all
git commit -m "IM-10 add CloudWatchAlarms to github"
git remote add origin git@github.com:PmmQuickStartGuides01/CloudWatchAlarms.git
git branch -m mainline
git push -u origin mainline

template.yml per gli allarmi

Description: 'A description'

Resources:
  OpsGenieSNS:
    Type: AWS::SNS::Topic
    Properties: 
      DisplayName: 'Opsgenie'
      Subscription:
        - Endpoint: 'https://api.opsgenie.com/v1/json/cloudwatch?apiKey=a4449509-6998-4d55-841d-2e6b363520c7'
          Protocol: 'HTTPS'
      TopicName: 'Opsgenie'

  SubmitImageLambdaAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties: 
      AlarmActions:
        - !Ref 'OpsGenieSNS'
      AlarmDescription: 'SubmitImage Too Many Invocations'
      ComparisonOperator: 'GreaterThanThreshold'
      Dimensions:
        - Name: FunctionName
          Value: !ImportValue 'SubmitImageFunctionName'
      EvaluationPeriods: 1
      MetricName: 'Invocations'
      Namespace: 'AWS/Lambda'
      Period: 60
      Statistic: 'Sum'
      Threshold: 10

Imposta l'endpoint di sottoscrizione dell'argomento SNS sull'URL dell'endpoint che hai copiato da Opsgenie. SubmitImageLambdaAlarm monitora una singola metrica emessa dall'AWS Lambda SubmitImage. Se sono presenti più di 10 chiamate al minuto, l'allarme si attiva.

Azioni GitHub per la distribuzione in AWS

Vai al repository CloudWatchAlarms nel terminale utilizzato, crea un branch che abbia lo stesso nome dell'ID del ticket Jira e crea una directory .github/workflows.

git checkout -b IM-10
mkdir -p .github/workflows && cd .github/workflows

Crea deploy-test-staging.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per gli ambienti di test e staging che viene eseguito durante i push verso branch diversi dalla mainline.

name: deploy-cloudwatchalarms-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

jobs:
  deploy-us-west-1:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsAlarms
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsAlarms
          template: template.yml
          no-fail-on-empty-changeset: "1"

Quindi, crea deploy-prod.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per i tuoi ambienti di produzione che viene eseguito quando una pull request effettua il merge delle modifiche nella mainline.

name: deploy-cloudwatchalarms-prod
on:
  pull_request:
    branches:
      - mainline

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsAlarms
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsAlarms
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-ca-central-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsAlarms
          template: template.yml
          no-fail-on-empty-changeset: "1"

Push di un branch di funzioni

Dalla riga di comando esegui lo script riportato di seguito per effettuare il push del codice al branch IM-10 del repository CloudWatchAlarms.

git add --all
git commit -m "IM-10 add github actions to CloudWatchAlarms"
git push -u origin IM-10

Clicca su Actions (Azioni) per vedere i flussi di lavoro in esecuzione.

Screenshot dei flussi di lavoro in esecuzione in GitHub

Creare una pull request

Clicca su Create pull request (Crea pull request) per effettuare il merge nella mainline.

Screenshot della creazione di una pull request in GitHub

Clicca su Actions (Azioni) per monitorare la distribuzione della produzione.

Screenshot della distribuzione della produzione in GitHub

Test dell'allarme

Genera un avviso attivando l'allarme AWS CloudWatch che hai appena configurato o cliccando su Create alert (Crea avviso).

Screenshot della creazione di un avviso in Opsgenie

Verifica che la notifica sia stata visualizzata in Slack.

Screenshot della notifica Slack in Opsgenie

Bene! Ce l'hai fatta: ImageLabeller è attivo e funzionante.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Condividi l'articolo
Argomento successivo

Letture consigliate

Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.

Illustrazione su Devops

Community DevOps

Illustrazione su Devops

Percorso di apprendimento DevOps

Illustrazione di una mappa

Inizia gratis

Iscriviti alla nostra newsletter DevOps

Thank you for signing up