dullwhaleのメモ帳

何度も同じことを調べなくてよいように...

Node.jsのLambdaを棚卸ししたい

複数のAWSアカウントについて複数のリージョンでNode.jsを使っているLambdaリソースを確認したい事態が発生した。 原因はNode.jsランライムのAWS上でのサポート終了である。 1つのAWSアカウントだけなら、以前メモしたコマンドスニペットで良いが、アカウントが多いと面倒だ。

Lambda棚卸し - dullwhaleのメモ帳

シェルスクリプト作った。 そのうちGitHubにあげるかもしれない。

node-lambda-check.sh

#!/bin/bash
set -euo pipefail

IFS=',' read -ra REGIONS <<< "$1"

# リージョンごとにコマンドを実行
for REGION in "${REGIONS[@]}" ; do
    # 関数の全バージョンを列挙
    while read -r ARN ARCH RUNTIME ; do
        [[ -z $ARN ]] && continue
        ARN_ELEMENT=(${ARN//\:/ })
        AWS_ACCOUNT="${ARN_ELEMENT[4]}"
        NAME="${ARN_ELEMENT[6]}"
        VERSION="${ARN_ELEMENT[7]}"

        echo -e "$ARN\tfunction\t$NAME\t$VERSION\t$ARCH\t$RUNTIME\t$AWS_ACCOUNT\t$REGION"
    done <<< "$(
        aws lambda list-functions --region "$REGION" --query 'Functions[]' | \
        jq --monochrome-output '.[] | select((.Runtime != null) and  (.Runtime | test("^nodejs"))) | .FunctionArn' |  \
        xargs -I {} aws lambda list-versions-by-function --region "$REGION" --function-name {} | \
        jq --raw-output '.Versions[] | [.FunctionArn, (.Architectures | flatten[]), .Runtime] | @tsv'
    )"

    # レイヤの全バージョンを列挙
    while read -r ARN RUNTIME ; do
        [[ -z $ARN ]] && continue
        ARN_ELEMENT=(${ARN//\:/ })
        AWS_ACCOUNT="${ARN_ELEMENT[4]}"
        NAME="${ARN_ELEMENT[6]}"
        VERSION="${ARN_ELEMENT[7]}"

        echo -e "$ARN\tlayer\t$NAME\t$VERSION\tNONE\t$RUNTIME\t$AWS_ACCOUNT\t$REGION"
    done <<< "$(
        aws lambda list-layers --region "$REGION" --query 'Layers[*].LatestMatchingVersion' | \
        jq --monochrome-output '.[] | select(.CompatibleRuntimes[] | test("^nodejs")) | .LayerVersionArn' | \
        cut -d: -f7 | \
        xargs -I {} aws lambda list-layer-versions --region "$REGION" --layer-name {} | \
        jq --raw-output '.LayerVersions[] | [.LayerVersionArn, (.CompatibleRuntimes | flatten[])] | @tsv'
    )"
done

使い方

./node-lambda-check.sh リソースをチェックしたいリージョンをカンマ区切りで指定

./node-lambda-check.sh us-east-1,ap-northeast-1