Close

GitHub で AWS CloudWatch アラームをデプロイする

Warren Marusiak の顔写真
Warren Marusiak

シニア テクニカル エバンジェリスト

当社のチームは Jira Software とさまざまな接続ツールを使用してアプリケーションを開発、デプロイ、管理する方法を説明するために、機械学習を使用してイメージにラベルを添付する AWS 上に構築されたシンプルなデモ アプリケーションである ImageLabeller を作成しました。

このページでは、AWS SageMaker の定義済みモデルを設定する方法について説明します。これは、ImageLabeller が画像を正常に処理するために必要な前提条件です。はじめに、ImageLabeller アーキテクチャ ページと ImageLabeller を GitHub でデプロイするページをお読みの上、背景を確認することをお勧めします。


Opsgenie 統合用のアラーム リポジトリを追加する

Jira に移動して、AWS CloudWatch アラーム リポジトリを GitHub に追加するための新しい Jira 課題を作成します。この例では、Jira 課題 ID は IM-10 です。

GitHub リポジトリを追加する Jira 課題のスクリーンショット

GitHub に移動して [新規] をクリックします。[所有者] に適切な組織を選択します。[リポジトリを作成] をクリックして続行します。

GitHub でアラーム リポジトリを作成するスクリーンショット

[Settings]、[Secrets] の順にクリックします。AWS アクセス キー ID を AWS_ACCESS_KEY_ID として、AWS シークレット アクセス キーを AWS_SECRET_ACCESS_KEY として追加します。

GitHub で AWS アクセス キーを追加したスクリーンショット

ターミナルで CloudWatchAlarms リポジトリに移動して、次のコマンドを実行して AWS CloudFormation コードを 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

Alarms template.yml

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

SNS トピック サブスクリプション エンドポイントを、Opsgenie からコピーしたエンドポイント URL に設定します。SubmitImageLambdaAlarm は、SubmitImage AWS Lambda によって生成された単一のメトリックを監視します。呼び出しが 10 より多い場合は、1 分でアラームが鳴ります。

AWS にデプロイするための GitHub アクション

ターミナルの CloudWatchAlarms リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチ、.github/workflows ディレクトリの順に作成します。

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

次の yaml で deploy-test-staging.yml を作成します。これによって、メインライン以外のブランチに対するプッシュ中に実行されるテスト環境とステージング環境のデプロイ ワークフローが定義されます。

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"

次に、次の yaml で deploy-prod.yml を作成します。これによって、プル リクエストが変更をメインラインにマージする際に実行される本番環境のデプロイ ワークフローが定義されます。

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"

フィーチャー ブランチにプッシュ

コマンド ラインから次のコマンドを実行して、コードを CloudWatchAlarms リポジトリの IM-10 ブランチにプッシュします。

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

[アクション] をクリックして、実行中のワークフローを表示します。

GitHub で実行中のワークフローのスクリーンショット

プルリクエストを作成する

[プル リクエストの作成] をクリックして、メインラインにマージします。

GitHub のプル リクエストを作成するスクリーンショット

[アクション] をクリックして、本番環境のデプロイを監視します。

GitHub の本番デプロイのスクリーンショット

アラームのテスト

先ほど設定した AWS CloudWatch アラームをトリガーするか、[アラートを作成] をクリックしてアラートを生成します。

Opsgenie でアラートを作成したスクリーンショット

Slack をチェックして、通知が表示されたことを確認します。

Opsgenie における Slack 通知のスクリーンショット

おめでとうございます、これで完了です。ImageLabeller が稼動しています。

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.


この記事を共有する

おすすめコンテンツ

次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。

DevOps のイラスト

DevOps コミュニティ

DevOps のイラスト

DevOps ラーニング パス

マップのイラスト

無料で始める

DevOps ニュースレター購読

Thank you for signing up