AWS Trusted Advisor から EoL を迎える Lambda ランタイム情報を AWS CLI で取得してみた

2024.05.08

Trusted Advisor に表示されている廃止されたランタイムを使用する AWS Lambda 関数の表になっている部分を AWS CLI で取得する機会がありました。AWS CLI から取得したい方のために成果物を共有します。アウトプットはマネージメントコンソールと同じ情報を CSV ファイルにしたものと、Markdown のテーブル形式に変換したファイルの 2 つです。

Trusted Advisor から EoL から迫る、すでにサポート切れの Lambda のランタイムを確認するメリットは、全リージョンの Lambda のランタイム情報をまとめて確認できる点ではないでしょうか。

マネージメントコンソールからの取得方法

最初に伝えたいことは AWS CLI を利用しなくてもマネージメントコンソールから右上のダウンロードボタンをクリックすると同じ情報を取得できます。

ダウンロードできたエクセルファイルを開くと、マネージメントコンソールに表示されている内容と同じ情報を取得できます。

ポチるだけで済ますのでこちらの方法もご検討ください。

AWS CLI で取得する方法

諸般の事情により AWS CLI から取得したくなりました。

準備

AWS Trusted Advisor API を利用します。サポートプランによる利用条件などは以下の記事をご確認ください。

当初は AWS CLI v1 のみサポートしていましたが、現在は AWS CLI v2 でも利用可能です。

$ aws --version
aws-cli/2.15.45 Python/3.11.9 Darwin/22.6.0 source/arm64 prompt/off

リージョンの指定は執筆時点ではap-northeast-1は非サポートのためus-east-1にしています。

$ export AWS_DEFAULT_REGION="us-east-1"
$ printenv AWS_DEFAULT_REGION
us-east-1

主に使用するのは以下のコマンドです。実行結果をjqでいい感じにしてファイルに保存する流れです。

$ aws trustedadvisor list-recommendations --pillar security --aws-service lambda
$ aws trustedadvisor get-recommendation --recommendation-identifier [上記コマンドで取得したARN]

サンプルスクリプト

廃止されたランタイムを使用する AWS Lambda 関数(AWS Lambda Functions Using Deprecated Runtimes)の結果に絞り ARN を取得し、詳細情報を取得できるコマンドに引き渡します。その実行結果からマネージメントコンソールの表示項目と同じ内容に絞り CSV ファイルとして保存します。CSV ファイルの内容を Markdown のテーブル形式に置き換えたファイルを作成します。

#!/bin/bash

# Constants
PILLAR="security"
AWS_SERVICE="lambda"
RECOMMENDATION_NAME="AWS Lambda Functions Using Deprecated Runtimes"
FILE_NAME="LambdaRuntimes"

# Functions
get_recommendation_arns() {
    aws trustedadvisor list-recommendations --pillar $PILLAR --aws-service $AWS_SERVICE | jq -r '.recommendationSummaries[] | select(.name == "'"$RECOMMENDATION_NAME"'") | .arn'
}

# Get the list of recommendation ARNs
arns=$(get_recommendation_arns)

# Check if arns is empty
if [ -z "$arns" ]; then
    echo "No recommendation ARNs found. Exiting."
    exit 0
fi

# Create an empty array to store the CSV file names
csv_files=()

# Iterate over each ARN
for arn in $arns; do
    # Extract the account ID and recommendation ID from the ARN
    account_id=$(echo $arn | cut -d':' -f5)
    recommendation_id=$(echo $arn | cut -d'/' -f2)

    # Generate the CSV file name in the desired format
    csv_file="${account_id}_TrustedAdvisor_${FILE_NAME}_${recommendation_id}.csv"

    # Run the AWS CLI command and process the output using jq, then save to the CSV file
    aws trustedadvisor list-recommendation-resources --recommendation-identifier $arn | jq -r '["ステータス", "リージョン", "関数ARN", "ランタイム", "非推奨となるまでの日数", "非推奨となる日", "1日あたりの平均呼び出し", "最終更新時刻"], (.recommendationResourceSummaries[] | [.metadata."0", .metadata."1", .metadata."2", .metadata."3", .metadata."4", .metadata."5", .metadata."6", .metadata."7"]) | @csv' > $csv_file

    # Add the CSV file name to the array
    csv_files+=($csv_file)
done

# Print the list of generated CSV files
echo "Generated CSV files:"
for file in "${csv_files[@]}"; do
    echo $file
done

# Convert each CSV file to a Markdown table and save as .md file
for csv_file in "${csv_files[@]}"; do
    # Generate the corresponding .md file name
    md_file="${csv_file%.csv}.md"

    # Write the Markdown table to the .md file
    echo "| $(head -n 1 $csv_file | sed 's/,/ | /g') |" | sed 's/"//g' > $md_file
    echo "| --- | --- | --- | --- | --- | --- | --- | --- |" >> $md_file
    tail -n +2 $csv_file | sed 's/,/ | /g' | sed 's/^/| /' | sed 's/$/  |/' | sed 's/"//g' >> $md_file

    echo "Markdown table Converted: $md_file"
done

実行結果

長いので全文は割愛しますが保存されたファイルを開くと以下の内容を確認できます。

CSV ファイル

CSV ファイルには以下の様な内容が保存されます。汎用性重視で保存するようにしました。

"ステータス","リージョン","関数ARN","ランタイム","非推奨となるまでの日数","非推奨となる日","1日あたりの平均呼び出し","最終更新時刻"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-devio-990e838f-15e1-428d-b044-f96fac09737b:$LATEST","nodejs12.x","-404","03/31/2023","0.0","2024-05-08T00:00:00.000Z"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-translate-api-3d3a1fb0-3d2b-4cd3-bbb5-c8e783a561a8:$LATEST","nodejs12.x","-404","03/31/2023","0.0","2024-05-08T00:00:00.000Z"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-devio-18c5dc4d-40d7-4610-b3b9-2f1a4d7e3980:$LATEST","nodejs12.x","-404","03/31/2023","0.0","2024-05-08T00:00:00.000Z"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:stopEC2instance:$LATEST","go1.x","-90","02/08/2024","0.0","2024-05-08T00:00:00.000Z"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:chatbottest:$LATEST","go1.x","-90","02/08/2024","0.0","2024-05-08T00:00:00.000Z"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-translate-api-d6470eaf-9403-4aaf-a4c4-ee92a0034633:$LATEST","nodejs12.x","-404","03/31/2023","0.0","2024-05-08T00:00:00.000Z"
"Red","ap-northeast-1","arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-infraya-bdfcd7df-532c-40a8-a5af-a0477d9c78e6:$LATEST","nodejs12.x","-404","03/31/2023","0.0","2024-05-08T00:00:00.000Z"

Markdown ファイル

Markdown ファイルの内容を貼り付けたものが以下です。基本的なコマンドだけで Markdown の表に変換しようと思えばできるものですね。

ステータス リージョン 関数ARN ランタイム 非推奨となるまでの日数 非推奨となる日 1日あたりの平均呼び出し 最終更新時刻
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-devio-990e838f-15e1-428d-b044-f96fac09737b:$LATEST nodejs12.x -404 03/31/2023 0.0 2024-05-08T00:00:00.000Z
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-translate-api-3d3a1fb0-3d2b-4cd3-bbb5-c8e783a561a8:$LATEST nodejs12.x -404 03/31/2023 0.0 2024-05-08T00:00:00.000Z
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-devio-18c5dc4d-40d7-4610-b3b9-2f1a4d7e3980:$LATEST nodejs12.x -404 03/31/2023 0.0 2024-05-08T00:00:00.000Z
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:stopEC2instance:$LATEST go1.x -90 02/08/2024 0.0 2024-05-08T00:00:00.000Z
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:chatbottest:$LATEST go1.x -90 02/08/2024 0.0 2024-05-08T00:00:00.000Z
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-translate-api-d6470eaf-9403-4aaf-a4c4-ee92a0034633:$LATEST nodejs12.x -404 03/31/2023 0.0 2024-05-08T00:00:00.000Z
Red ap-northeast-1 arn:aws:lambda:ap-northeast-1:123456789012:function:cwsyn-infraya-bdfcd7df-532c-40a8-a5af-a0477d9c78e6:$LATEST nodejs12.x -404 03/31/2023 0.0 2024-05-08T00:00:00.000Z

まとめ

Trusted Advisor に表示されている廃止されたランタイムを使用する AWS Lambda 関数の情報を、AWS CLI を使用して取得する方法について紹介しました。マネージメントコンソールからダウンロードする方法も紹介しましたが、AWS CLI を使用してシンプルな CSV ファイルと Markdown 形式のテーブルに変換したファイルも生成できました。

おわりに

他の Trusted Advisor の情報を取得する際にも応用できるのではないでしょうか。ヘッダーはマネージメントコンソールを見て人力入力したものなので応用するときはヘッダー修正してください。また、Markdown のテーブルの 2 行目(| --- | --- |)は決め打ちになっているので、ヘッダーのカラム数にあわせて調整してください。

CSV から Markdown のテーブル変換は基本的なコマンドだけで実現したく、Claude 3 Opus さんに相談したところ良い感じのコードを提案してくれました。修正は必要でしたが、私は微調整するだけのお仕事となり生成 AI さんと共に生きようと思いました。