👏

特定ランタイムを使用した Lambda バージョンの一括削除

2023/03/04に公開

これは何

サポート終了したランタイムを使用している Lambda バージョンがあったのでそれを一括削除するスクリプト

対応している Security Hub のルール

Lambda functions should use supported runtimes

[Lambda.2] This AWS control checks that the lambda function settings for runtimes, match the expected values set for the supported runtimes for each language. The supported runtimes this control checks for are: nodejs18.x, nodejs16.x, nodejs14.x, nodejs12.x, python3.8, python3.7, java11, java8, go1.x, dotnet6, dotnetcore3.1, ruby2.7

コード

削除するバージョンが含まれる関数名を指定して実行する
※ここも Security Hub 等から自動取得するようにすれば全自動でいける

import boto3

client = boto3.client('lambda')
target = ""  # 削除する関数名
def lambda_handler(event, context):

    re = client.list_versions_by_function(
        FunctionName=target,
        MaxItems=1000
        )
    versions = re['Versions']
    for i in versions:
        print(i["Version"])
        print(i["Runtime"])
        if i['Runtime'] == "python3.6":  # 削除するランタイムバーゲン
            response = client.delete_function(
                FunctionName=target,
                Qualifier=i['Version']
            )
            print(response)

おまけ(特定ランタイム以外の関数名の取得

判定している場所を反転させることで特定ランタイムを使用している関数名の取得も可能

import boto3

client = boto3.client('lambda')
def lambda_handler(event, context):

    response = client.list_functions(
        MaxItems=1000
    )
    functions = response['Functions']
    for i in functions:
        #print(i['FunctionName'])        
        #print(i['Runtime'])
        #print(i['Version'])
        versions = client.list_versions_by_function(
            FunctionName=i['FunctionName'],
            MaxItems=1000
        )
        versions_list = versions['Versions']
        for j in versions_list:
            if j['Runtime'] in ["python3.7", "python3.8", "python3.9", "python3.10"]:
                continue
            print(j['FunctionName'])
            print(j['Version'])

Discussion