【小ネタ】GitHub Actionsを使って、特定のインスタンスタイプが3AZでサポートされたときにSlack通知する仕組みを作ってみた

2022.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

prismatixのとばち(@toda_kk)です。

特定のインスタンスタイプが3AZでサポートされたときに気づきたい

以前、特定のEC2インスタンスタイプをサポートしているリージョンを確認するスクリプトを作成してみたという内容の記事を書きました。

インスタンスタイプによっては、リージョンではサポートしているものの特定のAvailability Zone(AZ)ではサポートされていない場合があるため、上述の記事ではインスタンスタイプをサポートしているAZの一覧を表示するスクリプトもいっしょに記載しています。

例えば、2022年8月31日現在、東京リージョン(ap-northeast-1)ではR6iインスタンスタイプをサポートしているものの、apne1-az1ではサポートされていません。そのため、3AZ構成が取れないということになります。

AWS CLIを使って、東京リージョンでR6iインスタンスタイプをサポートしているAZの一覧を表示する

$ aws ec2 describe-instance-type-offerings --location-type availability-zone-id --region ap-northeast-1 --filters Name=instance-type,Values=r6i.large --query 'sort(InstanceTypeOfferings[*].Location)' --output text
apne1-az2       apne1-az4

特定のインスタンスタイプをサポートするリージョンが増えた場合には下記ページのように公式アナウンスがあるのですが、サポートするAZが増えた場合は特にアナウンスがないため、なかなか気付けないという懸念があります。

そこで、GitHub ActionsでWorkflowを作成し、定期的に上述のAWS CLIのコマンドを実行することで3AZサポートされたときにSlack通知する仕組みを作ってみました。

準備1: AWSアカウントでIAM IDプロバイダーとIAMロールを作成する

GitHub ActionsからAWS CLIを実行したいので、AWSの認証情報が必要です。

OIDCプロバイダーを利用して認証情報を取得したいので、事前準備としてご利用のAWSアカウントでIAM IDプロバイダーおよびIAMロールを作成しておきます。

詳細については、下記の記事などをご参照ください。

準備2: GitHubリポジトリにSecretsを追加する

GitHubリポジトリのSettingsから秘匿情報をSecretsとして登録することで、GitHub ActionsのWorkflowから暗号化された環境変数として参照することができます。

セキュリティポリシーによっては下記の情報が秘匿情報になり得るかと思いますので、Secretsとして登録しておきます。

  • AWS_ROLE_ARN: 上述の「準備1」で作成したIAMロールのARN
  • SLACK_WEBHOOK_URL: 通知先となるSlackチャンネルのWebhook URL

SlackチャンネルのWebhook URLを作成・確認する方法については、下記の記事などをご参照ください。

作成したWorkflow

今回作成したWorkflowは下記の通りです。東京リージョンでR6iインスタンスタイプが3AZサポートされたときに、Slackチャンネルに通知されるようにしました。

目的のリージョンやインスタンスタイプにあわせて、AWS CLIのコマンドを実行している箇所について--region--filtersの指定を変更してご利用ください。

.github/workflows/check-supported-az.yml

name: "check_supported_az"

on:
  schedule:
    - cron: '0 0 * * 1-5'
  workflow_dispatch:

jobs:
  check_supported_az:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: aws-actions/configure-aws-credentials@master
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          role-session-name: check-supported-az-session
          aws-region: ap-northeast-1
      - run: |
          result=(`aws ec2 describe-instance-type-offerings --location-type availability-zone-id --region ap-northeast-1 --filters Name=instance-type,Values=r6i.large --query 'sort(InstanceTypeOfferings[*].Location)' --output text`)
          echo ${result[@]}
          if [ ${#result[*]} -eq 2 ]; then
            echo 'R6iインスタンスタイプは東京リージョン(ap-northeast-1)ではまだ3AZ対応していません。'
          else
            echo 'R6iインスタンスタイプが東京リージョン(ap-northeast-1)で3AZ対応を開始しました。'
            curl -s -X POST -H 'Content-Type: application/json' --data "{\"text\": \"R6iインスタンスタイプが東京リージョン(ap-northeast-1)で3AZ対応を開始しました。\"}" ${{ secrets.SLACK_WEBHOOK_URL }}
          fi

AWSから提供されているActionであるaws-actions/configure-aws-credentialsを利用して、OIDCプロバイダー経由でIAMロールの認証情報を取得しています。

on.scheduleで、日本時間で平日の午前9時に定期的に実行されるように指定しています。また、on.workflow_dispatshを追加して手動での実行もできるようにしています。

また、AWS CLIのコマンド実行結果を元に、最終的にcurlコマンドを実行してSlackチャンネルのWebhook URLをコールしています。通知の文言は、シンプルにテキストを投げているだけです。ご利用の環境にあわせて、適宜修正の上ご利用いただけますと幸いです。

以上、prismatixのとばち(@toda_kk)でした。