API Gateway의 설정 정보를 lambda(python + boto3)로 취득했을 때의 메모

소개



AWS API Gateway 설계서를 만들게 되었고, 화면을 보면서 설정값을 복사하고 있으면 의식이 없어져 좌절했기 때문에, lambda로 취득한 json을 설계서라고 하기로 했습니다

공식 자료에서는 어느 것이 어느 설정인지 알기 어렵고, qiita에도 없는 것 같기 때문에 스스로 때문에 1개 1개 조사했습니다
htps : // 보토 3. 아마조나 ws. 코 m/v1/도쿠멘들 온/아피/ㅁ st/레후 렌세/세르ゔぃ세 s/아피가테와 y. HTML #C

※APIGatewayV2를 알아차리는 것이 늦었기 때문에 APIGateway로 만들고 있습니다

여기 계속됩니다
AWS S3의 설정 정보를 lambda(python + boto3)로 취득했을 때의 메모
htps : // 이 m/ぅ나 r_수 rd3/이고 ms/5df4122d797b23이다79

본문



설정 정보 취득에 이용한 메소드 리스트



모든 인수는 버킷 이름입니다.

import boto3
client = boto3.client('apigateway', region)



메소드 이름
설명


get_rest_apis()
API 목록 얻기

get_resources(restApiId=restApiId)
리소스 정보 얻기 restoApiId get_rest_apis

client.get_method(restApiId=restApiId, resourceId=resourceId, httpMethod=httpMethod)
메소드의 정보를 얻는 restApiId, resourceId, httpMethod는 get_resources

get_stages(restApiId=restApiId)
스테이지에 대한 정보를 얻기 위해 restApiId get_rest_apis


코드



코코

show-APIGateway-setting.py
# API Gatewayの設計書用の設定情報取得lambda
# テストで実行した結果が取得情報になる

import json
import boto3
from datetime import date, datetime, timedelta

# 設定
# リージョン

region_list = [
    "us-east-1",
    "us-east-2",
    "us-west-1",
    "us-west-2",
    "ca-central-1",
    "eu-central-1",
    "eu-west-1",
    "eu-west-2",
    "eu-west-3",
    "ap-northeast-1",
    "ap-northeast-2",
    #  "ap-northeast-3", #ないっぽい
    "ap-southeast-1",
    "ap-southeast-2",
    "ap-south-1",
    "sa-east-1"
]


def lambda_handler(event, context):
    region_lambda_list = []

    #リージョンごとに取得
    for region in region_list:
        client = boto3.client('apigateway', region)

        # API Gatewayのリストを取得
        responce = {}
        responce = client.get_rest_apis()

        restApi_items = responce['items']

        for idx, restApi in enumerate(restApi_items):
            res_resources = {}
            res_stages = {}

            # api id
            restApiId = restApi['id']
            # リソースの情報を取得
            res_resources = client.get_resources(restApiId=restApiId)
            res_resources_items = res_resources['items']

            # メソッドの情報を取得
            for idxr, res_resources_item in enumerate(res_resources_items):
                resourceId = res_resources_item['id']
                # methodがあれば情報取得
                if ('resourceMethods' in res_resources_item):
                    for httpMethod in res_resources_item['resourceMethods'].keys():
                        res_method = client.get_method(
                            restApiId=restApiId,
                            resourceId=resourceId,
                            httpMethod=httpMethod
                        )

                        # メソッドごとに情報をまとめる
                        res_resources['items'][idxr]['resourceMethods'][httpMethod]['response_method'] = res_method
            # リソースごとに情報をまとめる
            responce['items'][idx]['resources'] = res_resources

            # ステージの情報を取得
            res_stages = client.get_stages(restApiId=restApiId)
            for idxs,stageItem in enumerate(res_stages['item']):
                res_stage = client.get_stage(
                    restApiId=restApiId,
                    stageName=stageItem['stageName']
                )
                res_stages['item'][idxs]['stage_info']=res_stage
            # ステージごとに情報をまとめる
            responce['items'][idx]['stages'] = res_stages

        region_lambda_list.append({region: responce})

    return json.dumps(region_lambda_list, default=json_serial)


def json_serial(obj):
    if isinstance(obj, (datetime, date)):
        # 時差の修正9時間
        obj = obj - timedelta(hours=-9)
        return obj.strftime('%Y/%m/%d %H:%M')
    raise TypeError("Type %s not serializable" % type(obj))




결론



이제 설계 문서를 최신화하는 것이 매우 쉬워졌습니다
그리고 같은 API Gateway 만드는 것도 이 값과 boto3의 메소드 사용해 만들 수 있을 것・・・

남았으면 하고 싶은 예정
cloudfront의 설정 정보를 lambda(python + boto3)로 취득했을 때의 메모
lambda의 설정 정보를 lambda(python + boto3)로 취득했을 때의 메모

좋은 웹페이지 즐겨찾기