この記事は公開されてから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ロールのARNSLACK_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)でした。