LoginSignup
14
1

More than 1 year has passed since last update.


1. はじめに

エンジニアとしてAWSを利用していると、お客様(非エンジニア)とのギャップに気づくことが多々あります。
エンジニアとしては「コンソールから見れば済むのに」という内容も、お客様にとってはパラメータシートなど資料に起こして管理したいと思うこともあるようです。

今回は、サービス上限緩和の状況を一覧で取得しようと思います。
※プログラム歴が浅く、コード上の改善案があればコメント頂けると幸いです:sunny:

2. 本記事の内容

いくつかの参考記事をベースにPythonのBotoCoreを使い
サービス上限緩和の状況をJSON形式で一覧として取得します。

3. 実装内容

  1. list_services()APIを使い、サービスコード一覧作成
  2. 1.の結果をINPUTにしてlist_service_quotas()APIを使い、最新の上限緩和状況を取得
  3. 1.の結果をINPUTにしてlist_aws_default_service_quotas()APIを使い、デフォルトの上限緩和状況を取得
  4. 2.と3.の内容を抽出&結合し、一覧を作成

4. 参考

5. 実装

5-1. ソース

import boto3

region='ap-northeast-1'

result_quotas={'Quotas': []}

# サービスコード一覧作成
service_list = boto3.client('service-quotas', region_name=region).list_services()
tmp_result_service_list = service_list

if 'NextToken' in tmp_result_service_list:
    while 'NextToken' in tmp_result_service_list:
      next_token = tmp_result_service_list['NextToken']
      tmp_result_service_list = boto3.client('service-quotas', region_name=region).list_services(NextToken=next_token)
      service_list['Services'].extend(tmp_result_service_list['Services'])

# サービスクォータ一覧作成
for service_code in service_list['Services']:
    service_quotas = boto3.client(
        'service-quotas', 
        region_name=region
        ).list_service_quotas(
            ServiceCode=service_code['ServiceCode']
            )
    tmp_service_quotas = service_quotas
    if 'NextToken' in tmp_service_quotas:
        while 'NextToken' in tmp_service_quotas:
            next_token = tmp_service_quotas['NextToken']
            tmp_service_quotas = boto3.client(
                'service-quotas', 
                region_name=region
                ).list_service_quotas(
                    ServiceCode=service_code['ServiceCode'],
                    NextToken=next_token
                    )
            service_quotas['Quotas'].extend(tmp_service_quotas['Quotas'])
    result_quotas['Quotas'].extend(service_quotas['Quotas'])

# デフォルトサービスクォータ一覧作成
service_default_quotas = {}
result_default_quotas={'Quotas': []}
for service_code in service_list['Services']:
    service_default_quotas = boto3.client(
        'service-quotas', 
        region_name=region
        ).list_aws_default_service_quotas(
            ServiceCode=service_code['ServiceCode']
            )
    tmp_service_default_quotas = service_default_quotas
    if 'NextToken' in tmp_service_default_quotas:
        while 'NextToken' in tmp_service_default_quotas:
            next_token = tmp_service_default_quotas['NextToken']
            tmp_service_default_quotas = boto3.client(
                'service-quotas', 
                region_name=region
                ).list_aws_default_service_quotas(
                    ServiceCode=service_code['ServiceCode']
                    ,NextToken=next_token
                    )
            service_default_quotas['Quotas'].extend(tmp_service_default_quotas['Quotas'])
    result_default_quotas['Quotas'].extend(service_default_quotas['Quotas'])

# サービスクォータ一覧とデフォルトサービスクォータ一覧をマージ
for service_default_quota in result_default_quotas['Quotas']:
    for service_quota in result_quotas['Quotas']:
        num_quota = result_quotas['Quotas'].index(service_quota)
        if service_quota['QuotaCode'] == service_default_quota['QuotaCode']:
            result_quotas['Quotas'][num_quota]['DefaultValue'] = service_default_quota['Value']

with open('result_quotas.txt', 'a') as f:
    print(result_quotas, file=f)

5-2. サービス一覧結果イメージ

ServiceCodeは、Service-Quotas系APIにおいて、AWSサービスを分別するために使用されます。

{
    'NextToken': '***', 
    'Services': 
        [
            {
                'ServiceCode': 'AWSCloudMap', 
                'ServiceName': 'AWS Cloud Map'
            }, 
            {
                'ServiceCode': 'access-analyzer', 
                'ServiceName': 'Access Analyzer'
            }, 
            {
                'ServiceCode': 'acm', 
                'ServiceName': 'AWS Certificate Manager (ACM)'
            }, 
            {
~略~

5-3. 最新の上限緩和一覧 結果イメージ

QuotaCodeは、クォータひとつひとつに割り当てられている識別子です。
QuotaNameは、人間が理解しやすいクォータ名です。
Value は、実際に上限緩和されている値が取得されます。一度も上限緩和されていない場合はデフォルト値が取得されます。
Unit は、実態はNULLで取得されることが多いようです。
Adjustable は、調整可能なクォータかどうかがTRUE/FALSEで取得されます。
GlobalQuotaは、リージョンごとかグローバルのクォータかどうかがTRUE/FALSEで取得されます。
他にもレスポンス構造がありますが割愛します。

{
    'Quotas': 
        [
            {
                'ServiceCode': 'AWSCloudMap', 
                'ServiceName': 'AWS Cloud Map', 
                'QuotaArn': 'arn:aws:servicequotas:ap-northeast-1:***:AWSCloudMap/L-*', 
                'QuotaCode': 'L-*', 
                'QuotaName': 'DiscoverInstances operation per account burst rate', 
                'Value': 2000.0, 
                'Unit': 'None', 
                'Adjustable': True, 
                'GlobalQuota': False
            }, 
            {
~略~

5-4. デフォルトの上限緩和一覧 結果イメージ

5-3の差分のみ説明します。
Value は、デフォルトの上限値が取得されます。

{
    'Quotas': 
        [
            {
                'ServiceCode': 'AWSCloudMap', 
                'ServiceName': 'AWS Cloud Map', 
                'QuotaArn': 'arn:aws:servicequotas:ap-northeast-1:***:AWSCloudMap/L-*', 
                'QuotaCode': 'L-*', 
                'QuotaName': 'Custom attributes per instance', 
                'Value': 30.0, 
                'Unit': 'None', 
                'Adjustable': False, 
                'GlobalQuota': False
            }, 
            {
~略~

5-5. 最終結果イメージ

5-4のValueをDefaultValueと置き換えてマージしています。

{
    'Quotas': 
        [
            {
                'ServiceCode': 'AWSCloudMap', 
                'ServiceName': 'AWS Cloud Map', 
                'QuotaArn': 'arn:aws:servicequotas:ap-northeast-1:***:AWSCloudMap/L-*', 
                'QuotaCode': 'L-*', 
                'QuotaName': 'DiscoverInstances operation per account burst rate', 
                'Value': 2000.0, 
                'Unit': 'None', 
                'Adjustable': True, 
                'GlobalQuota': False, 
                'DefaultValue': 2000.0
            }, 
            {
~略~

6. まとめ

一回のAPI実行では全件取得できず、nextpagetokenを指定する様にループ処理を実装しないといけない点が初心者には難しかったです。

最終結果の項目数が1000件以上になるので、JSONファイルのままでは取り扱いしにくいと思います。
エクセルファイル化する処理を追加するなどして、より利用しやすくすると良いかもしれません。

14
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
1