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