AWS Organizations 未導入のマルチアカウント環境でマネジメントコンソールに入らずに Service Quotas のクォータをシュッと確認できたらちょっと便利かも?と思って(あくまでアイデアとして),検証も兼ねて AWS SDK for Python (Boto3) と GitHub Actions でマルチアカウントのクォータ一覧を出力する仕組みを作ってみた💪
もちろん AWS Well-Architected Framework (Reliability Pillar) の REL01-BP05 で Tracking the quotas and usage in spreadsheets.
というアンチパターンも紹介されていて,クォータを一覧するだけでは微妙なのは理解しつつも,クォータを IaC (Infrastructure as Code) で管理できてなく,マネジメントコンソールでクォータリクエストを送っているなら,クォータを把握しやすくて意外と便利という可能性もあるかな〜と💡
そもそも AWS CloudFormation (と AWS CDK) で Service Quotas をサポートしてくれれば IaC で管理しやすくなって,今回検証した仕組みも不要になるんだけどな〜とも思うから頼む🙏
👾 main.py
AWS SDK for Python (Boto3) で Service Quotas のクォータを取得する場合は list_service_quotas()
関数(サービスコード指定)と get_service_quota()
関数(サービスコードとクォータコード指定)がある.今回はどちらも試してみたく,サンプルとして AWS Lambda はサービスコード lambda
を指定して,AWS CloudFormation はサービスコード cloudformation
とクォータコード L-0485CB21 (Stack count)
を指定した.
そして python-tabulate を使って Markdown の表形式でクォータ一覧を出力できるようにした📈
import boto3 from tabulate import tabulate applied_quotas = [] def main(): client = boto3.client('service-quotas', region_name='ap-northeast-1') append_quotas(client.list_service_quotas(ServiceCode='lambda')) append_quotas(client.get_service_quota(ServiceCode='cloudformation', QuotaCode='L-0485CB21')) print(tabulate(applied_quotas, headers=headers(), tablefmt='github')) def headers(): return [ 'ServiceName', 'QuotaName', 'QuotaCode', 'Value', ] def append_quotas(response): if 'Quota' in response: # for get_service_quota() quotas = [response['Quota']] elif 'Quotas' in response: # for list_service_quotas() quotas = response['Quotas'] else: quotas = [] for quota in quotas: applied_quotas.append( [ quota['ServiceName'], quota['QuotaName'], quota['QuotaCode'], quota['Value'], ] ) if __name__ == '__main__': main()
👾 .github/workflows/quotas.yml
GitHub Actions ワークフローは以下のようにした.流れとしては AWS アカウント1で main.py
を実行して,AWS アカウント2で main.py
を実行している👌今回は Python プロジェクトを uv で管理しているため, setup-uv を使っているけど,普通に setup-python でも OK👌
そして ${GITHUB_STEP_SUMMARY}
に出力結果を流し込むと GitHub Actions にジョブサマリーとしてレポート化できる❗️
name: List Quotas on: workflow_dispatch: permissions: id-token: write contents: read jobs: list-quotas: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@v3 - name: Setup Python run: uv python install - name: Install dependencies run: uv sync - name: Set up AWS Credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: ${{ secrets.ACCOUNT1_AWS_ROLE_ARN }} aws-region: ap-northeast-1 - name: Run run: | echo "## Account: $(aws sts get-caller-identity | jq -r .Account) 🐶" >> ${GITHUB_STEP_SUMMARY} uv run main.py >> ${GITHUB_STEP_SUMMARY} - name: Set up AWS Credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: ${{ secrets.ACCOUNT2_AWS_ROLE_ARN }} aws-region: ap-northeast-1 - name: Run run: | echo "## Account: $(aws sts get-caller-identity | jq -r .Account) 🐱" >> ${GITHUB_STEP_SUMMARY} uv run main.py >> ${GITHUB_STEP_SUMMARY}
実行結果
個人用の AWS アカウント2つを使って GitHub Actions ワークフローを実行してみた.1つのアカウントは以下のブログ記事を書くときに AWS Lambda 関数のクォータ「同時実行数 (L-B99A9384)」を 1500 に変更していて,アカウント間の違いを確認できた👌
まとめ
クォータ管理のベストプラクティスとは異なるにしろ,アイデアの検証結果としてはイメージ通りにできて良かった👏