2023年末にサポート終了となるprovidedランタイムを利用しているAWS Lambda関数をprovided.al2に移行しました

あえて書くほどのものではないがAmazon Linux 2のEOLの時にもまた忘れていると思うので備忘録として
2023.08.29

初めに

いつも通りメールをチェックしていたところAmazon Linux 1のサポート終了が近いのでAWS Lambdaでそれを利用している関数に対応が必要な旨のメールが来ていました。

お客様のAWSカウントに現在、Amazon Linux 1 ('provided') ランタイムに基づくカスタムランタイムを使用する 1 つ以上の Lambda 関数があることを確認しましたので、ご連絡をいたします。

2023 年 12 月 31 日 の Amazon Linux AMI のメンテナンスサポート終了に合わせ、AWS Lambda での Amazon Linux 1 に基づくカスタムランタイムのサポートを終了します [1]。

Lambda ランタイムサポートポリシー [2] の説明の通り、Lambda の言語ランタイムのサポートの終了は 2 段階で行われます。2023 年 12 月 31 日以降、Lambda は Lambda 関数が使用する Amazon Linux 1 ランタイムに基づくカスタムランタイムに、セキュリティパッチやその他の更新を適用しなくなり、Amazon Linux 1 に基づくカスタムランタイムを使用する関数はテクニカルサポートの対象ではなくなります。 また、Amazon Linux 1 ランタイムに基づくカスタムランタイムを使用して新しい Lambda 関数を作成することもできなくなります。2024 年 1 月 30 日以降、Amazon Linux 1 ランタイムに基づくカスタムランタイムを使用して既存の関数を更新することができなくなります。

2023 年 12 月 31 日までに、既存のAmazon Linux 1 基づくカスタムランタイムの関数について Amazon Linux 2 に基づくカスタムランタイム ('provided.al2') にアップグレードすることを推奨いたします。

サポート終了は関数の実行には影響しません。関数は引き続き実行されます。ただし、サポートされていないランタイムで実行されるため、AWS Lambda チームによるメンテナンスやパッチの適用は行われません。

この通知は、$LATEST 関数バージョンの Amazon Linux 1 に基づくカスタムランタイムを使用する関数に対して生成されます。影響を受けるリソースのリストは、AWS Health Dashboard の[影響を受けるリソース](Affected resources) タブからご確認いただけます。 次のコマンドは、AWS CLI [3] を使用して、特定のリージョンのAmazon Linux 1 に基づくカスタムランタイムを使用しているすべての関数 (公開されている関数バージョンを含む) を一覧表示する方法を示しています。アカウント内のこのような機能をすべて確認するには、リージョンごとに次のコマンドを繰り返します。

aws lambda list-functions --function-version ALL --region us-east-1 --output text --query "Functions[?Runtime=='provided'].FunctionArn"

記載によるとサポート終了となる2023/12/31時点で移行されていない場合でも引き続き関数の実行可能であり最終的に実行されなくなるタイミングについては言及されていませんが、急に実行できなくのも困るので今のうちに対応しておきます。

今回移行対象について

今回移行する対象はRust製のプログラムが稼働しているカスタムランタイム関数の移行を行います。

最終的なデプロイはSAMで行っておりますがコンパイル自体はMac環境上で直接クロスコンパイルしています。
当時は以下の記事を参考に手探りでやってた記憶があります。

背景として当時(2020/05)はAWS Lambdaのコンテナサポートがなく(2020/12リリース)、Amazon Linux 2も対応していない(2020/08リリース)状況のためAmazon Linux 1ベースのカスタムランタイムで動かすしかなかったというものがあります。


※ 関数側のスクショを撮る前に触ってしまって最終変更日が変わってしまったのでスタック側を写していますが3年ちょっと放置していたようです。

対象を見つける

対象の関数にはAWS CLIを使って探します。
基本はメール記載の内容で問題ないのですが全リージョンまとめて探せるようにしておきます。

for region in `aws ec2 describe-regions | jq -r ".Regions[].RegionName"`; do
    aws lambda list-functions --function-version ALL --region ${region} --output text --query "Functions[?Runtime=='provided'].FunctionArn"
done

今回は1つだけでした。

arn:aws:lambda:ap-northeast-1:xxxxxx:function:ChangeXXXX:$LATEST

対応

実行しているコードの内容による部分はありますがAmazon Linux 1イメージ固有に依存しているものがなければ(/etc/os-releaseの内容を参照している等)ランタイム設定を変更するのみで対応可能です。

マネジメントコンソールから対応

AWS Lambdaの関数一覧からCustom Runtimeになっている対象を選択します。

詳細の「ランタイム設定」の「編集」に移動します。

「Amazon Linux 2でのカスタムランタイム」を選択し「保存」します。

Custom runtime on Amazon Linux 2となっていることが確認できました。必要に応じて関数のテストを実行して動作確認はしておきましょう。

コンパイルターゲット自体はどちらもx86_64-unknown-linux-muslで問題ないようなので自分の環境では再コンパイル等は不要でした。

AWS SAM CLIから

上記の変更をテンプレート上で行います。

Runtimeの値をprovided.al2に変更すればOKです。

Resources:
  ChangeXXXProject:
    Type: "AWS::Serverless::Function"
    Properties:
      Timeout: 60
      FunctionName: ChangeXXX
      Handler: main
-     Runtime: provided
+     Runtime: provided.al2
      CodeUri: ./rust.zip
      Events:
        ...

変更後は通常通りsam buildsam deployを行えばOKです。

自分の環境では長らく触っていなくて実行バイナリを飛ばしてしまったので別途Rust側のビルド(cargo build)を実行しました。

終わりに

今回は昔作成したAWS Lambda関数の移行作業を行いました。

実のところ自分がAWS触り始めた時にはすでにAmazon Linux 2が主流で、カスタムランタイムも当時はprovidedしかなかったので通知が来てAmazon Linux 1ベースだったのかというのに気づきました。

今回ベースOSのイメージが変わるような変更であってもAWS Lambda関数側としては特別な対応が必要なわけではなく通常通りランタイムの再選択対応のみで可能です。
ただプログラムの内容によってはそちらの対応が必要なものもあるかと思いますので切り戻しができる今のうちに対応しておくのが好ましいものかと思います。

Amazon Linux 2のEOLが2025/06/30ですでに2年を切っているのでできればAmazon Linux 2023ベースのイメージに乗り換えたいところですが現時点ではまだカスタムランタイムとしてサポートされていないので、デッドラインを決めて限界まで待つかAmazon Linux 2に早めに移行してしまうかも考えておきましょう。

管理コストが上がるので難しいところですがいっそのことコンテナデプロイにして予めAmazon Linux 2023ベースに合わせておくのも1つの手段かもしれません。