kakakakakku blog

Weekly Tech Blog: Keep on Learning!

GitHub Actions のジョブサマリーに Service Quotas のクォータ一覧を出力する

AWS Organizations 未導入のマルチアカウント環境でマネジメントコンソールに入らずに Service Quotas のクォータをシュッと確認できたらちょっと便利かも?と思って(あくまでアイデアとして),検証も兼ねて AWS SDK for Python (Boto3) と GitHub Actions でマルチアカウントのクォータ一覧を出力する仕組みを作ってみた💪

もちろん AWS Well-Architected Framework (Reliability Pillar) の REL01-BP05Tracking the quotas and usage in spreadsheets. というアンチパターンも紹介されていて,クォータを一覧するだけでは微妙なのは理解しつつも,クォータを IaC (Infrastructure as Code) で管理できてなく,マネジメントコンソールでクォータリクエストを送っているなら,クォータを把握しやすくて意外と便利という可能性もあるかな〜と💡

docs.aws.amazon.com

そもそも AWS CloudFormation (と AWS CDK) で Service Quotas をサポートしてくれれば IaC で管理しやすくなって,今回検証した仕組みも不要になるんだけどな〜とも思うから頼む🙏

github.com

👾 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) を指定した.

boto3.amazonaws.com

boto3.amazonaws.com

そして python-tabulate を使って Markdown の表形式でクォータ一覧を出力できるようにした📈

github.com

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 にジョブサマリーとしてレポート化できる❗️

docs.github.com

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 に変更していて,アカウント間の違いを確認できた👌

kakakakakku.hatenablog.com

まとめ

クォータ管理のベストプラクティスとは異なるにしろ,アイデアの検証結果としてはイメージ通りにできて良かった👏