[小ネタ] Lambda関数で使用しているランタイムの種類とバージョンを全リージョンで一括チェックする (ランタイムのサポート終了に備えよう)

突然AWSから「Lambda関数ランタイムのサポート終了」メールが届いた! そんな時は、慌てず焦らず、まずは対象のLambda関数を確認しましょう。
2021.06.07

みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。

最近、AWSに登録しているメールアドレス宛てに

[要対応] AWS Lambda における Python 2.7 のサポート終了

とか

[Action Required] AWS Lambda end of support for Python 2.7

とかのタイトルのメールが届いた方は多いのではないでしょうか。

Lambdaで作成した関数は未来永劫使い続けることができる訳ではなく、作成した時に使用した「ランタイム」のサポートが終了する日がいつか訪れます。

ランタイムサポートポリシー - AWS Lambda」ページによると、記事執筆時 (2021年6月7日) 現在、以下のランタイムのサポート終了が予告されています。

  • Python 2.7
  • Ruby 2.5
  • Node.js 10.x

サポート終了の通知を受け取ったら、まずは、対象のLambda関数を把握することが必要です。

もし、大量のLambda関数を作成して運用していたり、複数リージョンで運用していたりする場合、マネジメントコンソールから確認しようとすると、ページの切り替えやリージョンの切り替えを何度も行わなければならなかったりして、対象のLambda関数を洗い出すのは一苦労です。

そこで、全リージョンの全Lambda関数を一発でリストアップするスクリプトを作ってみました。

Lambda関数ランタイム一括出力スクリプト

スクリプトの内容はこんな感じです。

list-lambda-function-all-regions.sh

#!/bin/bash

declare -a REGIONS=($(aws ec2 describe-regions --output text --query "sort(Regions[].RegionName)"))

for REGION in "${REGIONS[@]}"
do
  echo "${REGION}:"
  aws lambda list-functions --region ${REGION} --output table --query "sort_by(Functions[].{Name:FunctionName,Runtime:Runtime},&Name)"
done

スクリプトを実行すると、こんな感じで出力されます。

$ ./list-lambda-function-all-regions.sh
ap-northeast-1:
-------------------------------------------
|              ListFunctions              |
+--------------------------+--------------+
|           Name           |   Runtime    |
+--------------------------+--------------+
|  nodejs10-function-tokyo |  nodejs10.x  |
|  nodejs12-function-tokyo |  nodejs14.x  |
|  python27-function-tokyo |  python2.7   |
|  python36-function-tokyo |  python3.6   |
|  ruby25-function-tokyo   |  ruby2.5     |
|  ruby27-function-tokyo   |  ruby2.7     |
+--------------------------+--------------+
ap-northeast-2:
ap-northeast-3:
-------------------------------------------
|              ListFunctions              |
+--------------------------+--------------+
|           Name           |   Runtime    |
+--------------------------+--------------+
|  nodejs10-function-osaka |  nodejs10.x  |
|  nodejs12-function-osaka |  nodejs12.x  |
|  python27-function-osaka |  python2.7   |
|  python36-function-osaka |  python3.6   |
|  ruby25-function-osaka   |  ruby2.5     |
|  ruby27-function-osaka   |  ruby2.7     |
+--------------------------+--------------+
ap-south-1:
ap-southeast-1:
ap-southeast-2:
ca-central-1:
eu-central-1:
eu-north-1:
eu-west-1:
eu-west-2:
eu-west-3:
sa-east-1:
us-east-1:
----------------------------------------------
|                ListFunctions               |
+-----------------------------+--------------+
|            Name             |   Runtime    |
+-----------------------------+--------------+
|  nodejs10-function-virginia |  nodejs10.x  |
|  nodejs12-function-virginia |  nodejs14.x  |
|  python27-function-virginia |  python2.7   |
|  python36-function-virginia |  python3.6   |
|  ruby25-function-virginia   |  ruby2.5     |
|  ruby27-function-virginia   |  ruby2.7     |
+-----------------------------+--------------+
us-east-2:
us-west-1:
us-west-2:

スクリプトの解説

解説するほどのスクリプトではありませんが、一応解説しておきます。

まず、冒頭のこの部分でAWSの全リージョンを取得して配列変数に格納します。

declare -a REGIONS=($(aws ec2 describe-regions --output text --query "sort(Regions[].RegionName)"))

aws ec2 describe-regionsコマンドをオプションを付けずに実行すると、以下のように出力されます。

$ aws ec2 describe-regions
{
    "Regions": [
        {
            "Endpoint": "ec2.eu-north-1.amazonaws.com",
            "RegionName": "eu-north-1",
            "OptInStatus": "opt-in-not-required"
        },
        {
            "Endpoint": "ec2.ap-south-1.amazonaws.com",
            "RegionName": "ap-south-1",
            "OptInStatus": "opt-in-not-required"
        },
・・・
        {
            "Endpoint": "ec2.us-west-2.amazonaws.com",
            "RegionName": "us-west-2",
            "OptInStatus": "opt-in-not-required"
        }
    ]
}

OptInStatusはリージョンの「オプトイン」に関するステータスで、以下の種類があります。

opt-in-not-required オプトイン不要でデフォルトで利用可能なリージョン
(ap-northeast-1やus-east-1など)
not-opted-in オプトインが必要で、まだオプトインしていないリージョン
(ap-east-1(香港)やeu-south-1(ミラノ)など)
opted-in オプトインが必要で、オプトインを行ったリージョン

aws ec2 describe-regionsコマンドをオプションを付けずに実行した場合に出力されるのは、ステータスがopt-in-not-requiredまたはopted-inであるもの、すなわち「このAWSアカウントで利用可能なリージョン」のみが出力されます。

なお、aws ec2 describe-regionsコマンドに--all-regionsオプションを付けて実行するとステータスがnot-opted-inであるものを含めて全てのリージョンが出力されます。 (今回は、利用可能でないリージョンについて調べる意味が無いので、オプションは付けません)

今回のスクリプトでは、出力フォーマットをtext形式にした上で、出力結果をRegions[].RegionNameでフィルタリングしてリージョン名のみ抽出し、sort()で並び替えています。 そうして得られた結果をdeclare -aコマンドで配列変数に格納しています。

次に、for文を使って配列変数REGIONSに格納されたリージョン名を一つずつ取り出して、繰り返し処理を行います。

for REGION in "${REGIONS[@]}"
do
  echo "${REGION}:"
  aws lambda list-functions --region ${REGION} --output table --query "sort_by(Functions[].{Name:FunctionName,Runtime:Runtime},&Name)"
done

aws lambda list-functionsコマンドに--regionオプションを付けて実行することで、指定したリージョンの全Lambda関数を出力します。 出力フォーマットはtable形式にしていますが、好みで他の形式を指定してもよいでしょう。 出力する項目もシンプルに「関数名」「ランタイム」のみとしていますので、必要に応じて変えてみてください。

対象Lambda関数を確認した後は・・・

AWSの案内に従って、ランタイムの移行など必要な対応を行いましょう。

「Python 2.7」のサポート終了については、下記の記事が参考になると思います。

ということで、「Lambda関数ランタイムのサポート終了」メールが届いたら、今回のスクリプトを使って時間を掛けずに対象Lambda関数をチェックしましょう!