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

まとめ

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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy